新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ucosii在stm32上的移植詳解1

        ucosii在stm32上的移植詳解1

        作者: 時間:2016-11-09 來源:網絡 收藏
        雖然目前網上已經有不少關于ucosiistm32上的移植版本,包括micrium也有官方移植版本。但這些版本具體是怎么移植出來的,又該怎么基于移植好的ucosii開發應用軟件,網上介紹的并不多。這里介紹一下我的移植經歷,希望對大家有所幫助。

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

        本文引用地址:http://www.104case.com/article/201611/318072.htm

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

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

        R13: 堆棧寄存器
        有兩個,MSP和PSP,同時只能看見一個
        引用R13時,引用的是正在使用的那個
        MSP:可用于異常服務和應用程序
        PSP:只能用于應用程序
        系統復位后,用的堆棧指針是MSP。

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

        R15: 程序計數寄存器,又名PC

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

        程序狀態字寄存器組(PSRs)分為
        應用程序 PSR(APSR)
        中斷號 PSR(IPSR)
        執行 PSR(EPSR)

        每個都是32位,由于這3個寄存器有效位是錯開的,因此可以組合訪問。

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

        控制寄存器(CONTROL)
        它有兩個作用:
        1.定義特權級別
        2.選擇當前使用哪個堆棧指針

        3.3 操作模式和特權極別
        操作模式: 處理者模式和線程模式
        異常處理:處理者模式
        主程序:線程模式

        ucosii不區分特權級和用戶級,程序始終工作在特權級
        這兩個堆棧指針的切換是全自動的,就在出入異常服務例程時由硬件處理。

        3.4 - 3.7
        沒什么好講的,需要看。

        3.8 復位序列
        0x00000000 MSP初值
        0x00000004 PC初值 復位向量

        chapter7 異常
        7.1 異常類型
        分為系統異常(編號1-15)和外部中斷(大于15)

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

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

        優先級相同,看中斷號,中斷號小的優先。

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

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

        7.5 Fault異常
        可不看。

        7.6 SVC和PendSV
        SVC主要用在分特權級和用戶級的操作系統,ucosii不區分特權級和用戶級,可以不管這個東西。

        這里說點題外話,一開始我很奇怪為什么會提供這種中斷,因為這種中斷一般都是用在大型的操作系統上,如linux系統上,可CM3又不提供MMU,應該是無法移植linux系統。后來我才知道uclinux是針對沒有MMU的嵌入式系統而設計的,不過還是很懷疑有人會在像stm32這種芯片上用uclinux。

        PendSV
        PendSV中斷主要做上下文切換,也就是任務切換,是ucosii移植過程中最重要的中斷。
        主要有兩點:
        1.PendSV中斷是手工往NVIC的PendSV懸起寄存器中寫1產生的(由OS寫)。
        2.PendSV中斷優先級必須設為最低。

        在講移植代碼時會介紹具體是如何做的。
        對于7.6的PendSV部分應認真研讀一下。

        chapter8 NVIC與中斷控制
        NVIC負責芯片的中斷管理,它和CM3內核緊密相關。
        如果對于CM3中斷配置不是很了解,可以看看8.1, 8.2, 8.3, 8.4節。
        8.7節講述了SysTick定時器,需要看。

        chapter9 中斷的具體行為
        9.1 中斷/異常的響應序列
        當CM3開始響應一個中斷時
        1.xPSR, PC, LR, R12以及R3‐R0入棧
        2.取向量
        3.選擇堆棧指針MSP/PSP,更新堆棧指針SP,更新連接寄存器LR,更新程序計數器PC

        對移植ucosii來說,需要注意1,3

        9.2 異常返回
        在CM3中,進入中斷時,LR寄存器的值會被自動更新。
        9.6節對更新后的值進行說明。這里統稱EXC_RETURN。
        返回時通過把EXC_RETURN往PC里寫來識別返回動作的。
        因為EXC_RETURN是一個特殊值,所以對于CM3,匯編語言就不需要類似reti這種指令,而用C語言開發時,不需要特殊編譯器命令指示一個函數為中斷服務程序。實際上,中斷服務程序如果是c代碼編寫,匯編成匯編代碼,函數結尾一般是reti。

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

        9.4和9.5
        這兩節說明CM3對中斷的響應能力大大提高了,主要是硬件機制的改進。
        但對移植來說,并不需要關注。

        9.6 異常返回值
        對不同狀態進入中斷時,LR寄存器的值進行說明,需要看。
        這里有一點需要注意,該點在講移植代碼時再介紹。

        9.7和9.8
        對移植來說,并不需要關注。

        chapter10 Cortex-M3的低層編程
        這一章僅需關注10.2節,因為對移植來說匯編與C的接口是必須面對的。
        10.2 匯編與C的接口
        有兩點需要知道:
        1.當主調函數需要傳遞參數(實參)時,它們使用R0‐R3。其中R0傳遞第一個,R1傳遞第2個……在返回時,把返回值寫到R0中。
        2.在函數中,用匯編寫代碼時,R0-R3, R12可以隨便使用,而使用R4‐R11,則必須先PUSH,后POP。

        以上內容和移植多少都有些關系,剛開始看,可能不太明白,多看幾遍就好了。



        關鍵詞: ucosiistm32移植詳

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 基隆市| 兴隆县| 景洪市| 墨玉县| 眉山市| 辽源市| 万山特区| 兴义市| 湖州市| 余庆县| 秀山| 五峰| 临江市| 邹城市| 香河县| 麦盖提县| 图木舒克市| 海宁市| 集贤县| 永康市| 本溪市| 新晃| 通江县| 射阳县| 广西| 咸丰县| 西藏| 郧西县| 富蕴县| 河池市| 嘉兴市| 祁阳县| 孟村| 颍上县| 屏山县| 静宁县| 山西省| 商水县| 镇雄县| 布尔津县| 关岭|