玩過TI 的ZigBee或者BLE的人,都會接觸到OSAL。OSAL是什么?OSAL英文全稱:operating system abstraction layer(操作系統抽象層)。基于OSAL的調度機制,OSAL支持多任務,而且一個任務內支持多個事件執行。有關OSAL調度機制的實現原理,可以去網上搜索資料。在OSAL下,我們就可以把對數據或者單片的操作轉化成各種任務,各種事件,真正做到有條不紊。和較為復雜UCOS系統比起來,OSAL實現起來比較簡單,其核心也只是做一些任務的輪詢調度。OSAL占用空間3K左右,特別適用51單片機。 我們初玩51單片機,基本上在裸機上跑程序,效率高,實現的功能的比較簡單。但是,對于復雜的功能,就不適合在裸機上跑了,效率不高,而且可能會嚴重限制單片機的運行速度。比如多次檢測多個按鍵,每次消抖處理都要用delay()函數做延時,delay函數本身就挺占用cpu資源。如果還有其他周期性事件要執行,因為delay函數占用cpu資源,同樣會導致周期事件沒法在規定的時間內執行。所以還是很有必要跑系統,再在系統的平臺上運行我們的應用程序。
本文簡要介紹OSAL的在STC8A8K64S4A12移植的過程,并且以幾個任務事件做測試。本工程文件也會上傳到附件中,需要的可以去下載。
一、移植OSAL所需主要文件
全部文件.PNG (2.85 KB, 下載次數: 189)
下載附件
2019-8-30 19:17 上傳
OSAL.c這個文件主要有事件創建和刪除、就緒任務輪詢、消息創建和任務創建初始化等;OSAL_ClockBLE.c這個文件主要有系統任務事件時間更新、日期的轉化、日期的初始化等;OSLA_Memory.c這個文件主要是一些內存的管理、OSAL堆空間的分配等;OSAL_Timer.c這個文件主要是事件定時執行、事件終止等。
二、移植關鍵部分
1、數據類型的定義
數據類型定義.PNG (20.11 KB, 下載次數: 160)
下載附件
2019-8-30 19:33 上傳
數據類型的定義需要根據不同單片機的數據類型長度來定義,本文是根據STC8A8K64S4A12的數據長度的定義數據類型。如果不清楚自己的單片機的數據類型的長度,可以用sizeof()函數得到數據類型長度,比如sizeof(int)。
2、OSAL時間更新
時間更新.PNG (3.22 KB, 下載次數: 171)
下載附件
2019-8-30 19:41 上傳
這個函數里面調用到兩個函數,osalTimerUpdate(1)主要是讓系統的時基增加1ms,要求每次過了1ms都要調用這條函數,事件的定時執行的時間計算都是基于這個累計的時基;osalClockUpdate(1)這個函數主要是累計1ms的時間,方便把時間轉化為年月日。我這邊是使用STC8A8K64S4A12的定時器0外設產生1ms的定時器0中斷,然后把void osalTimeUpdate(void函數要放在定時器0中斷處理函數中,這樣每次產生中斷,就會更新1ms的時基。
定時器0中斷.PNG (39.94 KB, 下載次數: 164)
下載附件
2019-8-30 19:54 上傳
3、中斷臨界保護
中斷臨界保護.PNG (20.04 KB, 下載次數: 177)
下載附件
2019-8-30 20:01 上傳
OSAL在對內存的管理和任務的輪詢等關鍵操作需要先關閉系統總中斷,操作完后,再把系統總中斷打開。OSAL在多個地方都有使用到中斷臨界保護,可以保護關鍵操作時數據不被外部中斷干擾。查詢到STC8A8K64S4A12對系統總中斷真正的開啟和關閉需要執行EA=0/EA=1后再延長1-2個指令周期,所以加上兩條asm("nop")語句,確保系統總中斷絕對的關閉或者打開。
三、OSAL的使用
1、main()函數
main.PNG (16.05 KB, 下載次數: 189)
下載附件
2019-8-30 20:21 上傳
main函數就只需要包含四條語句,十分簡潔。其中定時器0初始化,產生1ms的中斷,更新系統時基;初始化系統任務,開啟系統總中斷,啟動任務輪詢。然后系統就能跑起來了。
2、OSAL啟動系統
系統輪詢.PNG (4.84 KB, 下載次數: 181)
下載附件
2019-8-30 20:28 上傳
從for循環語句知道,死循環執行osal_run_system()函數。這個函數主要是不停地輪詢哪些任務就緒,然后執行就緒任務。
3、用戶自定義任務
任務表.PNG (5.34 KB, 下載次數: 195)
下載附件
2019-8-30 20:35 上傳
tasksAtrr[]這個是存放用戶自定義應用任務的數組,這里只定義一個應用任務。可以自定義多個自定義任務,任務輪詢就是查詢這個數組里面任務有哪些事件需要執行。
4、系統初始化
系統初始化.PNG (17.46 KB, 下載次數: 179)
下載附件
2019-8-30 20:41 上傳
這里是做一些應用的初始化,在初始化函數里面,用戶可以設置哪些事件執行。
5、任務事件處理
事件處理.PNG (15.93 KB, 下載次數: 152)
下載附件
2019-8-30 20:51 上傳
事件.PNG (6.14 KB, 下載次數: 187)
下載附件
2019-8-30 20:51 上傳
上面的圖片就是任務里面的事件,任務在被輪詢的時候,就會查詢哪些事件就緒,一旦某個事件就緒,就去執行對應事件處理,處理完后,會清除對應事件就緒標志,確保對應事件不會被重復執行。下面的圖片是事件位域的定義,一個任務支持定義16個事件。
6、幾事件設置的函數
事件設置.PNG (24.7 KB, 下載次數: 167)
下載附件
2019-8-30 21:06 上傳
7、OSAL堆空間大小設置
堆空間.PNG (13.51 KB, 下載次數: 173)
下載附件
2019-8-30 21:29 上傳
INT_HEAP_LEN是OSAL運行的堆空間設置,這里設置為1024,如果用戶的任務和事件比較多的話,就要適當加大對空間的大小。
四、任務事件執行演示
演示1.PNG (7.78 KB, 下載次數: 201)
下載附件
2019-8-30 21:15 上傳
演示2.PNG (12.11 KB, 下載次數: 172)
下載附件
2019-8-30 21:15 上傳
演示4.PNG (13.21 KB, 下載次數: 172)
下載附件
2019-8-30 21:39 上傳
演示3.PNG (29.31 KB, 下載次數: 168)
下載附件
2019-8-30 21:15 上傳
采用外部中斷來實現按鍵中斷,再設置20ms按鍵消抖檢測事件,一旦按鍵有效,就定時啟動6個事件,事件的處理就是讓特定的GPIO口電平反轉。按下按鍵后,從邏輯分析儀,可以清楚地看到6個事件的執行過程,看起像是并行處理事件,其實是串行處理事件的。
事件執行.PNG (91.35 KB, 下載次數: 152)
下載附件
2019-8-30 21:18 上傳
再次按下按鍵后,所以事件都被停止了。再次按下后,事件有開始執行了,交替按下按鍵,再用邏輯分析儀查看。
按鍵.PNG (88.53 KB, 下載次數: 178)
下載附件
2019-8-30 21:18 上傳
工程全部文件
工程文件圖片.PNG (76.58 KB, 下載次數: 156)
下載附件
2019-8-30 22:12 上傳
實物圖
實物圖.jpg (1.98 MB, 下載次數: 175)
下載附件
2019-8-30 21:48 上傳
全部資料51hei下載地址:
STC8A8K64S4A12.rar
(502.18 KB, 下載次數: 596)
2019-8-30 21:25 上傳
點擊文件名下載附件
OSAL演示工程文件 下載積分: 黑幣 -5
|