ARM64 怎么获取UCOSIII任务切换时当前任务执行哪个接口的PC值和LR值
时间: 2024-03-19 16:44:52 浏览: 23
要获取UCOSIII任务切换时当前任务执行哪个接口的PC值和LR值,需要在UCOSIII源码中进行修改。
首先,在UCOSIII的OS_TASK_SW()函数中,可以获取到前一个任务和当前任务的TCB(任务控制块):
```c
void OS_TaskSw(void)
{
OS_TCB *p_tcb;
p_tcb = OSTCBCur; /* Get pointer to current TCB */
if (p_tcb->OSTCBStat == OS_TASK_STAT_RDY) { /* Make sure task is still ready */
OS_RdyListRemove(p_tcb); /* Remove from ready list */
if (p_tcb != OSTCBHighRdy) { /* Add to new priority */
OS_RdyListInsertTail(p_tcb);
}
OSTCBHighRdy = OS_RdyListGetHighest(); /* Find new highest priority task */
if (OSTCBHighRdy != p_tcb) { /* Context switch only if new task is */
OS_SchedNew(); /* not the same as old task */
}
}
}
```
然后,在OS_SchedNew()函数中,可以获取到前一个任务和当前任务的堆栈指针(SP):
```c
void OS_SchedNew(void)
{
OS_TCB *p_tcb;
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER(); /* Enter critical section */
p_tcb = OSTCBHighRdy;
if (OSTCBCur != p_tcb) { /* No context switch if current task is */
/* highest priority task */
OSTCBCur = p_tcb; /* OSTCBCur now points to new task */
CPU_CRITICAL_EXIT(); /* Exit critical section */
OS_TASK_SW(); /* Perform a context switch */
} else {
CPU_CRITICAL_EXIT();
}
}
```
接着,在OS_TASK_SW()函数中,可以获取前一个任务和当前任务的LR值和PC值:
```c
void OS_TaskSw(void)
{
CPU_STK *p_sp;
OS_TCB *p_tcb;
CPU_SR_ALLOC();
p_tcb = OSTCBHighRdy;
if (OSTCBCur != p_tcb) { /* No context switch if current task is */
/* highest priority task */
OSTCBHighRdy = (OS_TCB *)0; /* Clear signal indicating context switch*/
p_sp = (CPU_STK *)OSTCBCur->OSTCBStkPtr; /* Load stack pointer */
p_tcb->OSTCBStkPtr = (void *)p_sp;
/* 在这里获取前一个任务和当前任务的LR值和PC值 */
CPU_CRITICAL_ENTER();
OSTaskCtxSwCtr++;
OSTCBCur = p_tcb;
CPU_CRITICAL_EXIT();
OS_TASK_SW(); /* Perform a context switch */
}
}
```
注意:修改UCOSIII源码需要谨慎操作,建议先备份原始代码。