本文根據一周CC2541筆記匯總得來——
適合概覽和知識快速索引——
全部鏈接:
中級教程-OSAL操作系統\OSAL操作系統-實驗01 OSAL初探
中級教程-OSAL操作系統(進一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個系統驅動層和應用層不一樣~
OSAL操作系統-實驗20 模擬IIC通信+硬件IIC(Mpu6050)
1、基本流程初探
OSAL 的英文全名稱叫做 “OS Abstraction Layer ”,操作系統,誕生於 TI 發布 zigbee 系列芯片時期,10年歷史
系統基本運行流程:
>> main函數中是基本的系統初始化,然后進入
osal_start_system();
大循環,不斷檢測標志位,根據不同標志位來執行不同任務
后面看該大循環-->
1 int main(void) 2 { 3 /* Initialize hardware */ 4 HAL_BOARD_INIT(); //初始化時鍾穩定時鍾等等 5 6 // Initialize board I/O 7 //冷啟動,關閉了led燈與中斷, 一邊接下來的各種初始化不受干擾 8 InitBoard( OB_COLD ); 9 10 /* Initialze the HAL driver */ 11 HalDriverInit(); //各種驅動的初始化、如按鍵、lcd、adc、usb、uart等 12 13 /* Initialize NV system */ 14 //snv 內部用於保存配對數據或你的用戶自定義數據的一段flash,4kB空間 15 osal_snv_init(); 16 17 /* Initialize LL */ 18 19 /* Initialize the operating system */ 20 //oasl 操作系統初始化, 包含內存分配、消息隊列、定時器、電源管理和任務等 21 osal_init_system(); 22 23 /* Enable interrupts */ 24 HAL_ENABLE_INTERRUPTS();// 開啟全局中斷 25 26 // Final board initialization 27 InitBoard( OB_READY ); //設置標志標示系統初始化完畢 28 29 #if defined ( POWER_SAVING ) 30 // 如果你使能了低功耗, 就啟動低功耗模式, 31 osal_pwrmgr_device( PWRMGR_BATTERY ); 32 #endif 33 /* 34 低功耗部分 35 1.如何總是在PM1 36 osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); 37 2.如何進入PM2 38 osal_pwrmgr_device( PWRMGR_BATTERY );在空閑的時候就會進入到PM2模式 39 3.如何進入PM3 40 存在連接就斷開連接,存在廣播就停掉廣播,並確認自己創建的所有定時任務都已關閉, 41 則系統應該就會進入PM3模式,只能進行外部中斷喚醒 42 */ 43 44 /* Start OSAL */ 45 osal_start_system(); // No Return from here 46 /* osal 操作系統啟動,實際上是一個大循環,只是檢查相對應的標志位, 47 就指定相對應的任務,看到這里,同學們應該往哪里看呢?其實,這已經是盡頭了?那么我們的應用程序是在哪里寫的呢 48 其實是在上面的 上面的函數 osal_init_system 里就初始化了,現在回過頭去看看 49 osal_init_system 這個函數內部就知道了 50 */ 51 return 0; 52 }
osal_start_system();中一直循環執行osal_run_system( void ):遍歷所有事件,發現一個就執行該事件,沒有事件則休眠
>> 初始化的流程
osal_init_system();---->
osalInitTasks();//初始化系統任務, 這一個任務初始化非常關鍵---->
SimpleBLETest_Init( taskID ); //這個就是我們的應用程序初始化---->
1 void SimpleBLETest_Init( uint8 task_id ) 2 { 3 //保存任務id到全局變量 4 SimpleBLETest_TaskID = task_id; 5 6 //lcd 顯示 7 HalLcdWriteString( "SimpleBLETest 2", HAL_LCD_LINE_1 ); 8 9 // Setup a delayed profile startup 10 /* 11 設置一個任務, 這么做的目的是按照多任務處理的方法來做 12 SimpleBLETest_ProcessEvent 就是處理 SBP_START_DEVICE_EVT 13 */ 14 osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT ); 15 }
osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );//因為采用多任務,
所以調用該函數設置一個任務該函數內部也比較簡單,就是維護一個標志位數組:tasksEvents[task_id] |= event_flag;
1 uint8 osal_set_event( uint8 task_id, uint16 event_flag ) 2 { 3 if ( task_id < tasksCnt ) 4 { 5 halIntState_t intState; 6 HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts 7 tasksEvents[task_id] |= event_flag; // Stuff the event bit(s) 8 HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts 9 return ( SUCCESS ); 10 } 11 else 12 { 13 return ( INVALID_TASK ); 14 } 15 }
2、OSAL系統基本流程進一步了解
2.1、定時器例程
定時器有用函數:(OSAL_Timers.c)
LED有用函數:(hal_led.c.c)
上一節說到沿着初始化函數一直進入會到任務設置部分:
而這里設置好之后,一旦有相應的消息過來就會最終觸發應用層的:
至於為什么這樣,先不說~
其余例程流程基本都是這樣!
2.2、串口例程
串口初始化的時候采用回調函數,類似於C#,因此數據接收在回調函數中處理~
上面95行,串口初始化函數的形參是串口接收的回調函數---->具體如下:
上面是串口接收(利用回調),其發送比較簡單,調用函數即可:
串口發送函數有多種:
未完~關注我的cc2541分類