文件port.c

prvTaskExitError();任务退出错误,一个可能在任务里面写了return,另一个可能任务切换退出问题,入栈和出栈的时候出了问题。

 static void prvTaskExitError( void )
{
configASSERT( uxCriticalNesting == ~0UL );
portDISABLE_INTERRUPTS();
for( ;; );
}
找到这个函数是在哪里被调用的。
 StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
{
/* Simulate the stack frame as it would be created by a context switch
interrupt. */ /* Offset added to account for the way the MCU uses the stack on entry/exit
of interrupts, and to ensure alignment. */
pxTopOfStack--; *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
pxTopOfStack--;
*pxTopOfStack = ( StackType_t ) pxCode; /* PC */
pxTopOfStack--;
*pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ /* Save code space by skipping register initialisation. */
pxTopOfStack -= ; /* R12, R3, R2 and R1. */
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ /* A save method is being used that requires each task to maintain its
own exec return value. */
pxTopOfStack--;
*pxTopOfStack = portINITIAL_EXEC_RETURN; pxTopOfStack -= ; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ return pxTopOfStack;
}

从上面可以看出prvTaskExitError被赋值给了LR寄存器,也就是STM32的R14寄存器,这个寄存器是保存函数的返回地址的,就是函数被调用完成之后返回原来的位置。

pxPortInitialiseStack是任务建立xTaskGenericCreate的时候,堆栈初始化的。

分析看,任务退出的时候调用了prvTaskExitError函数,但是正常任务是个死循环,就算删除,也是调用删除函数,因此有两种情况可能出现
1. 任务没有 while(1)的死循环。
2. while(1)里面有break函数。
经过排查是2的问题,最终解决问题。
 
uxCriticalNesting是中断嵌套的计数
#define taskENTER_CRITICAL() portENTER_CRITICAL()临界区的进入和退出函数
进入临界区的时候,关闭中断,这个变量会加1,退出临界区的时候,使能中断,值减1.
 void vPortEnterCritical( void )
{
portDISABLE_INTERRUPTS();
uxCriticalNesting++;
if( uxCriticalNesting == )
{
configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == );
}
}

STM32运行FreeRTOS出现prvTaskExitError错误死机的更多相关文章

  1. windows server 2012 开机运行一段时间死机的故障

    环境: 物理机:华为2288 V5 虚拟化:esxi 6.5.2 虚拟操作系统 windwos server 2012 标准版 内安装sql server 和其他应用软件 故障描述:window se ...

  2. 关于stm32 HardFault_Handler 异常的处理 死机

    在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了 ...

  3. 【转】错误日志ID8021来源BROWSER导致电脑死机

    现场工控机死机,网上查了篇文章,具体原因还有待分析,下面是图 在这里有必要介绍两个ID号:6006和6005.在事件查看器里ID号为6006的事件表示事件日志服务已停止,如果你没有在当天的事件查看器中 ...

  4. 一则Gedit死机引起的错误之解决

    一次,虚拟机中CentOS不明原因死机了,终端打开不能操作,SecureCRT和从SecureCRT中运行的托关于本机Windows下的Xming下的gedit也死掉了,无奈只能强制关机.重新启动后其 ...

  5. 在mac上运行android的intel模拟器导致的死机问题解决

    最近用Mac开发android的时候遇到了一个烦人的问题,装上了HAXM,intel hardware accelerated execution manager以后,一运行android emula ...

  6. win7蓝屏死机0x0000003B错误蓝屏故障解决

    win7蓝屏死机0x0000003B错误蓝屏故障解决 刚才一个朋友问我:电脑蓝屏了怎么办. 我问他要了电脑的截图,自己看了错误代码:0x0000003B 搜索资料,查询了一番.都是说电脑中病毒或者是系 ...

  7. stm32串口收发导致的死机

    stm32串口收发导致的死机 很久以前有偶尔遇到过串口死机的情况,那是当时的我写出来的代码自己都觉得有问题,也就没注意.用了stm32做项目以后也就没遇到过了,今天做了个高压测试,每5ms定时发送一次 ...

  8. emwin之错误使用控件函数导致死机现象

    @2018-10-15 导致死机的代码示例如下 /** * @brief widget ID define * @{ */ #define ID_WINDOW_0 (GUI_ID_USER + 0x0 ...

  9. php-fpm死机解决办法,脚本后台自动重启

    本人用nginx+php7搭建了一台服务器,因为请求量太大,而且php里面又有挂起的任务,导致php-fpm在高峰期的时候经常死掉,吧php-fpm的最大进程数已经改到1000了,还是吃不消,cpu也 ...

随机推荐

  1. 【Java虚拟机结构(第1部分)数据类型】摘要

    <Java虚拟机规范(Java SE 7版)>作者:Tim Lindholm.Frank Yellin.Gilad Bracha.Alex Buckley 摘要:第二章 Java虚拟机结构 ...

  2. gluoncv voc_detection

    https://github.com/zhreshold/gluon-cv/commit/73b3986aaa2e0d0e6f3f428c12072e3a9d29905e gluoncv可能版本还没更 ...

  3. robotframwork数据库测试(一)——pymysql与pyodbc

    本章节仅总结一下使用pymysql与pyodbc链接MySQL数据库. 2个都可以链接mysql数据,进行增删改查.但是呢,使用pyodbc操作数据库,对中文支持度好一些.pymysql则需要处理一下 ...

  4. selenium + python自动化测试unittest框架学习(七)随机生成姓名

    在自动化测试过程中经常要测试到添加用户的操作,每次都要输入中文,原本是找了十几个中文写成了列表,然后从列表中随机取出填入用户名文本框中,随着测试的增加,发现同名的人搜索出来一大堆,最后在网上找了个随机 ...

  5. selenium以及浏览器驱动下载安装

    1.下载selenium压缩包 http://pypi.python.org/pypi/selenium 下载后压缩在python文件下的lib>site-package文件夹下 2.进入sel ...

  6. Loadrunner测试webservice协议总结

    Loadrunner测试webservice协议总结 一.协议选择 1.打开Virtual user generator,新建脚本,选择webservice协议

  7. myeclipse安装SVN插件方法

    http://www.cnblogs.com/xdp-gacl/p/3497016.html myeclipse安装SVN插件方法 SVM China 源代码托管中心 http://www.svnch ...

  8. .NET Core中基类可以反射子类的成员

    我们定义一个类DemoA,再定义一个类DemoB继承DemoA.当构造一个DemoB类对象后,我们可以通过其调用基类DemoA中的方法来反射子类DemoB的成员. 新建一个.NET Core控制台项目 ...

  9. Python 基础 高阶函数

    python 把函数作为参数 如果传入abs 作为参数 def add(x,y,y): return f(x) + f(y) add(-5,9,abs) 根据函数的定义,函数执行的代码实际上是. ab ...

  10. 将变量做为一个对象的key,push新增进一个数组

    var orgnIdListValue=["0","2"]; function arrayField(a,b){ let arrayMes=[]; for(va ...