你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

AliOS 任务上下文切换原理分析

[复制链接]
STMCU小助手 发布时间:2022-8-7 16:11
前言
一般来讲,MCU 相关的操作系统都具有最基本的多任务管理功能。多任务管理功能包含任务的上下文切换,因其涉及到特定寄存器的操作,都是使用汇编代码开发,相应代码由软件厂商提供。
在 STM32 技术人员的实际支持工作中,例如 IDE 移植,可能需要读懂和修改这些汇编代码。本文就是从这一需求出发,描述AliOS 操作系统里的任务上下文切换的基本原理。读者在明白了上下文切换原理后,去阅读和修改任何 MCU 操作系统的关于任务上下文切换的汇编代码就不会是个难题。本文包含的代码引用基于 STM32F4ARM Cortex-M4 内核)芯片上的实现。


上下文切换的源动力
带操作系统的应用程序,上下文切换的逻辑在 PendSV 中断处理函数中完成。 为什么是 PendSV 中断,而不是其它的中断?
ARM 技术文档里提到,PendSV 设计为上下文切换服务的中断请求,优先级最低。任务切换的策略可以根据时间片和优先级来制定。切换时机可由系统滴答时钟(SysTick)触发,或者由操作系统根据已有策略来触发 PendSV 中断。
以 AliOS 的系统时钟中断处理函数为例,则可以看到有如下代码:
  1. void SysTick_Handler(void)
  2. {
  3. HAL_IncTick();
  4. if (0 == HAL_GetTick() % 10) {
  5. krhino_intrpt_enter();
  6. krhino_tick_proc();
  7. krhino_intrpt_exit();
  8. }
  9. //HAL_SYSTICK_IRQHandler();
  10. }
  11. 其中 krhino_intrpt_exit 则会通过 cpu_intrpt_switch 触发 PendSV 中断,然后 PendSV 中断处理函数负责完成上下文切
  12. 换。cpu_intrpt_switch:
  13. LDR R0, =SCB_ICSR
  14. LDR R1, =ICSR_PENDSVSET
  15. STR R1, [R0]
复制代码


其中 krhino_intrpt_exit 则会通过 cpu_intrpt_switch 触发 PendSV 中断,然后 PendSV 中断处理函数负责完成上下文切换。
  1. LDR R0, =SCB_ICSR
  2. LDR R1, =ICSR_PENDSVSET
  3. STR R1, [R0]
  4. BX LR
复制代码


在 AliOS 中有很多地方,根据系统的需要,还可直接调用 cpu_task_switch 来触发 PendSV 中断。这一部分是纯软件的设计,不再列举。
  1. LDR R0, =SCB_ICSR
  2. LDR R1, =ICSR_PENDSVSET
  3. STR R1, [R0]
  4. BX LR
复制代码




上下文切换
上下文切换的汇编代码实现的功能就是把前一个与当前任务相关的寄存器信息进行压栈保存,比如当前栈指针、TCB 信息等,把将要运行的新任务的栈内信息恢复到对应寄存器中为新任务的执行做好准备。这里的上下文就是指各个寄存器信息。


寄存器分类
通用寄存器
R0-R12 是 32 位通用寄存器。
堆栈指针 SP
R13 是堆栈指针寄存器。堆栈分为复位后缺省使用的主堆栈(由 MSP 指向)以及用户应用程序使用的任务堆栈(由PSP 指向)。可以通过控制寄存器控制当前正在使用的堆栈。
链接寄存器 LR
R14 是链接寄存器,用在函数或者异常/中断返回。
程序计数器 PC
R15 是程序计数器。它指向当前运行的指令地址。
程序状态寄存器 xPSR
程序状态寄存器包含三个寄存器:应用程序状态寄存器 APSR, 中断程序状态寄存器 IPSR 和执行程序状态寄存器EPSRAPSR 包含上一条指令执行后的条件标志,IPSR 包含有中断号,EPSR 包含有被中断指令的待执行寄存器信息,诸LDMSTMPUSHPOP,或 IF-THEN 条件指令的信息以及当前是否运行在 Thumb 状态。
优先级掩码寄存器 PRIMASK1 位)
PRIMASK 置 1 后,系统阻止除 NMI 和 hard fault 外的所有异常/中断。
故障掩码寄存器 FAULTMASK1 位)
FAULTMASK 1 后,系统阻止除 NMI 外的 所有异常/中断。
基线掩码寄存器 BASEPRI9 位)
根据在 BASEPRI 中的优先级设置,系统阻止优先级小于等于它的所有异常/中断。
控制寄存器 CONTROL
CONTROL 寄存器控制在线程(THREAD模式下所处的特权级别(特权级还是用户级),以及当前系统使用的堆栈。中断处理(Handler)模式只能处于特权级,总是使用主堆栈(由 MSP 指向)。可以通过读出 SPSEL 位来进行验证。线程THREAD模式可以通过 CONTROL 寄存器切换是使用主堆栈(由 MSP 指向),还是任务堆栈(由 PSP 指向)



完整版请查看:附件


Analysis the principle of Alios task context switch.pdf

下载

345.93 KB, 下载次数: 0

收藏 评论0 发布时间:2022-8-7 16:11

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版