找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8670|回復(fù): 23
打印 上一主題 下一主題
收起左側(cè)

IAR平臺移植TI OSAL到STC8A8K64S4A12單片機(jī)中

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
   玩過TI 的ZigBee或者BLE的人,都會(huì)接觸到OSAL。OSAL是什么?OSAL英文全稱:operating system abstraction layer(操作系統(tǒng)抽象層);贠SAL的調(diào)度機(jī)制,OSAL支持多任務(wù),而且一個(gè)任務(wù)內(nèi)支持多個(gè)事件執(zhí)行。有關(guān)OSAL調(diào)度機(jī)制的實(shí)現(xiàn)原理,可以去網(wǎng)上搜索資料。在OSAL下,我們就可以把對數(shù)據(jù)或者單片的操作轉(zhuǎn)化成各種任務(wù),各種事件,真正做到有條不紊。和較為復(fù)雜UCOS系統(tǒng)比起來,OSAL實(shí)現(xiàn)起來比較簡單,其核心也只是做一些任務(wù)的輪詢調(diào)度。OSAL占用空間3K左右,特別適用51單片機(jī)。  我們初玩51單片機(jī),基本上在裸機(jī)上跑程序,效率高,實(shí)現(xiàn)的功能的比較簡單。但是,對于復(fù)雜的功能,就不適合在裸機(jī)上跑了,效率不高,而且可能會(huì)嚴(yán)重限制單片機(jī)的運(yùn)行速度。比如多次檢測多個(gè)按鍵,每次消抖處理都要用delay()函數(shù)做延時(shí),delay函數(shù)本身就挺占用cpu資源。如果還有其他周期性事件要執(zhí)行,因?yàn)閐elay函數(shù)占用cpu資源,同樣會(huì)導(dǎo)致周期事件沒法在規(guī)定的時(shí)間內(nèi)執(zhí)行。所以還是很有必要跑系統(tǒng),再在系統(tǒng)的平臺上運(yùn)行我們的應(yīng)用程序。
  本文簡要介紹OSAL的在STC8A8K64S4A12移植的過程,并且以幾個(gè)任務(wù)事件做測試。本工程文件也會(huì)上傳到附件中,需要的可以去下載。
一、移植OSAL所需主要文件


OSAL.c這個(gè)文件主要有事件創(chuàng)建和刪除、就緒任務(wù)輪詢、消息創(chuàng)建和任務(wù)創(chuàng)建初始化等;OSAL_ClockBLE.c這個(gè)文件主要有系統(tǒng)任務(wù)事件時(shí)間更新、日期的轉(zhuǎn)化、日期的初始化等;OSLA_Memory.c這個(gè)文件主要是一些內(nèi)存的管理、OSAL堆空間的分配等;OSAL_Timer.c這個(gè)文件主要是事件定時(shí)執(zhí)行、事件終止等。
二、移植關(guān)鍵部分
1、數(shù)據(jù)類型的定義


數(shù)據(jù)類型的定義需要根據(jù)不同單片機(jī)的數(shù)據(jù)類型長度來定義,本文是根據(jù)STC8A8K64S4A12的數(shù)據(jù)長度的定義數(shù)據(jù)類型。如果不清楚自己的單片機(jī)的數(shù)據(jù)類型的長度,可以用sizeof()函數(shù)得到數(shù)據(jù)類型長度,比如sizeof(int)。
2、OSAL時(shí)間更新


