UCOS与LWIP使用过程中遇到的问题(1)
硬件环境:F103ZET6,DM9000
软件环境:ucosii,lwip1.4.1
在开发mqtt应用的时候,遇到如下问题:
(1)程序进入 HardFault_Handler ,并且没有什么规律,有时候运行几小时,有时候运行数天才会进入,日志输出lwip的断言错误:Assertion "tcp_write: pbufs on queue => at least one queue non-empty" failed at line 329 in ..\LWIP\lwip-1.4.1\src\core\tcp_out.c
(2)调用过程如下:
解决过程:
(一)查看堆栈
(1)通过Keil的Register Window查看MSP地址
(2)打开Memory Window,查看内存
按照网上查的资料,堆栈内的地址分别为(可能与CPU有关):R0,R1,R2,R3,R12,LR,PC 。在Disassembly中跳转到PC指向的地址,发现提示 OSStartHang 错误。
在网上查OSStartHang错误,都在说同一个问题,就是PendSVHandler中断与ucos中的OSPendSV冲突,检查自己的配置发现没有这个问题。
问题没有解决,继续找原因吧。
(二)怀疑堆栈空间不足
(1)在startup_stm32f10x_hd.s 文件中查看栈区大小为:Stack_Size EQU 0x00000400
(2)在 .map文件中查看 __initial_sp 0x2000e5e8 Data 0 startup_stm32f10x_hd.o(STACK)
(3)计算下栈底位置:0x2000e5e8 - 0x00000400 = 0x2000E1E8
(4)在Memory Window中查看 0x2000E1E8 ,发现还有很多未使用空间
(5)结果排除栈空间不足的问题
(三)在网上查资料,发现一篇文章,有点启发
貌似是因为TCP/IP 任务的优先级较高,在调用过程中出现了任务调度冲突了,自己尝试改一下 。
未完待续......