| |
|
开发:
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。它不能用于任何其它用途。 注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4~R11 SVC、PendSV异常 SVC 用于产生系统函数的调用请求,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件,用户程序想要控制特定的硬件时,它就会产生一个SVC 异常 区别 SVC异常是必须立即得到响应的(若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬fault——译者注),应用程序执行SVC 时都是希望所需的请求立即得到响应。 另一方面,PendSV 则不同,它是可以像普通的中断一样被抢占挂起的(不像SVC 那样会上访)。 操作系统 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作 PendSV是为系统设备而设的“可悬挂请求”(pendable request)。 上下文切换 不能在中断中进行,会导致中断延期。为了解决这个问题,使用 PendSV。PendSV可以挂起,也就是等到别的 ISR结束后缓期执行。 为了实现缓期执行PendSV,PendSV一定要被设置为最低优先级的异常。 挂起PendSV 的方法是:软件实现OSIntCtxSw()函数,向NVIC 的PendSV 悬起寄存器中写1。 上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是: 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 ) ? 【转】FreeRTOS高级篇4---FreeRTOS任务切换分析_好习惯成就伟大-CSDN博客_freertos任务切换 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |