stm32 怎么进入 HARD_FAULT 中断

jiangxue11111 2018-04-11 04:24:44
各位大神 谁有可以直接使stm32f429 进入HARDFAULT中断的程序,小弟跪求!!! (我想模拟进入HARD_FAULT中断,锻炼解决此问题的办法),谢谢大家!
...全文
926 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dceacho 2018-04-12
  • 打赏
  • 举报
回复
用指针就可以了 uint32_t * ptr32=0xFFFFFFF1;//非4的整数倍或者指向一个不存在的物理地址; uint32_t tmp=*ptr32;
八档电风扇 2018-04-12
  • 打赏
  • 举报
回复
引用 4 楼 fhqlongteng的回复:
引用 3 楼 jiangxue11111 的回复:
谢谢 这个方法我试过了 包括除数为0;可是 一直没有进入到 hard_fault的中断! 我用的是IAR。
,这种方法是可以的,你不成功的原因中,程序代码可能很简单,buf[20]的占用的空间没有被其他程序使用,所有即使你非法写了后也不会造成影响。通过IAR查看你的程序的堆栈的内存范围,在程序把堆栈中的数据全部写一下,这样会访问到非法的地址空间,就会进入hardfault中断。
这个方法确实可以,不行就写个递归
八档电风扇 2018-04-12
  • 打赏
  • 举报
回复
stm32的堆栈大小设置在.s启动文件中,程序调试时好像看不到实时占用的堆栈大小,不知大哥们有啥办法没
Acuity. 2018-04-12
  • 打赏
  • 举报
回复
访问空指针即可(如数组内存越界)!
fhqlongteng 2018-04-11
  • 打赏
  • 举报
回复
引用 6 楼 jiangxue11111 的回复:
引用 4 楼 fhqlongteng 的回复:
[quote=引用 3 楼 jiangxue11111 的回复:] 谢谢 这个方法我试过了 包括除数为0;可是 一直没有进入到 hard_fault的中断! 我用的是IAR。
,这种方法是可以的,你不成功的原因中,程序代码可能很简单,buf[20]的占用的空间没有被其他程序使用,所有即使你非法写了后也不会造成影响。通过IAR查看你的程序的堆栈的内存范围,在程序把堆栈中的数据全部写一下,这样会访问到非法的地址空间,就会进入hardfault中断。
是的! 你说的我明白了! 谢谢你! 怎么查看程序堆栈的内存范围? [/quote]这个可以百度一下吧,一时说不清楚的。还有一个简单粗暴的办法,写你的CPU的RAM中数据全部改写一下也是同样的道理。从0x2000 0000地址开始向后到结束全部改写。
jiangxue11111 2018-04-11
  • 打赏
  • 举报
回复
引用 4 楼 fhqlongteng 的回复:
引用 3 楼 jiangxue11111 的回复:
谢谢 这个方法我试过了 包括除数为0;可是 一直没有进入到 hard_fault的中断! 我用的是IAR。
,这种方法是可以的,你不成功的原因中,程序代码可能很简单,buf[20]的占用的空间没有被其他程序使用,所有即使你非法写了后也不会造成影响。通过IAR查看你的程序的堆栈的内存范围,在程序把堆栈中的数据全部写一下,这样会访问到非法的地址空间,就会进入hardfault中断。
是的! 你说的我明白了! 谢谢你! 怎么查看程序堆栈的内存范围?
fhqlongteng 2018-04-11
  • 打赏
  • 举报
回复
还有对一些外设不正常的操作,比如对初始化串口时,不打开串口时钟,后面读写串口寄存器就会进入hard fault中断,这个根芯片的设计有关系,你用的芯片能不能出现这种现象得试一下,我没有试过这个芯片。
fhqlongteng 2018-04-11
  • 打赏
  • 举报
回复
引用 3 楼 jiangxue11111 的回复:
谢谢 这个方法我试过了 包括除数为0;可是 一直没有进入到 hard_fault的中断! 我用的是IAR。
,这种方法是可以的,你不成功的原因中,程序代码可能很简单,buf[20]的占用的空间没有被其他程序使用,所有即使你非法写了后也不会造成影响。通过IAR查看你的程序的堆栈的内存范围,在程序把堆栈中的数据全部写一下,这样会访问到非法的地址空间,就会进入hardfault中断。
fhqlongteng 2018-04-11
  • 打赏
  • 举报
回复
补充一句:程序中访问buf[20]的方法,就是向buf[20]中写入数据,读操作是不会产生异常的。
fhqlongteng 2018-04-11
  • 打赏
  • 举报
回复
这个很简单,让程序产生内存泄露就行了。比如定义一个数组unsigned char buf[10]; 程序中访问buf[20]之后就行导致芯片进入hardfault中断。 关于你想找到进入hardfault中断的原理,可以 详细查看cortex-M4内核的手册,学习中断时压入堆栈的寄存器原理,可以通过这种方法在程序进入hardfault中断后,查看堆栈中数据的方式查找到导致程序出问题的位置。
jiangxue11111 2018-04-11
  • 打赏
  • 举报
回复
谢谢 这个方法我试过了 包括除数为0;可是 一直没有进入到 hard_fault的中断! 我用的是IAR。
查看文章 STM32 keil mdk启动代码发分析_转2010年01月29日 星期五 13:50 ;// Stack Configuration ;// Stack Size (in Bytes) ;// Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0 Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0 __initial_sp ;//标号,代表堆栈顶部地址,后面有用 ;// Heap Configuration ;// Heap Size (in Bytes) ;// Heap_Size EQU 0x00000020 ;//定义堆空间大小 AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段,8字节对齐 __heap_base Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空间 __heap_limit ;//标号,代表堆末尾地址,后面有用 PRESERVE8 ;//指示编译器8字节对齐 THUMB ;//指示编译器为THUMB指令 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY ;//定义只读数据段,其实放在CODE区,位于0地址 EXTERN NMIException EXTERN HardFaultException EXTERN MemManageException EXTERN BusFaultException EXTERN UsageFaultException EXTERN SVCHandler EXTERN DebugMonitor EXTERN PendSVC EXTERN SysTickHandler ;//声明这些符号在外部定义,同C ;//在××it.c中实现这些函数 ,中断就能自动调用了 EXPORT __Vectors EXPORT __initial_sp ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用;I

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