IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> cortex寄存器及任务切换理解 -> 正文阅读

[嵌入式]cortex寄存器及任务切换理解

R0-r13 通用寄存器

r0-r3????用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。

? ? ? ? ? ? 被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。

r4-r11?被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。

r12????????是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。
?????????????

在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12

13????????是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。

MSP: 主堆栈指针,用于操作系统内核操作和异常处理例程,系统的硬件中断

PSP: 进程堆栈指针,用于用户的应用程序代码使用

r14????????是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复

r15????????是程序计数器 PC。它不能用于任何其它用途。
?????

注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4R11

SVC、PendSV异常

SVC 用于产生系统函数的调用请求操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件,用户程序想要控制特定的硬件时,它就会产生一个SVC 异常

区别

SVC异常是必须立即得到响应的(若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬fault——译者注),应用程序执行SVC 时都是希望所需的请求立即得到响应。

另一方面,PendSV 则不同,它是可以像普通的中断一样被抢占挂起的(不像SVC 那样会上访)。

操作系统 可以利用它缓期执行一个异常——直到其它重要的任务完成后才执行动作

PendSV是为系统设备而设的可悬挂请求pendable request)。

上下文切换 不能在中断中进行,会导致中断延期。为了解决这个问题,使用 PendSVPendSV可以挂起,也就是等到别的 ISR结束后缓期执行。

为了实现缓期执行PendSVPendSV一定要被设置为最低优先级的异常

挂起PendSV 的方法是:软件实现OSIntCtxSw()函数,向NVIC PendSV 悬起寄存器中写1

上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是:
1、执行一个系统调用
2、系统滴答定时器(SYSTICK)中断,(轮转调度中需要)

PendSV 来完美解决这个问题了。PendSV 异常会自动延迟上下文切换的请求,

直到其它的 ISR 都完成了处理后才放行。为实现这个机制,需要把 PendSV 编程为最低优先级的异常。如果 OS 检测到某 IRQ 正在活动并且被 SysTick 抢占,它将悬起一个 PendSV 异常,以便缓期执行上下文切换。如图 7.17 所示:

个中事件的流水账记录如下:

1. 任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)

2. OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。

3. 当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。

4. 当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。

5. 发生了一个中断,并且中断服务程序开始执行

6. 在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。

7. OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。

8. 当 SysTick 退出后,回到先前被抢占的 ISR 中, ISR 继续执行

9. ISR 执行完毕并退出后, PendSV 服务例程开始执行,并且在里面执行上下文切换

10. 当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。

理解图标的4个层次的切换关系

__asm void xPortPendSVHandler( void )
{
?? ?extern uxCriticalNesting;
?? ?extern pxCurrentTCB; ? ? ? ? ? ?/* 指向当前激活的任务 */
?? ?extern vTaskSwitchContext; ? ? ?
?
?
?? ?PRESERVE8
?
?
?? ?mrs r0, psp ? ? ? ? ? ? ? ? ? /* PSP内容存入R0 */ ? ?
?? ?isb ? ? ? ? ? ? ? ? ? ? ? ? ? /* 指令同步隔离,清流水线 */
?
?
?? ?ldr?? ?r3, =pxCurrentTCB ? ? /* 当前激活的任务TCB指针存入R2 */
?? ?ldr?? ?r2, [r3]
?
?
?? ?stmdb r0!, {r4-r11} ? ? ? ? ?/* 保存剩余的寄存器,异常处理程序执行前,硬件自动将xPSR、PC、LR、R12、R0-R3入栈 */
?? ?str r0, [r2]?? ??? ? ? ? /* 将新的栈顶保存到任务TCB的第一个成员中 */
?
?
?? ?stmdb sp!, {r3, r14} ? ? ? ? /* 将R3和R14临时压入堆栈,因为即将调用函数vTaskSwitchContext,调用函数时,返回地址自动保存到R14中,所以一旦调用发生,R14的值会被覆盖,因此需要入栈保护; R3保存的当前激活的任务TCB指针(pxCurrentTCB)地址,函数调用后会用到,因此也要入栈保护*/
?? ?mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY ? /* 进入临界区 */
?? ?msr basepri, r0
?? ?dsb ? ? ? ? ? ? ? ? ? ? ? ? /* 数据和指令同步隔离 */
?? ?isb
?? ?bl vTaskSwitchContext ? ? ? ?/* 调用函数,寻找新的任务运行,通过使变量pxCurrentTCB指向新的任务来实现任务切换 */
?? ?mov r0, #0 ? ? ? ? ? ? ? ? ? /* 退出临界区*/
?? ?msr basepri, r0
?? ?ldmia sp!, {r3, r14} ? ? ? ? /* 恢复R3和R14*/
?
?
?? ?ldr r1, [r3]
?? ?ldr r0, [r1]?? ??? ? ? ? /* 当前激活的任务TCB第一项保存了任务堆栈的栈顶,现在栈顶值存入R0*/
?? ?ldmia r0!, {r4-r11}?? ? ? ? /* 出栈*/
?? ?msr psp, r0
?? ?isb
?? ?bx r14 ? ? ? ? ? ? ? ? ? ? ?/* 异常发生时,R14中保存异常返回标志,包括返回后进入线程模式还是处理器模式、使用PSP堆栈指针还是MSP堆栈指针,当调用 bx r14指令后,硬件会知道要从异常返回,然后出栈,这个时候堆栈指针PSP已经指向了新任务堆栈的正确位置,当新任务的运行地址被出栈到PC寄存器后,新的任务也会被执行。*/
?? ?nop
}

?

【转】FreeRTOS高级篇4---FreeRTOS任务切换分析_好习惯成就伟大-CSDN博客_freertos任务切换

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 12:12:19  更:2021-12-07 12:14:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:59:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码