cm0中断优先级_CM3任务切换详解 - coreyggj的个人空间 - OSCHINA - 中文开源技术交流社区...

任务切换,又称上下文切换(context switch)是实现操作系统的基础。

基于CM3实现任务切换必须要有以下2点概念认识

PendSV

PendSV叫做可悬起系统调用,与之相对的叫做系统服务调用(SVC)。

两者的区别是SVC异常必须在执行SVC指令后立即得到响应,如果因为优先级或者其他原因无法立即响应,就会上访成硬fault。而PendSV则可以像普通中断一样被悬起(pending),从而等待其他优先级更高的中断被响应完毕后执行。

在实现任务切换的操作系统中,往往会把PendSV的中断优先级设为最低。这样在进行任务切换时,只需要将PendSV悬起寄存器置位即可。PendSV的中断处理子程序会在所有高优先级中断响应完后开始进行任务切换。

在ucos中任务切换代码十分简单:

OSCtxSw

LDRR0,=NVIC_INT_CTRL

LDRR1,=NVIC_PENDSVSET //trigger PendSV

STRR1,[R0]

BXLR

相对应的PendSV处理函数:

OS_PendSV_Handler

CPSIDI

/* 寄存器保存和恢复 */

Save & Restore registers

CPSIEI

BXLR

堆栈操作

任务切换的本质是实现寄存器的保存和恢复。在CM3中通过堆栈操作能快速的进行任务切换,为OS节约下不小的开销。

1. 中断入栈

当CM3开始响应一个中断时,会硬件自动把xPSR、PC、LR、R12、R3 - R0压入堆栈中

2. 手动入栈

除了自动入栈的寄存器外,在任务切换中断子程序(PendSV ISR)中,我们还需要手动把R4 - R11压入堆栈中,从而实现完整现场保护。

旧SP(N - 0) 原先已压栈的内容

(N - 4) xPSR

(N - 8) PC

(N - 12) LR

(N - 16) R12

(N - 20) R3

(N - 24) R2

(N - 28) R1

(N - 32) R0

--------------------------- 手动入栈

(N - 36) R11

(N - 40) R10

(N - 44) R9

(N - 48) R8

(N - 52) R7

(N - 56) R6

(N - 60) R5

(N - 64) R4 ---> 新SP

在ucos可以看到响应的实现

OS_PendSV_Handler:

..........

//save

SUBSR0,R0, #0x20;8 registers

STMR0,{R4-R11}

..........

//restore

LDMR0,{R4-R11}

ADDSR0,R0,#0x20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值