1、CC2541藍牙4.0芯片中級教程——基於OSAL操作系統的運行流程了解+定時器和串口例程了解


 

 

本文根據一周CC2541筆記匯總得來——

適合概覽和知識快速索引——

全部鏈接:

中級教程-OSAL操作系統\OSAL操作系統-實驗01 OSAL初探

【插入】SourceInsight-工程建立方法

中級教程-OSAL操作系統(OSAL系統解基本套路)

中級教程-OSAL操作系統(進一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個系統驅動層和應用層不一樣~

中級教程-OSAL操作系統(ADC-光敏電阻)

OSAL操作系統-實驗16 串口波特率擴展

OSAL操作系統-實驗17 AT命令初步

OSAL操作系統-實驗20 模擬IIC通信+硬件IIC(Mpu6050)

OSAL 操作系統-實驗 23 PWM 輸出(改變占空比)

OSAL 操作系統-實驗 24 看門狗 WachDog

OSAL操作系統-實驗25 SNV內部Flash數據讀寫

OSAL 操作系統-實驗 29 系統睡眠等級研究

OSAL 操作系統-實驗 31 從機廣播功率修改

 

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分類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM