This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6422:FreeRTOS 任务寄存器

Guru**** 2568565 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1570318/am6422-freertos-task-register

器件型号:AM6422


工具/软件:

您好、

   我们使用 SDK 8.6 在 FreeRTOS 操作系统下进行开发、 我们知道、在任务执行期间、高优先级任务会优先于低优先级任务、并且在此上下文切换期间会发生堆栈推送过程。 是否有任何函数或寄存器可用于确定每个任务的当前程序计数器? 具体而言、我们希望知道低优先级任务在尚未完成执行时的执行位置的值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、wanglili、

    我正在查看您的查询,你可能会期待在一两天内回复.

    此致、

    Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、wanglili、

    当 FreeRTOS 中发生上下文切换时:
    当前任务的 CPU 上下文(寄存器 R0–R12、LR、SPSR)被推入到该任务的栈中。
    更新后的栈指针 (SP) 存储在任务的任务控制块 (TCB) 成员 pxTopOfStack 中。
    因此、对于非运行任务、其程序计数器 (PC) 已经间接存储在其 TCB 栈帧中(通过保存的 LR 值)。
    FreeRTOS 中的每个任务都由一个结构表示:
    typedef 结构 tskTaskControlBlock

    Volatile StackType_t *pxTopOfStack;
    ...
    };

    当任务被抢占时、所有通用寄存器 (R0-R12)、LR (R14) 和状态寄存器都将压入堆栈中。
    然后、pxTopOfStack 指向此保存的上下文的顶部。
    因此、如果您从 pxTopOfStack 开始检查任务的栈存储器、可提取:
    •R0-R12
    •LR (R14)

    LR 寄存器包含返回地址,它实际上是占先时的 PC 值。
    方法:使用任务切换挂钩

    Enable tracing macros in your FreeRTOSConfig.h:
    #define configUSE_TRACE_FACILITY 1
    #define traceTASK_SWITCHED_OUT() myTaskSwitchedOutHook()
    
    
    void myTaskSwitchedOutHook(void)
    {
    TCB_t *pxTCB = (TCB_t *)pxCurrentTCB;
    uint32_t *stack = (uint32_t *)pxTCB->pxTopOfStack;
    uint32_t lr = stack[13]; // R14
    }
    
    


    每次关闭任务时、此挂钩都会执行、允许您动态记录被抢占的 PC。

    此致、

    Anil.