槑++ 2023-03-31 20:36 采纳率: 86.7%
浏览 36
已结题

uc/OS-II 用于任务切换的中断在什么时候恢复?

                OSCtxSwCtr++; /* Increment context switch counter             */
                OS_TASK_SW(); /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}

OS_TASK_SW(); 之后什么时候恢复 PC 寄存器?如果马上恢复,那就跳转到别的任务了,
OS_EXIT_CRITICAL 不就被忽略了吗?
用的的函数有下面这些

#define  OS_TASK_SW()         OSCtxSw()
OSCtxSw
        PUSH    {R4, R5}
        LDR     R4, =NVIC_INT_CTRL ;触发PendSV异常 (causes context switch)
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]
        POP     {R4, R5}
        BX      LR
#define  OS_CRITICAL_METHOD   3 //进入临界段的方法

#if OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}
#endif
OS_CPU_SR_Restore
    MSR     PRIMASK, R0 ;读取R0到PRIMASK中,R0为参数
    BX      LR ;返回

在 PendSV_Handler 结尾有

CPSIE   I ;开中断

还有,OSCtxSw 里面 POP {R4, R5},不是把刚刚 PendSV_Handler 对 R4-R11 的操作覆盖了吗?
谢谢~

  • 写回答

2条回答 默认 最新

  • test_boy001 2023-04-01 05:37
    关注

    在 ARM Cortex-M 架构中,当发生 PendSV 异常时,CPU 会自动将当前任务的寄存器内容保存到任务栈中,并切换到另一个任务的堆栈。在切换到另一个任务之前,CPU 会将任务栈指针保存到 PSP 寄存器中,以便切换回该任务时使用。

    在上述代码中,OS_TASK_SW() 宏会调用 OSCtxSw() 函数,在该函数中会触发 PendSV 异常,从而进行任务切换。在 PendSV_Handler 函数中,由于 CPU 已经自动保存了当前任务的寄存器内容,因此可以进行上下文切换操作。在上下文切换完成后,CPU 会自动从 PSP 寄存器中读取新任务的堆栈指针,并更新相关寄存器。

    在 PendSV_Handler 函数结尾处开中断是为了允许新任务在退出临界区后能够响应中断。因为在进入临界区时,CPU 会将 PRIMASK 寄存器中断开关位(第0位)设置为 1,从而禁止所有中断的响应。在退出临界区时,需要将 PRIMASK 寄存器恢复为先前的值,以便中断可以继续响应。

    至于 OSCtxSw() 函数中的 POP {R4, R5} 操作,其目的是为了恢复任务切换之前的堆栈指针和程序计数器(PC)的值。在触发 PendSV 异常后,CPU 会将 R0-R3、R12、LR 和 PSR 寄存器的值自动保存到当前任务的堆栈中,而 R4-R11 寄存器的值则会被保存到 PSP 寄存器指向的堆栈中。因此,在切换回原任务时,需要将 R4-R11 寄存器的值从任务栈中恢复回来。另外,由于 PC 寄存器的值也需要在任务切换时进行保存和恢复,因此 POP {R4, R5} 操作不会覆盖 PendSV_Handler 对 R4-R11 的操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 修改了问题 3月31日
  • 修改了问题 3月31日
  • 展开全部

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题