LPC1768运行threadx数组越界导致出现硬件错误死机问题的排查

移植了threadx后运行发现程序莫名跑飞,停留在 HardFaultHandler 即硬件错误异常
LPC1768运行threadx数组越界导致出现硬件错误死机问题的排查_第1张图片调试过程中发现在汇编启动文件启动后跳转main函数即刻就发生了错误异常,先排除是在操作系统运行过程中的问题,而且是硬件错误异常所以先对导致改错误的可能进行排查,考虑到和产生硬件错误异常相关的几种可能1.数组越界操作 2.内存溢出,访问越界 3.堆栈溢出,程序跑飞 4.中断处理错误;先是修改了启动文件中的栈大小,于事无补后可能存在数组越界访问查看定义的全局变量中的数组,修改了线程字节池大小最终操作系统能正常启动。
对于编译生成的各个段大小进行分析:
在这里插入图片描述这段信息是一个程序的大小分析报告,通常在编译或链接过程中生成,用于显示程序的代码和数据段在存储器中所占用的大小。下面对每个部分的含义进行解释:

Code=61200: 这表示代码段(程序的可执行指令)的大小为 61200 字节。代码段包含程序的实际执行代码,包括函数、指令和逻辑。这个数值表示程序的机器指令数量。

RO-data=5960: 这表示只读数据段的大小为 5960 字节。只读数据段包含程序中的常量数据,如字符串、常数等,这些数据在程序运行期间不可修改。

RW-data=1196: 这表示读写数据段的大小为 1196 字节。读写数据段包含在程序运行时可以被修改的数据,如全局变量、静态变量等。

ZI-data=69024: 这表示零初始化数据段的大小为 69024 字节。零初始化数据段包含了在程序运行时需要被初始化为零值的变量。

这些数字表示了不同数据段在存储器中的大小,用字节(Bytes)为单位。这些信息对于了解程序在存储器中的占用情况以及可能需要的存储器容量非常有用。通常情况下,程序的大小分析报告还会包括其他信息,如栈大小、堆大小等,以帮助开发人员进行存储器管理和优化。
需要的RAM为(1196+69024)/1024=68.57KByte
LPC1768运行threadx数组越界导致出现硬件错误死机问题的排查_第2张图片而查阅了LPC1768的RAM只有64K导致了,排查程序中的数组发现字节池数组中的值为[60*1024],可能会导致数组越界问题
LPC1768运行threadx数组越界导致出现硬件错误死机问题的排查_第3张图片

修改大小后发现ZI段只有二十几KByte了

linking...
Program Size: Code=61200 RO-data=5944 RW-data=1196 ZI-data=28060  
FromELF: creating hex file...
"..\Output\threadx.axf" - 0 Error(s), 3 Warning(s).
Build Time Elapsed:  00:00:04

运行正常。
所以这个算是一个比较典型的数组越界导致的死机问题。

你可能感兴趣的:(杂记,单片机,c语言,汇编)