新聞中心

ucosii在stm32上的移植詳解1

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
雖然目前網(wǎng)上已經(jīng)有不少關(guān)于ucosiistm32上的移植版本,包括micrium也有官方移植版本。但這些版本具體是怎么移植出來(lái)的,又該怎么基于移植好的ucosii開(kāi)發(fā)應(yīng)用軟件,網(wǎng)上介紹的并不多。這里介紹一下我的移植經(jīng)歷,希望對(duì)大家有所幫助。

我的移植基本上是從零開(kāi)始的。首先想要做好移植,有兩方面的內(nèi)容是必須要了解。1.目標(biāo)芯片;2.ucosii內(nèi)核原理。
雖然我們移植的目標(biāo)芯片是stm32,但操作系統(tǒng)的移植基本是針對(duì)Cortex-M3內(nèi)核(以下簡(jiǎn)稱(chēng)CM3)而言的,所以我們只需了解CM3內(nèi)核就好了。stm32芯片就是CM3內(nèi)核加上各種各樣的外設(shè)。
怎么才能了解CM3呢?看一本書(shū)<>(宋巖譯,網(wǎng)上多的很)就好了,很多同學(xué)可能想,看完這本書(shū)移植的新鮮勁都沒(méi)了,因此我把該書(shū)和移植有關(guān)的章節(jié)都列了出來(lái),并對(duì)其中的重點(diǎn)內(nèi)容進(jìn)行介紹,我數(shù)了數(shù)相關(guān)章節(jié)還不到100頁(yè),就這點(diǎn)內(nèi)容,總要看了吧。

本文引用地址:http://m.butianyuan.cn/article/201611/318072.htm

相關(guān)章節(jié)如下:
chapter2 Cortex-M3概覽
2.1 - 2.9
主要了解Cortex-M3的概貌。剛開(kāi)始看時(shí)不用追求全部理解,后面會(huì)有詳細(xì)介紹,很多內(nèi)容多看幾遍就明白。其中2.8 指令集,只要了解,CM3只使用thumb2就ok了。

chapter3 Cortex-M3基礎(chǔ)
3.1 寄存器組
R0-R12: 通用寄存器

R13: 堆棧寄存器
有兩個(gè),MSP和PSP,同時(shí)只能看見(jiàn)一個(gè)
引用R13時(shí),引用的是正在使用的那個(gè)
MSP:可用于異常服務(wù)和應(yīng)用程序
PSP:只能用于應(yīng)用程序
系統(tǒng)復(fù)位后,用的堆棧指針是MSP。

R14: 連接寄存器,又名LR
存儲(chǔ)返回地址

R15: 程序計(jì)數(shù)寄存器,又名PC

3.2 特殊功能寄存器
程序狀態(tài)字寄存器組(PSRs)
中斷屏蔽寄存器組(PRIMASK, FAULTMASK, BASEPRI)
控制寄存器(CONTROL)

程序狀態(tài)字寄存器組(PSRs)分為
應(yīng)用程序 PSR(APSR)
中斷號(hào) PSR(IPSR)
執(zhí)行 PSR(EPSR)

每個(gè)都是32位,由于這3個(gè)寄存器有效位是錯(cuò)開(kāi)的,因此可以組合訪(fǎng)問(wèn)。

中斷屏蔽寄存器組(PRIMASK, FAULTMASK, BASEPRI)
這三個(gè)寄存器用于控制異常的使能和除能。

控制寄存器(CONTROL)
它有兩個(gè)作用:
1.定義特權(quán)級(jí)別
2.選擇當(dāng)前使用哪個(gè)堆棧指針

3.3 操作模式和特權(quán)極別
操作模式: 處理者模式和線(xiàn)程模式
異常處理:處理者模式
主程序:線(xiàn)程模式

ucosii不區(qū)分特權(quán)級(jí)和用戶(hù)級(jí),程序始終工作在特權(quán)級(jí)
這兩個(gè)堆棧指針的切換是全自動(dòng)的,就在出入異常服務(wù)例程時(shí)由硬件處理。

