小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

BLE開發(fā)(TI CC254x)之協(xié)議棧分析

 iamlijin 2019-08-16

TI 系列的藍(lán)牙芯片在協(xié)議棧支持上比較完善,最近使用CC254x系列BLE芯片,發(fā)現(xiàn)其協(xié)議棧的實(shí)現(xiàn)挺有意思,這里做點(diǎn)簡(jiǎn)單分析。

1.協(xié)議棧結(jié)構(gòu)

CC2540 集成了增強(qiáng)型的 8051 內(nèi)核, TI 為 BLE 協(xié)議棧搭建了一個(gè)簡(jiǎn)單的操作系統(tǒng)OSAL,即一種任務(wù)輪詢機(jī)制。幫你做好了底層和藍(lán)牙協(xié)議深層的內(nèi)容,將復(fù)雜部分屏蔽掉。讓用戶通過(guò) API 函數(shù)就可以輕易用藍(lán)牙 4.0,是開發(fā)起來(lái)更加方便,開發(fā)周期也可以相應(yīng)縮短。 

安裝完 BLE 協(xié)議棧之后,會(huì)在安裝目錄下看到以下文件結(jié)構(gòu):


其中,Accessories存放附件,如:USB驅(qū)動(dòng)和hex文件。Components即為OSAL操作系統(tǒng)的底層實(shí)現(xiàn),里面包括OSAL的各層具體實(shí)現(xiàn)。

Documents為協(xié)議棧相關(guān)說(shuō)明文檔,Projects為官方提供的demos,很多demo都是可以直接修改使用的,其中重點(diǎn)關(guān)心四個(gè)demo:

SimpleBLEBroadcaster、SimpleBLECentral、SimpleBLEObserver、SimpleBLEPeripheral。 
這四個(gè)代碼是CC254x開發(fā)的基本模板,他們都有自己的特點(diǎn)。 
· Broadcaster 廣播員 —— 非連接性的信號(hào)裝置 
· Observer 觀察者    —— 掃描得到,但不能鏈接 
· Peripheral 從機(jī)    —— 可鏈接,在單個(gè)鏈路層鏈接中作為從機(jī) 
· Central 主機(jī)   —— 掃描設(shè)備并發(fā)起鏈接,在單鏈路層或多鏈路層中作為主機(jī)。

2.協(xié)議棧OSAL原理分析

協(xié)議棧中所謂的OSAL就是一個(gè)小型的操作系統(tǒng),實(shí)現(xiàn)了最基本的任務(wù)輪詢。

直接從main函數(shù)開始解剖:

  1. int main(void)
  2. {
  3. /* Initialize hardware */
  4. HAL_BOARD_INIT();
  5. // Initialize board I/O
  6. InitBoard( OB_COLD );
  7. /* Initialze the HAL driver */
  8. HalDriverInit();
  9. /* Initialize NV system */
  10. osal_snv_init();
  11. /* Initialize LL */
  12. /* Initialize the operating system */
  13. osal_init_system();
  14. /* Enable interrupts */
  15. HAL_ENABLE_INTERRUPTS();
  16. // Final board initialization
  17. InitBoard( OB_READY );
  18. #if defined ( POWER_SAVING )
  19. osal_pwrmgr_device( PWRMGR_BATTERY );
  20. #endif
  21. /* Start OSAL */
  22. osal_start_system(); // No Return from here
  23. return 0;
  24. }
