历史上的今天
今天是:2024年10月17日(星期四)
2018年10月17日 | stm32 HardFault_Handler 异常的处理死机
2018-10-17 来源:eefocus
在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。
一般来说运行操作系统 是以下几个问题
1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决
#define TASK_IO_SIZE 300
#define TASK_IO_PRIO 6
OS_STK TASK_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(); 调用了子函数 也有的这类情况,很容易忘记关闭的这样就造成了“死机现象”
因此如果调用的话 建议在函数中加入OS_CPU_SR cpu_sr = 0u;局部变量 在管理临界区 os的内核程序也是这么用的 ,而且要注意,临界区一般用于全局变量的写操作,时间要非常快的,任务中的变量可以不用添加 。
史海拾趣
|
我用的是Wince5.0+EVC开发,怎么实现用程序设置网络呢? 我用的是Wince5.0+EVC开发,怎么实现用程序设置无线网络呢? 如设置Wep加密,设置IP地址,DHCP等,请大家给个思路啊… 查看全部问答> |
|
项目到了后期,我开始一点点整理程序,把一些最初草率直接在调用处写的短函数封装成子函数。就在这些我觉得无关紧要的改动以后,前几天我发出一个最新的测试版本,居然反馈回来一个非常奇怪的现象,在那边,主从机无法通讯!可是我办公室这边却好好 ...… 查看全部问答> |
|
很详细的c函数介绍文档,我一直把他当做工具书来用,分享给大家! 如果哪位大侠把这个网页式的工具做成chm格式的电子书就完美了,哈哈 截图,先睹为快 [ 本帖最后由 HOHO 于 2012-8-8 16:42 编辑 ]… 查看全部问答> |
|
用IAR 8.3编译TI BLE Stack遇到Segment ISTACK Too Long的解决方案 IAR 8.3以后的版本编译TI BLE Stack会报类似如下的错误Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. At least 0xe more bytes needed. The problem occurred while processing the segment ...… 查看全部问答> |
|
本帖最后由 gsy 于 2014-8-7 09:28 编辑 在百度上找了一个一键开关机: 如图: 图片暂时穿不上去,大神可以打开百度文库看一下原设计: http://wenku.baidu.com/link?url=hejs6NaNltr5IFum5PADzn_bMsg8W2qyvWC8OhzBhF2NgP45GHiHf_Iae26pLmom7M ...… 查看全部问答> |




