新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32的Core_cm3.c文件

        stm32的Core_cm3.c文件

        作者: 時間:2016-11-10 來源:網絡 收藏
        上一章提到了對于stm32的堆棧的研究。實際上在查詢資料時,看到有大神提到可以獲取棧的指針。因為一般要驗證都是存在棧溢出的問題,把他貼出來供大家研究。(我沒有實際驗證)
        • voidHardFault_Handler(void)
        • {
        • uint32_tr_sp;
        • r_sp=__get_PSP();//獲取SP的值
        • PERROR(ERROR,MemoryAccessError!);
        • Panic(r_sp);
        • while(1);
        • }
        • 獲取?進程堆棧指針并打印出來!__get_PSP()函數為Core_Core_cm3.c中的函數。他這個函數解析一下供大家查看:
        • Core_cm3.c里面的東西

        首先是匯編關鍵字__ASM和__INLINE的宏定義,支持不同的編譯器。由于使用的是Keil,所以就只看第一種,__CC_ARM

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

        1. __ASMuint32_t __get_PSP(void):獲取進程堆棧指針PSP。

        2. __ASMvoid __set_PSP(uint32_t topOfProcStack):設置PSP。

        3. __ASM uint32_t __get_MSP(void):獲取主堆棧指針MSP。

        4. __ASMvoid __set_MSP(uint32_t mainStackPointer):設置MSP。

        5. __ASMuint32_t __REV16(uint16_t value):反轉半字中字節順序,如0xABCD反轉后得到0xCDAB。

        6. __ASMint32_t __REVSH(int16_t value):反轉字節順序,并做符號拓展。就是在__REV16函數得到的結果上再進行一次符號拓展。這兩個函數主要是方便進行大小端的切換。

        7. __ASMvoid __CLREX(void):清除由LDREX指令造成的互斥鎖。LDREX和STREX是Cortex用來實現互斥訪問,保護臨界資源的指令,LDREX執行后,只有離它最近的一條存儲指令(STR,STREX)才能執行,其他的存儲指令都會被駁回,而CLREX就是用于清除互斥訪問狀態的標記。

        8. __ASMuint32_t __get_BASEPRI(void):獲取BASEPRI寄存器的值,優先級號高于該寄存器的中斷都會被屏蔽(優先級號越大,優先級越低),為零時不屏蔽任何中斷。

        9. __ASMvoid __set_BASEPRI(uint32_t basePri):設置BASEPRI的值。

        10.__ASM uint32_t __get_PRIMASK(void):PRIMASK是一個只有一位的寄存器,置位時屏蔽絕大部分的異常中斷,只剩下NMI和HardFault可以響應。

        11.__ASM void __set_PRIMASK(uint32_t priMask):設置PRIMASK的值。

        12.__ASM uint32_t __get_FAULTMASK(void):FAULTMASK也是一個只有一位的寄存器,為1時只有NMI才能響應,其他異常與中斷全部被屏蔽。

        13.__ASM void __set_FAULTMASK(uint32_t faultMask):設置FAULTMASK的值。

        14.__ASM uint32_t __get_CONTROL(void):獲取CONTROL的值。寄存器CONTROL只有兩位。CONTROL[0]選擇特權級別,0為特權級,1為敵用戶級。CONTROL[1]用于選擇堆棧指針,0為MSP,1為PSP。

        15.__ASM void __set_CONTROL(uint32_t control):設置CONTROL寄存器的值。

        BASEPRI,PRIMASK,FAULTMASK,CONTROL都只能在特權模式下被修改。

        還有兩個文件,一個是Core_cmFunc.h和 Core_cmInstr.h這兩個文件時干嘛的,第一個文件是不同編譯器下的一些系統級的匯編函數,第二個文件是不同編譯器下的指令,我猜Keil公司這樣做是為了兼容不同的編譯器做設計的。

        最后剩下Core_cm3.h文件了,這個文件時內核文件,就是定義了一些Cortex-M3的寄存器和一些函數,包括NVIC,MPU,SCB,SysTick,Debug寄存器。



        關鍵詞: stm32Core_cm3.c文

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 晋中市| 延吉市| 无锡市| 正宁县| 石台县| 高邑县| 革吉县| 金山区| 丹寨县| 灵石县| 阿巴嘎旗| 谷城县| 册亨县| 佛教| 米泉市| 临漳县| 方正县| 定州市| 西城区| 定日县| 曲靖市| 佛山市| 余干县| 城步| 昭觉县| 汉源县| 喜德县| 启东市| 扶绥县| 伊川县| 延川县| 宁都县| 山丹县| 开封县| 额尔古纳市| 西乡县| 延长县| 宁河县| 新乡县| 兴义市| 华蓥市|