在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            stm32的Core_cm3.c文件

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

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

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

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

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

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

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

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

            6. __ASMint32_t __REVSH(int16_t value):反轉(zhuǎn)字節(jié)順序,并做符號(hào)拓展。就是在__REV16函數(shù)得到的結(jié)果上再進(jìn)行一次符號(hào)拓展。這兩個(gè)函數(shù)主要是方便進(jìn)行大小端的切換。

            7. __ASMvoid __CLREX(void):清除由LDREX指令造成的互斥鎖。LDREX和STREX是Cortex用來(lái)實(shí)現(xiàn)互斥訪問(wèn),保護(hù)臨界資源的指令,LDREX執(zhí)行后,只有離它最近的一條存儲(chǔ)指令(STR,STREX)才能執(zhí)行,其他的存儲(chǔ)指令都會(huì)被駁回,而CLREX就是用于清除互斥訪問(wèn)狀態(tài)的標(biāo)記。

            8. __ASMuint32_t __get_BASEPRI(void):獲取BASEPRI寄存器的值,優(yōu)先級(jí)號(hào)高于該寄存器的中斷都會(huì)被屏蔽(優(yōu)先級(jí)號(hào)越大,優(yōu)先級(jí)越低),為零時(shí)不屏蔽任何中斷。

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

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

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

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

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

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

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

            BASEPRI,PRIMASK,F(xiàn)AULTMASK,CONTROL都只能在特權(quán)模式下被修改。

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

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



            關(guān)鍵詞: stm32Core_cm3.c文

            評(píng)論


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

            關(guān)閉