datasheet

STM32单片机

文章数:282 被阅读:855874

账号入驻

AliOS任务上下文切换原理分析大公布!

2018-10-19
    阅读数:


前言

一般来讲,MCU相关的操作系统都具有最基本的多任务管理功能。多任务管理功能包含任务的上下文切换,因其涉及到特定寄存器的操作,都是使用汇编代码开发,相应代码由软件厂商提供。

在STM32技术人员的实际支持工作中,例如IDE移植,可能需要读懂和修改这些汇编代码。本文就是从这一需求出发,描述AliOS操作系统里的任务上下文切换的基本原理。读者在明白了上下文切换原理后,去阅读和修改任何MCU操作系统的关于任务上下文切换的汇编代码就不会是个难题。本文包含的代码引用基于STM32F4(ARM Cortex-M4内核)芯片上的实现。


上下文切换的源动力

带操作系统的应用程序,上下文切换的逻辑在PendSV中断处理函数中完成。 为什么是PendSV中断,而不是其它的中断? ARM技术文档里提到,PendSV设计为上下文切换服务的中断请求,优先级最低。任务切换的策略可以根据时间片和优先级来制定。切换时机可由系统滴答时钟(SysTick)触发,或者由操作系统根据已有策略来触发PendSV中断。


以AliOS的系统时钟中断处理函数为例,则可以看到有如下代码:

在AliOS中有很多地方,根据系统的需要,还可直接调用cpu_task_switch来触发PendSV中断。这一部分是纯软件的设计,不再列举。

上下文切换

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

寄存器分类


硬件管理的寄存器

在上下文切换的中断处理中,一部分寄存器由硬件管理。也就是说,在进入PendSV中断处理函数时一部分寄存器信息被自动压栈保存,在退出PendSV中断时这些寄存器自动被弹出。

根据ARM文档,在上下文切换中,不考虑浮点和考虑32个单精度或者16个双精度浮点寄存器两种情况下,由硬件管理的寄存器列表分别如下:

我们要特别注意主堆栈MSP以及任务堆栈PSP在这里的用法。

进入PendSV中断处理函数,与任务有关的硬件管理的寄存器信息被自动压栈进PSP中(因为任务是用户应用程序的一部分,因此使用的是任务堆栈);在退出PendSV时,是PSP里的相应内容被自动弹出。读者可以在中断之外查看CONTROL寄存器的SPSEL位,值为1表示的是当前任务使用任务堆栈(由PSP所指向)。读者可在PendSV的汇编代码里看到以下代码,目的是将PSP里的任务堆栈恢复:

但是,PendSV本身和所有其他的中断处理函数一样,使用的是主堆栈(由MSP指向)。这使我们不用担心中断处理函数是否弄脏了任务的堆栈,比如给任务堆栈添加了不必要的内容。这里值得一提的是,从逻辑上来说,使用一个堆栈指针就已经足够了。

软件管理的寄存器

不考虑浮点,则R4~R11和LR寄存器需要软件在中断处理函数里进行处理。软件管理的寄存器在压栈时,紧随在硬件管理的寄存器之后。栈是向地址减小的方向生长的。从这个角度来看,软件管理的寄存器在栈里处于更低的地址。若考虑浮点,则需要额外压栈浮点寄存器:D8~D15

在PendSV相应的压栈代码和弹栈代码如下:

锐利的读者可能已经注意到,软件和硬件都同时对LR进行了压栈。事实上,软件压栈的LR包含的是异常返回值EXC_RETURN,该值可指定异常返回时的堆栈(主堆栈还是用户堆栈)和处理器工作模式(用户模式还是特权模式)。

PendSV的处理流程

硬件管理的寄存器,不需要在PendSV函数里手动进行处理。另外,切换到第一个任务(没有更早的任务),也不需要保存当前任务的的寄存器信息到堆栈。已经保存有寄存器信息的堆栈栈顶指针,一般存在任务的控制结构里;以AliOS为例,在进入PendSV中断处理前已经将下一个任务的控制结构准备就绪,可以通过g_preferred_ready_task进行访问。

小结一下

对于AliOS操作系统,每个task在创建时用户都会为它指定一段存储区域作为物理上该任务的task_stack;PSP永远指向当前任务的task_stack;在任务切换时,执行PendSV:切换PSP,并且把内核的当前状态(寄存器组的值)保存到当前这个马上要被切走的老任务的task_stack -> 保存上下文@入栈,再把马上要被调度的新任务上下文恢复到内核的寄存器中 ->恢复上下文 @ 出栈。

总结

本文简单介绍了AliOS的任务上下文切换原理,包括哪些是硬件负责入栈和出栈的寄存器,哪些是软件负责入栈和出栈的寄存器,以及上下文切换的流程。理解MCU操作系统的上下文切换原理,有助于阅读操作系统厂商的汇编源代码,进行移植或者其它高级应用。


附录

官方技术笔记

原理开诚布公

↓↓↓ 更多细节和详情,请点击“阅读全文”。

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved