原创 程序死在Freertos的vListInsert函数内for循环处的解决方法

2011-4-23 18:22 13658 14 14 分类: MCU/ 嵌入式

近来项目需要使用FreeRTOS和Lwip以及can,

开发平台:LM3S8962/9B96

os版本:FreeRTOS6.1.0

lwip版本使用1.3.2

 

现象:移植完毕后,程序运行一会,网络可以ping通,但一会就ping失败,shell也没有反应了;

做了一个tcp回显任务,转发收到的tcp数据包,用zlg的tcpudp工具发送1024自己tcp数据包,周期为100ms,也是很快就挂掉,发送周期延长到1s后,情况好点,十几分钟后也是一样挂掉;

分析:

debug跟踪到程序死在FreeRTOS的vListInsert函数中:

for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )

处不动了,解决问题的方法也就随之而来了:

在这个死循环处老外给出可能的原因:

/* *** NOTE ***********************************************************
  If you find your application is crashing here then likely causes are:
   1) Stack overflow -
      see http://www.freertos.org/Stacks-and-stack-overflow-checking.html
   2) Incorrect interrupt priority assignment, especially on Cortex M3
      parts where numerically high priority values denote low actual
      interrupt priories, which can seem counter intuitive.  See
      configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html
   3) Calling an API function from within a critical section or when
      the scheduler is suspended.
   4) Using a queue or semaphore before it has been initialised or

      before the scheduler has been started (are interrupts firing
      before vTaskStartScheduler() has been called?).
  See http://www.freertos.org/FAQHelp.html for more tips.
  **********************************************************************/

老办法,排除法:

1.首先排除1)堆栈益处,我的shell程序中随时监控堆栈的变化,发现堆栈每次都不会怎么变化,另外已经打开了堆栈溢出检测功能;

2.检查我的系统程序,也随之排除3)和4);

3.仔细剩下了问题3).原来又是优先级,查看所有使用的LM3S外设的终端优先级的设置情况,终于问题浮出水面,网口的终端优先级设置过高,不受FreeRTOS管理,另外一个老的项目can通信任务也发现跑了一会就死掉或者丢数据包,挂在此处,原因也是can接收的中断优先级也不受操作系统管理却使用了操作系统的服务函数(信号量);

至此问题解决,lwip终于抗住了tcp数据包1068字节100ms一次数据收发连续测试了10个小时;

我的can通信数据丢包也解决了;

文章评论0条评论)

登录后参与讨论
我要评论
0
14
关闭 站长推荐上一条 /2 下一条