這個(gè)函數(shù)里面調(diào)用到兩個(gè)函數(shù),osalTimerUpdate(1)主要是讓系統(tǒng)的時(shí)基增加1ms,要求每次過了1ms都要調(diào)用這條函數(shù),事件的定時(shí)執(zhí)行的時(shí)間計(jì)算都是基于這個(gè)累計(jì)的時(shí)基;osalClockUpdate(1)這個(gè)函數(shù)主要是累計(jì)1ms的時(shí)間,方便把時(shí)間轉(zhuǎn)化為年月日。我這邊是使用STC8A8K64S4A12的定時(shí)器0外設(shè)產(chǎn)生1ms的定時(shí)器0中斷,然后把void osalTimeUpdate(void函數(shù)要放在定時(shí)器0中斷處理函數(shù)中,這樣每次產(chǎn)生中斷,就會(huì)更新1ms的時(shí)基。


3、中斷臨界保護(hù)


OSAL在對內(nèi)存的管理和任務(wù)的輪詢等關(guān)鍵操作需要先關(guān)閉系統(tǒng)總中斷,操作完后,再把系統(tǒng)總中斷打開。OSAL在多個(gè)地方都有使用到中斷臨界保護(hù),可以保護(hù)關(guān)鍵操作時(shí)數(shù)據(jù)不被外部中斷干擾。查詢到STC8A8K64S4A12對系統(tǒng)總中斷真正的開啟和關(guān)閉需要執(zhí)行EA=0/EA=1后再延長1-2個(gè)指令周期,所以加上兩條asm("nop")語句,確保系統(tǒng)總中斷絕對的關(guān)閉或者打開。
三、OSAL的使用
1、main()函數(shù)


  main函數(shù)就只需要包含四條語句,十分簡潔。其中定時(shí)器0初始化,產(chǎn)生1ms的中斷,更新系統(tǒng)時(shí)基;初始化系統(tǒng)任務(wù),開啟系統(tǒng)總中斷,啟動(dòng)任務(wù)輪詢。然后系統(tǒng)就能跑起來了。
2、OSAL啟動(dòng)系統(tǒng)


從for循環(huán)語句知道,死循環(huán)執(zhí)行osal_run_system()函數(shù)。這個(gè)函數(shù)主要是不停地輪詢哪些任務(wù)就緒,然后執(zhí)行就緒任務(wù)。
3、用戶自定義任務(wù)


tasksAtrr[]這個(gè)是存放用戶自定義應(yīng)用任務(wù)的數(shù)組,這里只定義一個(gè)應(yīng)用任務(wù)。可以自定義多個(gè)自定義任務(wù),任務(wù)輪詢就是查詢這個(gè)數(shù)組里面任務(wù)有哪些事件需要執(zhí)行。
4、系統(tǒng)初始化


這里是做一些應(yīng)用的初始化,在初始化函數(shù)里面,用戶可以設(shè)置哪些事件執(zhí)行。
5、任務(wù)事件處理


上面的圖片就是任務(wù)里面的事件,任務(wù)在被輪詢的時(shí)候,就會(huì)查詢哪些事件就緒,一旦某個(gè)事件就緒,就去執(zhí)行對應(yīng)事件處理,處理完后,會(huì)清除對應(yīng)事件就緒標(biāo)志,確保對應(yīng)事件不會(huì)被重復(fù)執(zhí)行。下面的圖片是事件位域的定義,一個(gè)任務(wù)支持定義16個(gè)事件。
6、幾事件設(shè)置的函數(shù)

7、OSAL堆空間大小設(shè)置


INT_HEAP_LEN是OSAL運(yùn)行的堆空間設(shè)置,這里設(shè)置為1024,如果用戶的任務(wù)和事件比較多的話,就要適當(dāng)加大對空間的大小。
四、任務(wù)事件執(zhí)行演示
   



采用外部中斷來實(shí)現(xiàn)按鍵中斷,再設(shè)置20ms按鍵消抖檢測事件,一旦按鍵有效,就定時(shí)啟動(dòng)6個(gè)事件,事件的處理就是讓特定的GPIO口電平反轉(zhuǎn)。按下按鍵后,從邏輯分析儀,可以清楚地看到6個(gè)事件的執(zhí)行過程,看起像是并行處理事件,其實(shí)是串行處理事件的。


再次按下按鍵后,所以事件都被停止了。再次按下后,事件有開始執(zhí)行了,交替按下按鍵,再用邏輯分析儀查看。

工程全部文件

實(shí)物圖


全部資料51hei下載地址:
STC8A8K64S4A12.rar (502.18 KB, 下載次數(shù): 596)

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:20672 發(fā)表于 2019-9-11 21:27 | 只看該作者
謝謝分享~~~~好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:371527 發(fā)表于 2019-9-26 11:50 | 只看該作者
謝謝!試試
回復(fù)

使用道具 舉報(bào)

地板
ID:599571 發(fā)表于 2019-9-29 02:37 | 只看該作者
這是個(gè)很好的思路,謝謝分享
回復(fù)

使用道具 舉報(bào)

5#
ID:117433 發(fā)表于 2019-11-7 15:10 | 只看該作者
我以前學(xué)過ZIGBEE,由于覺得ZIGBEE傳輸太近,就放棄了,改用LORA,單片機(jī)用STC的,自己編確實(shí)漏洞太多,,所以就嘗試操作系統(tǒng)
回復(fù)

使用道具 舉報(bào)

6#
ID:117433 發(fā)表于 2019-11-11 09:10 | 只看該作者
學(xué)喜了,可是我,這是不是從ZSTACK上下的
回復(fù)

使用道具 舉報(bào)

7#
ID:351097 發(fā)表于 2019-11-11 23:14 | 只看該作者
xizhe2005 發(fā)表于 2019-11-11 09:10
學(xué)喜了,可是我,這是不是從ZSTACK上下的

我用過CC2541,感覺OSAL挺適合8位單片機(jī)的,就做了移植。
回復(fù)

使用道具 舉報(bào)

8#
ID:639647 發(fā)表于 2019-11-13 15:09 | 只看該作者
下載的東西看不了,裝了IAR也看不了,還有過程沒說清楚,STC是用UART下載程序的,IAR是用可以調(diào)試的那種JTAG接口,到底怎么把程序下載到STC單片機(jī)上呢,能不能說詳細(xì)點(diǎn)
回復(fù)

使用道具 舉報(bào)

9#
ID:351097 發(fā)表于 2019-11-14 09:37 | 只看該作者
xizhe2009 發(fā)表于 2019-11-13 15:09
下載的東西看不了,裝了IAR也看不了,還有過程沒說清楚,STC是用UART下載程序的,IAR是用可以調(diào)試的那種JTA ...

IAR工程缺少STC的環(huán)境,你可以看我之前發(fā)的帖子:在IAR平臺建立STC8ASK64S4A12單片機(jī)工程。然后就可以編譯我的工程了,編譯成功后,有產(chǎn)生hex文件,你用stc-isp軟件把hex文件燒錄到STC單片機(jī)就行,IAR不支持STC單片機(jī)在線調(diào)試。
回復(fù)

使用道具 舉報(bào)

10#
ID:645651 發(fā)表于 2019-11-20 11:20 | 只看該作者
單片機(jī)就是缺少系統(tǒng),osal確實(shí)方便
回復(fù)

使用道具 舉報(bào)

11#
ID:20672 發(fā)表于 2020-1-1 09:18 | 只看該作者
請問有keil的工程嗎??
回復(fù)

使用道具 舉報(bào)

12#
ID:351097 發(fā)表于 2020-1-2 11:36 | 只看該作者
wdliming 發(fā)表于 2020-1-1 09:18
請問有keil的工程嗎??

沒有,你自己把osal的幾個(gè)文件移植到keil工程里面,再做一下數(shù)據(jù)類型的兼容就行。
回復(fù)

使用道具 舉報(bào)

13#
ID:20672 發(fā)表于 2020-1-2 16:55 | 只看該作者
沒有你 發(fā)表于 2020-1-2 11:36
沒有,你自己把osal的幾個(gè)文件移植到keil工程里面,再做一下數(shù)據(jù)類型的兼容就行。

好的多謝~~~~
回復(fù)

使用道具 舉報(bào)

14#
ID:117433 發(fā)表于 2020-1-3 16:28 | 只看該作者
樓主好人做到底,能不能做出KEIL工程供大家直接使用
回復(fù)

使用道具 舉報(bào)

15#
ID:351097 發(fā)表于 2020-1-3 21:36 | 只看該作者
xizhe2005 發(fā)表于 2020-1-3 16:28
樓主好人做到底,能不能做出KEIL工程供大家直接使用

暫時(shí)沒有搞keil工程,你自己復(fù)制一下osal的幾個(gè)文件到keil工程里面,osal詳細(xì)的移植過程,帖子說得很清楚了。
回復(fù)

使用道具 舉報(bào)

16#
ID:696952 發(fā)表于 2020-2-23 15:13 | 只看該作者
有什么作用?詳細(xì)介紹一下唄
回復(fù)

使用道具 舉報(bào)

17#
ID:564182 發(fā)表于 2020-2-27 16:45 來自手機(jī) | 只看該作者
讀按鍵不一點(diǎn)要用delay,開個(gè)20ms定時(shí)器去讀in就好啦。或者rtos定時(shí)任務(wù)執(zhí)行。
回復(fù)

使用道具 舉報(bào)

18#
ID:704910 發(fā)表于 2020-3-9 00:29 | 只看該作者
樓主的分享真心不錯(cuò),我以前也用過CC2540  CC2541,里面的OSAL真心不錯(cuò)的,用在8位的51上挺合適的。不過用IAR來開發(fā)STC我還真沒用過!!不過謝謝樓主分享的資源了。
回復(fù)

使用道具 舉報(bào)

19#
ID:351097 發(fā)表于 2020-3-14 21:16 | 只看該作者
race_start 發(fā)表于 2020-3-9 00:29
樓主的分享真心不錯(cuò),我以前也用過CC2540  CC2541,里面的OSAL真心不錯(cuò)的,用在8位的51上挺合適的。不過用I ...

感謝支持
回復(fù)

使用道具 舉報(bào)

20#
ID:646277 發(fā)表于 2021-5-5 13:28 | 只看該作者
高手,一直想移植,但沒有成功
回復(fù)

使用道具 舉報(bào)

21#
ID:290373 發(fā)表于 2021-12-17 10:28 | 只看該作者
長見識了,感謝分享
回復(fù)

使用道具 舉報(bào)

22#
ID:514317 發(fā)表于 2022-3-26 12:02 | 只看該作者
哪位高手幫忙移植個(gè)keil工程啊
回復(fù)

使用道具 舉報(bào)

23#
ID:619805 發(fā)表于 2022-6-18 10:37 | 只看該作者
沒有你 發(fā)表于 2019-11-14 09:37
IAR工程缺少STC的環(huán)境,你可以看我之前發(fā)的帖子:在IAR平臺建立STC8ASK64S4A12單片機(jī)工程。然后就可以編 ...

請問iar中devices文件夾中的文件怎么打開編輯,我想把我使用的stc12c5a60s2加入iar中怎么做?
回復(fù)

使用道具 舉報(bào)

24#
ID:1063561 發(fā)表于 2025-4-26 09:14 | 只看該作者
下載學(xué)習(xí),謝謝分享。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表