OSAL啟動過程分析
一、SimpleBLEBroadcaster OSAL啟動過程分析:
Main()
==> HAL_BOARD_INIT();//初始化硬體
==> InitBoard( OB_COLD );//初始化板卡IO
==> HalDriverInit(); //hal層驅動初始化
==> osal_snv_init();//初始化Flash
==> osal_init_system(); //初始化OSAL
===>osal_mem_init();//初始化記憶體分配系統
===>osal_qHead = NULL;//初始化訊息佇列
===>osalTimerInit();//初始化定時器
===>osal_pwrmgr_init();//初始化電源管理系統
===>osalInitTasks(); //初始化系統任務
===> 建立任務事件點陣圖記憶體 uint16 XXX[taskCnt] (tasksEvents 為uint16 *指標)
===>初始化任務ID taskID = 0;
===> LL_Init( taskID++ ); //鏈路層任務初始化;對應tasksArr[0]=LL_ProcessEvent()
===> Hal_Init( taskID++ ); //硬體抽象層 ;對應tasksArr[1]=Hal_ProcessEvent()
===> HCI_Init( taskID++ ); //主機控制器介面;對應tasksArr[2]=HCI_ProcessEvent()
===>osal_CbTimerInit(taskID); //定時器任務初始化; 對應tasksArr[3]=osal_CbTimerProcessEvent()
===> GAP_Init( taskID++ ); //通用訪問 配置檔案層 ;對應tasksArr[4]=GAP_ProcessEvent()
===> GAPRole_Init( taskID++ ); //通用屬性 配置檔案層;對應tasksArr[5]=GAPRole_ProcessEvent()
===>設定全域性變數gapRole_TaskID=task_id;
===> gapRole_state = GAPROLE_INIT; // 設定角色的狀態為 <等待被啟動>
//GAPROLE_STARTED<啟動但未廣播>、GAPROLE_ADVERTISING<當前正在廣播>、GAPROLE_WAITING<當前未廣播>、GAPROLE_ERROR<當前是無效的狀態>
===>GAP_RegisterForHCIMsgs() //註冊控制介面的任務ID
===>//初始化廣播配置檔案和連線引數
===>gapRole_profileRole = GAP_PROFILE_BROADCASTER;
// 設定裝置配置角色;為一種只發送廣播事件的裝置
===>gapRole_AdvEventType = GAP_ADTYPE_ADV_NONCONN_IND;
// 設定事件型別:為不可以被連線,不可以被掃描。
===>gapRole_AdvDirectType = ADDRTYPE_PUBLIC;
// 設定GAP地址型別:ADDRTYPE_PUBLIC
===>gapRole_AdvChanMap = GAP_ADVCHAN_ALL;
// 廣播頻道選擇(3個)GAP_ADVCHAN_ALL
===>gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL;
// 廣播過濾策略選擇;
===>simpleBLEBroadcaster_Init( taskID ); //應用層的初始化;對應tasksArr[6]=SimpleBLEBroadcaster_ProcessEvent()
===>//廣播的開啟/關閉
uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
===>// 無限期關閉廣播,直到廣播再次使能。
uint16 gapRole_AdvertOffTime = 0;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
===>// 設定廣播掃描響應資料
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
===>// 設定廣播資料
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( mb_advertData ), advertData );
===>// 設定廣播的型別為.
uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND; (不可被連線,可被掃描)
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );
===>// 廣播時間間隔設定;
uint16 advInt = DEFAULT_ADVERTISING_INTERVAL; (100ms)
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
===>// 如何定義了 CC2540_MINIDK 巨集,註冊所有的按鍵事件到本任務
RegisterForKeys( simpleBLEBroadcaster_TaskID );
===>// 如何定義了 CC2540_MINIDK 巨集,關閉所有的LED
HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );
===>// 如何定義了 CC2540_MINIDK 巨集,GPIO使能、輸入輸出模式、認輸出電平的配置。
===>// LED提示字串顯示
HalLcdWriteString( "BLE Broadcaster", HAL_LCD_LINE_1 );
===>//通過osal_set_event() 註冊一個延遲的事件:SBP_START_DEVICE_EVT(裝置啟動觸發事件)
osal_set_event( simpleBLEBroadcaster_TaskID, SBP_START_DEVICE_EVT );
===>osal_mem_kick()
==> HAL_ENABLE_INTERRUPTS(); //使能中斷
==> InitBoard( OB_READY ); //板卡最後初始化
==> osal_start_system(); // No Return from here (啟動OSAL)
===>for(;;){osal_run_system()} // 死迴圈,不斷執行osal_run_system()
===>osal_run_system() // 迴圈體
===>Hal_ProcessPoll() //處理輪詢
===>HalUARTPoll() //串列埠輪詢
===>usbHidProcessEvents()//人性化介面輪詢(如本介面的鍵盤)
===>遍歷1遍任務事件點陣圖 tasksEvents[idx],有任務中的事件註冊觸發了就退出,以便處理.
===>記錄任務中的事件到uint16 events;並清0任務事件點陣圖中的相應任務域。
===>根根據taskid,回撥不同的任務處理函式 tasksArr[idx],(傳入事件events量);並返回一個events。
===>SimpleBLEBroadcaster_ProcessEvent() // 使用者定義的事件處理函式(為例子分析)
===> if ( events & SYS_EVENT_MSG ) //若有pMsg等待接收事件
===>if ( (pMsg = osal_msg_receive( simpleBLEBroadcaster_TaskID )) != NULL )// 獲得pMsg
===>simpleBLEBroadcaster_ProcessOSALMsg()// 處理pMsg(osal_event_hdr_t型別)
===> switch判斷pMsg->event == KEY_CHANGE // 是按鍵事件嗎,否退出
===>將osal_event_hdr_t 強制轉換為具體事件描述--按鍵事件型別 keyChange_t。
===>simpleBLEBroadcaster_HandleKeys() // 處理按鍵事件
===>if ( keys & HAL_KEY_SW_2 )//若按下ringht鍵就執行一定處理(如開關廣播)。
===>osal_msg_deallocate() //清除訊息pMsg記憶體
===> if ( events & SBP_START_DEVICE_EVT ) //若有啟動裝置事件
===>GAPRole_StartDevice() //處理啟動裝置事件
===>if ( gapRole_state == GAPROLE_INIT ) //如果鏈路狀態是初始化狀態
===>將GAP回撥函式集simpleBLEBroadcaster_BroadcasterCBs記錄到全域性的便利pGapRoles_AppCGs,等待被執行。
===> 執行gapRole_SetupGAP() // 開始建立鏈路;
===>將新的返回的events任務寫回註冊到tasksEvents[idx],等待被處理。
---------------------
作者:Life_Maze
來源:CSDN
原文:https://blog.csdn.net/Life_Maze/article/details/79634192
版權宣告:本文為博主原創文章,轉載請附上博文連結!