3.4 - 3.7
沒(méi)什么好講的,需要看。

3.8 復(fù)位序列
0x00000000 MSP初值
0x00000004 PC初值 復(fù)位向量

chapter7 異常
7.1 異常類(lèi)型
分為系統(tǒng)異常(編號(hào)1-15)和外部中斷(大于15)

7.2 優(yōu)先級(jí)
CM3支持3個(gè)固定的高優(yōu)先級(jí)和多達(dá)256級(jí)的可編程優(yōu)先級(jí)。
在NVIC中,每個(gè)中斷都有一個(gè)優(yōu)先級(jí)配置寄存器(1個(gè)byte),用來(lái)配置該中斷的優(yōu)先級(jí)。但該寄存器并不是每個(gè)位都被使用,不同制造商生產(chǎn)的芯片不相同,譬如stm32使用4位,也就是說(shuō)stm32支持16個(gè)可編程優(yōu)先級(jí)(參考:chapter9) 。
注意該寄存器是以MSB對(duì)齊的,因此stm32每個(gè)中斷的優(yōu)先級(jí)配置寄存器7:4位有效,3:0位無(wú)效。

對(duì)于優(yōu)先級(jí),CM3又分為搶占優(yōu)先級(jí)和亞優(yōu)先級(jí),
NVIC中的應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR)的優(yōu)先級(jí)分組(10:8)描述了如何劃分搶占優(yōu)先級(jí)和亞優(yōu)先級(jí)。
什么意思?以stm32為例,優(yōu)先級(jí)配置寄存器不是7:4位有效嗎,如果AIRCR中的優(yōu)先級(jí)分組值為4,則優(yōu)先級(jí)配置寄存器的7:5位確定搶占優(yōu)先級(jí),位4確定亞優(yōu)先級(jí)。此時(shí)所有中斷有8個(gè)搶占優(yōu)先級(jí),每個(gè)搶占優(yōu)先級(jí)有2個(gè)亞優(yōu)先級(jí)。
搶占優(yōu)先級(jí)高的中斷可以搶占搶占優(yōu)先級(jí)低的中斷,即搶占優(yōu)先級(jí)決定了中斷是否可以嵌套。
相同搶占優(yōu)先級(jí)的中斷不能嵌套,但當(dāng)搶占優(yōu)先級(jí)相同的異常有不止一個(gè)到來(lái)時(shí),就優(yōu)先響應(yīng)亞優(yōu)先級(jí)最高的異常。
參考附錄D
表D.9 中斷優(yōu)先級(jí)寄存器陣列 0xE000_E400 - 0xE000_E4EF 共240個(gè)。
表D.16系統(tǒng)異常優(yōu)先級(jí)寄存器 0xE000_ED18 - 0xE000_ED23 共12個(gè)。

優(yōu)先級(jí)相同,看中斷號(hào),中斷號(hào)小的優(yōu)先。

7.3 向量表
初始在0x00000000處,可以通過(guò)向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)更改,一般無(wú)需更改。

7.4 中斷輸入及掛起行為
需要看。

7.5 Fault異常
可不看。

7.6 SVC和PendSV
SVC主要用在分特權(quán)級(jí)和用戶(hù)級(jí)的操作系統(tǒng),ucosii不區(qū)分特權(quán)級(jí)和用戶(hù)級(jí),可以不管這個(gè)東西。

這里說(shuō)點(diǎn)題外話(huà),一開(kāi)始我很奇怪為什么會(huì)提供這種中斷,因?yàn)檫@種中斷一般都是用在大型的操作系統(tǒng)上,如linux系統(tǒng)上,可CM3又不提供MMU,應(yīng)該是無(wú)法移植linux系統(tǒng)。后來(lái)我才知道uclinux是針對(duì)沒(méi)有MMU的嵌入式系統(tǒng)而設(shè)計(jì)的,不過(guò)還是很懷疑有人會(huì)在像stm32這種芯片上用uclinux。

