1. CC254x的軟件基於OSAL架構
2. OSAL並非一個真的操作系統, 而只是讓軟件設立一個事件的執行方法(setup excution of events)
3. 每一個子系統都在OSAL的一個任務(task)執行並由一個獨立的task id.
4. task id越小, 優先級別越高
5. SimpleBLEPeripheral項目有12個任務: Link Layer, HAL, OSAL Callback Timer, L2CAP, GATT, GAP, SM, Peripheral Role Profile, GAP Bond Manager, GATT server, SimpleBLEPeripheral.
6. 每個任務由兩個函數(function): 初始化, 比如SimpleBLEPeripheral_Init(), 跟事件處理, 比如SimpleBLEPeripheral_ProcessEvent();
7. 每個應用程序都要包含一個void osalInitTask(void)函數
8. 這個函數會調用每個任務的初始化函數來初始化任務.
9. 每個應用程序都要使用一個叫tasksArr的數組, 包含每個任務處理函數的指針.
10. 數組的順序必須跟task ID的順序一致.
11. 應用程序還應該產生一個名為tasksEvents的全局變量, 用uint16來對應每一個發生的task event, 對應的位置1標示發生了特定的event
12. 一個OSAL event事件是一個將來執行的task的標志
13. 每一個OSAL任務可以定義多達15個event
14. 兩個方法設置event:
a: osal_set_event(), 立即設置一個event
b: osal_start_timeEX(), 安排若干時間(以ms為單位)后發生一個event, 可通過osal_stop_timeEX來取消.
15.看下面的圖就明白了, 每個task有15個標志位去標志每一個event是否發生.

主循環:
1. 當osal_system_start被執行后, OSAL會進入主循環
2. 在循環中, 會不斷檢查taskEvents數組是否有位被置1, 如果有不同的task被發現有event需要處理, 則先處理task id優先級高的.
3. OSAL會用event處理指針的方法去處理對應的event
4. 當event處理方法執行完, 應該講對應的event標示位置0, 不然這個方法會被重復執行.
5. 如果沒有任務需要執行, OSAL會進入省電模式(power saving mode), 但是內存依然有電, 而且計時器也在持續運行.
6. 當中斷發生時, 或者OSAL計數器定義的倒數時間到了, 處理器會被喚醒.
消息處理:
1. OSAL提供了消息處理機制來讓不同的子系統之間傳遞數據.
2. 消息可以是任意類型數據, 任意長度.
3. 發送消息的程序是:
a: 用osal_msg_allocate()分配內存
b: 將數據拷貝進內存
c: 使用osal_msg_send()指定目標任務
4. 任務利用SYS_EVENT_MSG標示來發現待處理的消息
5. simpleBLEPeripheral_ProcessOSALMsg()函數來處理消息.
6. 收到消息后要用osal_msg_deallocate()來釋放內存.
內存管理
1. OSAL API使用內存管理的函數是: osal_mem_alloc與osal_mem_free
2. 堆的尺寸在IAR的compiler里面設置
3. 如果堆尺寸設置得太高, CC2540可能會內存泄露.
4. 確認編譯完成后, map文件不能超過8KB限制.

文件與關鍵的API
1. 關鍵文件包括: osal.c, osal.h
2. 關鍵api是:
osal_init_system();
osal_start_system();
osal_set_event();
osal_start_timeEX();
osal_stop_timeEX();
osal_msg_allocate();
osal_msg_send();
osal_msg_deallocate();
osal_mem_alloc();
osal_mem_free)();
3. OsalInitTask()是用來設置任務ID的.
硬件抽象層(HAL)
硬件抽象層包括對ADC, UART, SPI, Flash, Timer, Key, LCD驅動的接口
