stm32|stm32 HardFault_Handler 异常的处理死机
关于stm32HardFault_Handler异常的处理死机转载▼
在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。
一般来说运行操作系统是以下几个问题
1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决
#define TASK_IO_SIZE300
#define TASK_IO_PRIO 6
OS_STKTASK_IO_STK[TASK_IO_SIZE];
比如修改300到 1000,做开发的时候如果ram允许,尽量大些,免的麻烦
2.数组溢出
这类问题一般在通信中,接受数据的时候,特别是长度不定的时候
比如协议为:开始功能码长度数据1数据2。。结束
长度决定了后面的数据多少,在分配接受缓冲的时候,突然来了个错误的长度比如255
但是我们分配buffer[100],只定义了100,这样数组就溢出了
所有在放数据之前要对长度进行判断是否合理,以后如果有长度或者索引就要想到溢出。。
3.使用了非法的指针,比如空指针,编译对的但是运行就错了
u8 *p = null;
*p = 1;
把0地址的数据强制设置为1,不错才怪
4.使用OS_ENTER_CRITICAL();
使用了 OS_ENTER_CRITICAL();
却忘了OS_EXIT_CRITICAL();
退出临界区
特别是在这个函数OS_ENTER_CRITICAL();
调用了子函数也有的这类情况,很容易忘记关闭的这样就造成了“死机现象”
【stm32|stm32 HardFault_Handler 异常的处理死机】 因此如果调用的话建议在函数中加入OS_CPU_SRcpu_sr = 0u;
局部变量在管理临界区os的内核程序也是这么用的,而且要注意,临界区一般用于全局变量的写操作,时间要非常快的,任务中的变量可以不用添加。
推荐阅读
- 基于stm32智能风扇|基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- stm32|基于STM32和freeRTOS智能门锁设计方案
- STM32F4|STM32F4 TIM6 TIM7 基本定时器
- Fourth|Fourth season fifth episode,Chandler likes Joey‘s new girlfriend???
- Python爬虫笔记|Python爬虫学习笔记_DAY_18_Python爬虫之handler处理器的使用【Python爬虫】
- LUA|单片机脚本语言移植lua到stm32MDK
- GO|GO http server (II) Server.Handler
- Netty核心概念之ChannelHandler&Pipeline&ChannelHandlerContext
- STM32 CUbeIDE 定时器中断使用
- STM32F1系列ADC电压采集