1. 程式人生 > >OSAL啟動過程分析

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!