PendSV
PendSV中斷主要做上下文切換,也就是任務(wù)切換,是ucosii移植過(guò)程中最重要的中斷。
主要有兩點(diǎn):
1.PendSV中斷是手工往NVIC的PendSV懸起寄存器中寫(xiě)1產(chǎn)生的(由OS寫(xiě))。
2.PendSV中斷優(yōu)先級(jí)必須設(shè)為最低。

在講移植代碼時(shí)會(huì)介紹具體是如何做的。
對(duì)于7.6的PendSV部分應(yīng)認(rèn)真研讀一下。

chapter8 NVIC與中斷控制
NVIC負(fù)責(zé)芯片的中斷管理,它和CM3內(nèi)核緊密相關(guān)。
如果對(duì)于CM3中斷配置不是很了解,可以看看8.1, 8.2, 8.3, 8.4節(jié)。
8.7節(jié)講述了SysTick定時(shí)器,需要看。

chapter9 中斷的具體行為
9.1 中斷/異常的響應(yīng)序列
當(dāng)CM3開(kāi)始響應(yīng)一個(gè)中斷時(shí)
1.xPSR, PC, LR, R12以及R3‐R0入棧
2.取向量
3.選擇堆棧指針MSP/PSP,更新堆棧指針SP,更新連接寄存器LR,更新程序計(jì)數(shù)器PC

對(duì)移植ucosii來(lái)說(shuō),需要注意1,3

9.2 異常返回
在CM3中,進(jìn)入中斷時(shí),LR寄存器的值會(huì)被自動(dòng)更新。
9.6節(jié)對(duì)更新后的值進(jìn)行說(shuō)明。這里統(tǒng)稱(chēng)EXC_RETURN。
返回時(shí)通過(guò)把EXC_RETURN往PC里寫(xiě)來(lái)識(shí)別返回動(dòng)作的。
因?yàn)镋XC_RETURN是一個(gè)特殊值,所以對(duì)于CM3,匯編語(yǔ)言就不需要類(lèi)似reti這種指令,而用C語(yǔ)言開(kāi)發(fā)時(shí),不需要特殊編譯器命令指示一個(gè)函數(shù)為中斷服務(wù)程序。實(shí)際上,中斷服務(wù)程序如果是c代碼編寫(xiě),匯編成匯編代碼,函數(shù)結(jié)尾一般是reti。

9.3 嵌套的中斷
只要注意:中斷嵌套不能過(guò)深即可。

9.4和9.5
這兩節(jié)說(shuō)明CM3對(duì)中斷的響應(yīng)能力大大提高了,主要是硬件機(jī)制的改進(jìn)。
但對(duì)移植來(lái)說(shuō),并不需要關(guān)注。

9.6 異常返回值
對(duì)不同狀態(tài)進(jìn)入中斷時(shí),LR寄存器的值進(jìn)行說(shuō)明,需要看。
這里有一點(diǎn)需要注意,該點(diǎn)在講移植代碼時(shí)再介紹。

9.7和9.8
對(duì)移植來(lái)說(shuō),并不需要關(guān)注。

chapter10 Cortex-M3的低層編程
這一章僅需關(guān)注10.2節(jié),因?yàn)閷?duì)移植來(lái)說(shuō)匯編與C的接口是必須面對(duì)的。
10.2 匯編與C的接口
有兩點(diǎn)需要知道:
1.當(dāng)主調(diào)函數(shù)需要傳遞參數(shù)(實(shí)參)時(shí),它們使用R0‐R3。其中R0傳遞第一個(gè),R1傳遞第2個(gè)……在返回時(shí),把返回值寫(xiě)到R0中。
2.在函數(shù)中,用匯編寫(xiě)代碼時(shí),R0-R3, R12可以隨便使用,而使用R4‐R11,則必須先PUSH,后POP。

以上內(nèi)容和移植多少都有些關(guān)系,剛開(kāi)始看,可能不太明白,多看幾遍就好了。



關(guān)鍵詞: ucosiistm32移植詳

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