• STM32运行FreeRTOS出现prvTaskExitError错误死机


    文件port.c

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

    1 static void prvTaskExitError( void )
    2 {
    3 configASSERT( uxCriticalNesting == ~0UL );
    4 portDISABLE_INTERRUPTS();
    5 for( ;; );
    6 }
    找到这个函数是在哪里被调用的。
     1 StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
     2 {
     3     /* Simulate the stack frame as it would be created by a context switch
     4     interrupt. */
     5 
     6     /* Offset added to account for the way the MCU uses the stack on entry/exit
     7     of interrupts, and to ensure alignment. */
     8     pxTopOfStack--;
     9 
    10     *pxTopOfStack = portINITIAL_XPSR;    /* xPSR */
    11     pxTopOfStack--;
    12     *pxTopOfStack = ( StackType_t ) pxCode;    /* PC */
    13     pxTopOfStack--;
    14     *pxTopOfStack = ( StackType_t ) prvTaskExitError;    /* LR */
    15 
    16     /* Save code space by skipping register initialisation. */
    17     pxTopOfStack -= 5;    /* R12, R3, R2 and R1. */
    18     *pxTopOfStack = ( StackType_t ) pvParameters;    /* R0 */
    19 
    20     /* A save method is being used that requires each task to maintain its
    21     own exec return value. */
    22     pxTopOfStack--;
    23     *pxTopOfStack = portINITIAL_EXEC_RETURN;
    24 
    25     pxTopOfStack -= 8;    /* R11, R10, R9, R8, R7, R6, R5 and R4. */
    26 
    27     return pxTopOfStack;
    28 }

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

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

    分析看,任务退出的时候调用了prvTaskExitError函数,但是正常任务是个死循环,就算删除,也是调用删除函数,因此有两种情况可能出现
    1. 任务没有 while(1)的死循环。
    2. while(1)里面有break函数。
    经过排查是2的问题,最终解决问题。
     
    uxCriticalNesting是中断嵌套的计数
    #define taskENTER_CRITICAL() portENTER_CRITICAL()临界区的进入和退出函数
    进入临界区的时候,关闭中断,这个变量会加1,退出临界区的时候,使能中断,值减1.
    1 void vPortEnterCritical( void )
    2 {
    3 portDISABLE_INTERRUPTS();
    4 uxCriticalNesting++;
    5 if( uxCriticalNesting == 1 )
    6 {
    7 configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
    8 }
    9 }
  • 相关阅读:
    OpenStack--Havana
    腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
    Java 脚本化编程指南
    hive的表的基本操作
    如何搭建易企秀H5平台?
    HDU 4727-The Number Off of FFF
    审计厅审计云发展意见
    CNPM 遇到use strict的问题
    QA技术概览
    终端的CTRL+S 解说
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8041990.html
Copyright © 2020-2023  润新知