您的位置 首页 汽车

stm32的Core_cm3.c文件

上一章提到了对于stm32的堆栈的研究。实际上在查询资料时,看到有大神提到可以获取栈的指针。因为一般要验证都是存在栈溢出的问题,…

上一章说到了关于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

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寄存器。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/275388.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部