首页
学习
活动
专区
圈层
工具
发布
44 篇文章
1
[PyUserInput]模拟鼠标和键盘模拟
2
银行排队模拟(离散事件模拟)
3
Linux网络模拟
4
Linux TC(Traffic Control)作为损伤仪的基础配置和使用
5
深入学习Docker网络(看这篇就完全够了)
6
【鸿蒙 HarmonyOS】鸿蒙手机模拟器 ( 鸿蒙远程模拟器 | 鸿蒙远程模拟器运行手机应用 )
7
探索嵌入式应用框架(EAF)
8
多 OS 混合部署框架
9
嵌入式系统架构浅谈:编程设计模式 (一)---访问硬件的设计模式
10
事件驱动和消息驱动
11
原来 8 张图,就能学废 Reactor 和 Proactor
12
Linux df -h 命令hang住没有反应
13
kafka消费组信息采集异常(hang住)排查
14
ext4 io hung模拟脚本
15
解决 umount 命令卸载磁盘时busy/卡死的问题
16
程序卡死在void HardFault_Handler的解决办法
17
执行sed命令卡死CPU消耗100%一例分析
18
记一次因Redis使用不当导致应用卡死过程
19
字节对齐不慎引发的挂死问题
20
解引用NULL为什么会导致程序挂死?
21
记64位地址截断引发的挂死问题
22
websocket 在线工具_websocket添加请求头
23
【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器
24
详解Handler机制中消息队列的出队逻辑
25
Android UpdateEngine模块流程(含序列图)
26
物联网时代的嵌入式开发平台
27
400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
28
ESP32芯片IO解读
29
M5Stack在ubuntu上进行开发编译
30
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
31
H264,你不知道的小技巧
32
linux 创建虚拟块设备,制作文件系统并挂载,用于测试lustre
33
基于linux开发uvc摄像头_uvc协议扩展
34
清晰讲解LSB、MSB和大小端模式及网络字节序
35
在树莓派中使用 MicroPython 接入 MQTT
36
MicroPython 玩转硬件系列1:环境搭建
37
嵌入式系统架构浅谈:编程设计模式 (二)---嵌入并发和资源管理的设计模式
38
嵌入式软件架构设计之分层设计
39
IC之路(一)Proteus-Arduino仿真环境搭建
40
图像处理基础(六)-libjpeg常用算法
41
OpenCV双目标定
42
L-K光流推导及OpenCV代码实现
43
NDI Webcam Input工具,那些你不知道的知识!
44
使用QEMU chroot进行固件本地调试
清单首页其它文章详情

程序卡死在void HardFault_Handler的解决办法

  上午调试程序,把UWB的时间戳都转换成标准时间打出来了,但是发现,程串口输出一会之后就会停止,板子的灯也熄灭了。

  时间戳转换标准时间代码如下:

代码语言:javascript
复制
u8 TestBuff[150];
int OutCounter = 0;
double TxTimeStamp_Trans=0;

TxTimeStamp_Trans= (uint64_t)(((uint64_t)TxTimeStamp[4] << 32)
                  + (TxTimeStamp[3] << 24) + (TxTimeStamp[2] << 16) 
				  + (TxTimeStamp[1] << 8) + TxTimeStamp[0]);
OutCounter += sprintf((char*)&TestBuff[OutCounter], "发送时间戳为:%.9lf\r\n", TxTimeStamp_Trans*DWT_TIME_UNITS); 
USB_TxWrite(TestBuff,OutCounter);

  在主函数中,我也调用了USB_TxWrite来输出测距的信息。在发送回调函数中也调用了USB_TxWrite来输出信息。所以串口输出有点乱。刚开始我猜测是两个USB_TxWrite输出干扰导致的程序卡死。后来我在发送回调函数中把USB_TxWrite改成printf输出。程序还是会卡死。所以不是上述想法不成立。

  手动单步调试,发现代码在如下位置停了下来。程序进入未定义异常中断。

代码语言:javascript
复制
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

  看注释是硬件错误。查看了我的LR寄存器,发现是一个未知的地址:0xfffffffe,这个地址明显不存在。后来猜测应该是错误访问了硬件的空间。 下午回来继续分析代码,看了下自己写的代码,发现TestBuff的大小为定值。而OutCounter 大小返回的是打印到字符缓冲区中的字符数目。这个值是一直改变的。所以程序有个发生数组越界。   为了很快能看到是否发生了数组越界,将TestBuff的大小设置成50,然后使用printf输出OutCounter 的大小。最终发现在OutCounter 为60的时候程序停了下来,进入了HardFault_Handler。验证我们的猜测是正确的。   下面是修改代码,利用指针和calloc动态申请数组的大小就好了。

代码语言:javascript
复制
u8 *TestBuff;
int OutCounter = 0;
double TxTimeStamp_Trans=0;
TxTimeStamp_Trans= (uint64_t)(((uint64_t)TxTimeStamp[4] << 32)
				  + (TxTimeStamp[3] << 24) + (TxTimeStamp[2] << 16) 
                  + (TxTimeStamp[1] << 8)  + TxTimeStamp[0]);
TestBuff = (u8*)calloc(sizeof(TxTimeStamp_Trans*DWT_TIME_UNITS)+14,sizeof(u8));
OutCounter += sprintf((char*)&TestBuff[OutCounter], "接收时间戳为:%.9lf\r\n", TxTimeStamp_Trans*DWT_TIME_UNITS); 
USB_TxWrite(TestBuff,OutCounter);
free(TestBuff);/*一定记得释放申请的空间*/
下一篇
举报
领券