主函數(shù)一進(jìn)去就是各種系統(tǒng)初始化:包括硬件、GATT、 GAP 層、任務(wù)等的初始化。然后執(zhí)行 osal_start_system();操作系統(tǒng)。我們重點(diǎn)關(guān)心2 個(gè)函數(shù):
初始化操作系統(tǒng) 
osal_init_system(); 
運(yùn)行操作系統(tǒng) 
osal_start_system(); 

        我們先來(lái)看 osal_init_system();系統(tǒng)初始化函數(shù),進(jìn)入函數(shù)。發(fā)現(xiàn)里面有 6個(gè)初始化函數(shù),這里我們只關(guān)心osalInitTasks();任務(wù)初始化函數(shù)。繼續(xù)由該函數(shù)進(jìn)入,進(jìn)入后發(fā)現(xiàn)終于看到各層任務(wù)的添加,taskID 依次遞增表示優(yōu)先級(jí)降低,即越底層優(yōu)先級(jí)越高(LL、HAL、HCI、L2CAP、GAP、GATT、SM、Profiles、Application)

  1. void osalInitTasks( void )
  2. {
  3. uint8 taskID = 0;
  4. tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  5. osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
  6. /* LL Task */
  7. LL_Init( taskID++ );
  8. /* Hal Task */
  9. Hal_Init( taskID++ );
  10. /* HCI Task */
  11. HCI_Init( taskID++ );
  12. #if defined ( OSAL_CBTIMER_NUM_TASKS )
  13. /* Callback Timer Tasks */
  14. osal_CbTimerInit( taskID );
  15. taskID += OSAL_CBTIMER_NUM_TASKS;
  16. #endif
  17. /* L2CAP Task */
  18. L2CAP_Init( taskID++ );
  19. /* GAP Task */
  20. GAP_Init( taskID++ );
  21. /* GATT Task */
  22. GATT_Init( taskID++ );
  23. /* SM Task */
  24. SM_Init( taskID++ );
  25. /* Profiles */
  26. GAPCentralRole_Init( taskID++ );
  27. GAPBondMgr_Init( taskID++ );
  28. GATTServApp_Init( taskID++ );
  29. /* Application */
  30. SimpleBLECentral_Init( taskID );
  31. }
最高層即應(yīng)用層優(yōu)先級(jí)最低,最后執(zhí)行應(yīng)用層的任務(wù)初始化。

 我們?cè)賮?lái)看第二個(gè)函數(shù) osal_start_system();運(yùn)行操作系統(tǒng)。同樣用 go to definition 的方法進(jìn)入該函數(shù)。再進(jìn)入 osal_run_system() ,我們欣喜地發(fā)現(xiàn)這里就是任務(wù)輪詢的基本輪廓,源碼和分析如下:

  1. void osal_run_system( void )
  2. {
  3. uint8 idx = 0;
  4. #ifndef HAL_BOARD_CC2538
  5. osalTimeUpdate();
  6. #endif
  7. Hal_ProcessPoll();
  8. //這段代碼掃描觸發(fā)的任務(wù)
  9. do {
  10. if (tasksEvents[idx]) //優(yōu)先級(jí)高的任務(wù)被置位,說(shuō)明有任務(wù)觸發(fā)
  11. {
  12. break;//跳出任務(wù)掃描,得到的idx即為任務(wù)ID!
  13. }
  14. } while (++idx < tasksCnt);//idx從0開始遞增,先查詢高優(yōu)先級(jí)的任務(wù)
  15. if (idx < tasksCnt)
  16. {
  17. uint16 events;
  18. halIntState_t intState;
  19. //然后進(jìn)入臨界保護(hù)區(qū),提取事件后清清除
  20. HAL_ENTER_CRITICAL_SECTION(intState);
  21. events = tasksEvents[idx];
  22. tasksEvents[idx] = 0; // 清除
  23. HAL_EXIT_CRITICAL_SECTION(intState);
  24. //然后通過(guò)函數(shù)指針調(diào)用對(duì)應(yīng)的任務(wù)處理函數(shù)
  25. activeTaskID = idx;
  26. events = (tasksArr[idx])( idx, events );
  27. activeTaskID = TASK_NO_TASK;
  28. //taskArr[]即為函數(shù)指針數(shù)組,存放所有定義好的處理任務(wù)函數(shù)的入口地址
  29. HAL_ENTER_CRITICAL_SECTION(intState);
  30. tasksEvents[idx] |= events; // 保存未處理的事件
  31. HAL_EXIT_CRITICAL_SECTION(intState);
  32. }
  33. #if defined( POWER_SAVING )//如果定義了節(jié)能模式
  34. else
  35. {
  36. osal_pwrmgr_powerconserve(); //進(jìn)入睡眠
  37. }
  38. #endif
  39. #if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0)
  40. {
  41. osal_task_yield();
  42. }
  43. #endif
  44. }
可見協(xié)議棧就是一個(gè)被稱為OSAL的小型操作系統(tǒng),基本流程如下:

各種初始化---運(yùn)行操作系統(tǒng)---有任務(wù)觸發(fā)---執(zhí)行任務(wù)

以上只是對(duì)協(xié)議棧OSAL系統(tǒng)的簡(jiǎn)單分析,關(guān)于藍(lán)牙通信的API 部分后文再續(xù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多