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