| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> FreeRTOS个人笔记-初谈CM3内核 -> 正文阅读 |
|
[嵌入式]FreeRTOS个人笔记-初谈CM3内核 |
根据个人的学习方向,学习FreeRTOS。由于野火小哥把FreeRTOS讲得比较含蓄,打算在本专栏尽量细化一点。作为个人笔记,仅供参考或查阅。 配套资料:FreeRTOS内核实现与应用开发实战指南、野火FreeRTOS配套视频源码、b站野火FreeRTOS视频、CM3权威指南。搭配来看更佳哟!!! ?? 下一节关于任务定义与任务切换,涉及很多CM3内核相关知识,特开展一节粗略谈谈。来自于CM3权威指南。 Cortex-M3 处理器拥有 R0-R15 的寄存器组,还有着一些特殊功能寄存器。其中 R13 作为堆栈指针 SP。SP 有两个,但在同一时刻只能有一个可以看到。 特殊功能寄存器:xPSR(程序状态寄存器,x=A、I、E)、中断屏蔽寄存器(PRIMASK、FAULTMASK、BASEPRI)、控制寄存器(CONTROL)程序状态寄存器:记录ALU标准(0标志,进位标志,负数标志,溢出标志),执行状态,以及当前正服务的中断号。
控制寄存器:
Handle模式中,CONTROL[1]总为0,CONTROL[0]可以选0或1。 因此,仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模式也有其它的方式:在异常返回时,通过修改 LR 的位 2,也能实现模式切换。 仅当在特权级下操作时才允许写CONTROL[0]。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。 NMI指不可屏蔽中断,当系统发生致命故障时,使用NMI。当发生NMI的因素时,不接受任何其他中断,启动紧急情况中断处理程序,并运行紧急情况处理程序软件。 异常(exception):打断程序顺序执行的事件。有 3 个系统异常:复位, NMI 以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。 操作模式和特权级别操作模式:Handle模式或Thread模式。用于区别普通应用程序的代码和异常服务例程的代码(包括中断服务例程的代码)。
通过引入特权级和用户级,就能够在硬件水平上限制某些不受信任的或者还没有调试好的程序,不让它们随便地配置涉及要害的寄存器,因而系统的可靠性得到了提高。进一步地,如果配了 MPU,它还可以作为特权机制的补充——保护关键的存储区域不被破坏,这些区域通常是操作系统的区域。举例来说,操作系统的内核通常都在特权级下执行,所有没有被MPU禁掉的存储器都可以访问。在操作系统开启了一个用户程序后, 通常都会让它在用户级下执行,从而使系统不会因某个程序的崩溃或恶意破坏而受损。 当前优先级被存储在 xPSR 的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。 既可以屏蔽优先级低于某个阈值的中断/异常(设置BASEPRI寄存器),也可以全体封杀(设置PRIMASK和FAULTMASK寄存器)。这是为了让时间关键( time-critical)的任务能在死线(deadline,或称最后期限)到来前完成,而不被干扰。
SVC和PendSVSVC(系统服务调用,亦简称系统调用)和 PendSV(可悬起系统调用),它们多用在上了操作系统的软件开发中。 SVC 用于产生系统函数的调用请求。例如,操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数,让用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就要产生一个SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。 NVICNVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外, NVIC 还包含了 MPU、 SysTick 定时器以及调试控制相关的寄存器。 所有 NVIC 的中断控制/状态寄存器都只能在特权级下访问。不过有一个例外——软件触发中断寄存器可以在用户级下访问以产生软件中断。所有的中断控制/状态寄存器均可按字/半字/字节的方式访问。 SYSTICKSysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号: 15)。在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 SysTick 是一个24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。 OS 都需要这种“滴答”来推动任务和时间的管理。如欲使能 SysTick 异常,则把 STCSR.TICKINT 置位。另外,如果把向量表重定位到了 SRAM 中,还需要为 SysTick 异常建立向量,提供其服务例程的入口地址。 异常与中断当CM3开始响应一个中断时,会有三个动作: 取向量:通过指令总线从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。即从向量表中找出对应的服务程序入口地址。入栈和取向量是同时进行的。 更新寄存器:在入栈和取向量操作完成之后,执行服务例程之前,还要更新一系列的寄存器: ? 在启动了中断返回序列后,下述的处理就将进行:
? 上实时操作系统要在 CM3 中创建可靠扛打的系统,必须两手抓,两手都要硬。典型情况下,一个真正健壮的 CM3 扩展小知识:Cortex-M3 只使用 Thumb-2 指令集。CM3 并不支持所有的 Thumb-2 指令, ARMv7-M 的规格书只要求实现 Thumb-2 的一个子集。 Cortex-M3 处理器使用一个 3 级流水线。流水线的 3 个级分别是:取指,解码和执行。 如果在程序执行的从头到尾,都只给每个中断提供固定的中断服务例程(这也是目前单片机开发的绝大多数情况),则可以把向量表放到 ROM 中。在这种情况下不需要运行时重建向量表。然而,如果想让自己的设备能随机应变地对付各种复杂情况,就常常需要动态地改变中断服务例程,更新向量表就是必需的了。此时,向量表必须被转移到可读写存储器中(如内存)。在把向量表重定位之前,往往要把现有的向量表往新的位置复制一份。需要拷贝的向量主要是系统异常的服务例程,如各种 fault 的、 NMI 的以及 SVC 的等等。如果没有建立好这些向量就启用了新的向量表,就可能会在响应异常时把不可预料的地址取出,程序极有可能跑飞。当我们把所有必要的向量都填好后,就可以启用了新的向量表了。然后继续往里面加入新的中断向量。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:33:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |