久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

stm32的Core_cm3.c文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104126 發(fā)表于 2016-1-23 00:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
參考了其它博客或資料,均已在最后列出。
      上一章提到了對(duì)于stm32的堆棧的研究。實(shí)際上在查詢資料時(shí),看到有大神提到可以獲取棧的指針。因?yàn)橐话阋?yàn)證都是存在棧溢出的問題,把他貼出來供大家研究。(我沒有實(shí)際驗(yàn)證)
  • void HardFault_Handler(void)
  • {
  •   uint32_t r_sp ;
  •   r_sp = __get_PSP(); //獲取SP的值
  •   PERROR(ERROR,Memory Access Error!);
  •   Panic(r_sp);
  •   while (1);
  • }
  • 獲取​進(jìn)程堆棧指針并打印出來!__get_PSP()函數(shù)為Core_Core_cm3.c中的函數(shù)。他這個(gè)函數(shù)解析一下供大家查看:
  • Core_cm3.c里面的東西
首先是匯編關(guān)鍵字__ASM和__INLINE的宏定義,支持不同的編譯器。由于使用的是Keil,所以就只看第一種,__CC_ARM
1. __ASMuint32_t__get_PSP(void):獲取進(jìn)程堆棧指針PSP。
2. __ASMvoid __set_PSP(uint32_ttopOfProcStack):設(shè)置PSP。
3. __ASM uint32_t__get_MSP(void):獲取主堆棧指針MSP。
4. __ASMvoid __set_MSP(uint32_tmainStackPointer):設(shè)置MSP。
5. __ASMuint32_t __REV16(uint16_tvalue):反轉(zhuǎn)半字中字節(jié)順序,如0xABCD反轉(zhuǎn)后得到0xCDAB。
6. __ASMint32_t __REVSH(int16_tvalue):反轉(zhuǎn)字節(jié)順序,并做符號(hào)拓展。就是在__REV16函數(shù)得到的結(jié)果上再進(jìn)行一次符號(hào)拓展。這兩個(gè)函數(shù)主要是方便進(jìn)行大小端的切換。
7. __ASMvoid__CLREX(void):清除由LDREX指令造成的互斥鎖。LDREX和STREX是Cortex用來實(shí)現(xiàn)互斥訪問,保護(hù)臨界資源的指令,LDREX執(zhí)行后,只有離它最近的一條存儲(chǔ)指令(STR,STREX)才能執(zhí)行,其他的存儲(chǔ)指令都會(huì)被駁回,而CLREX就是用于清除互斥訪問狀態(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_tbasePri):設(shè)置BASEPRI的值。
10.__ASM uint32_t__get_PRIMASK(void):PRIMASK是一個(gè)只有一位的寄存器,置位時(shí)屏蔽絕大部分的異常中斷,只剩下NMI和HardFault可以響應(yīng)。
11.__ASM void __set_PRIMASK(uint32_tpriMask):設(shè)置PRIMASK的值。
12.__ASM uint32_t __get_FAULTMASK(void):FAULTMASK也是一個(gè)只有一位的寄存器,為1時(shí)只有NMI才能響應(yīng),其他異常與中斷全部被屏蔽。
13.__ASM void __set_FAULTMASK(uint32_tfaultMask):設(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_tcontrol):設(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寄存器。

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 丁香婷婷在线视频 | 正在播放国产精品 | 亚洲精品免费在线观看 | 日韩精品成人 | 麻豆91av | 成人av免费 | 亚洲国产精品一区二区三区 | 欧美视频免费 | 欧美另类视频 | 亚洲一区二区精品视频 | 日韩毛片网 | 精品国产一级 | 亚洲国产一区二区在线 | 亚洲欧美视频 | 亚洲午夜视频在线观看 | 日日爱夜夜操 | 国产精品毛片一区二区在线看 | 欧美精品三区 | 中文字幕久久精品 | 免费在线成人 | 久久一区二区免费视频 | av网站免费观看 | 国产精品99| 国产精品精品久久久 | 欧美一区二区三区的 | 国产精品精品久久久 | 欧美日韩一区二区在线观看 | 91精品国产一区二区三区 | 天天干天天玩天天操 | 欧美另类视频 | 成人三级在线播放 | 国产91av视频| 99视频在线免费观看 | 国产精品成人一区二区 | 亚洲在线| 欧美在线一二三 | 国产精品一区二区在线 | 国产综合久久 | 亚洲欧美日韩一区二区 | 亚洲欧美一区二区三区情侣bbw | 黄色毛片免费看 |