【freertos】002-posix模拟器设计与cortex m3异常处理
前言
如果对硬件任务内核切换不感兴趣的同学可以跳过。
由于任务源码分析开始涉及到接口层,所以在学习源码前,先了解下posix接口层的设计。
本系列接口层会讲解两个:
- posix标准接口。因为本教程demo在linux上跑freertos时实际使用的就是这个接口。
- cortex m3/m4架构接口。因为这才是真正设计到ARM架构硬件的接口。且,这个网上资料较多,看不懂本作者的笔记也可以找度娘辅助分析。
强烈建议:
- 涉及到接口,建议找到对应的架构权威指南学习,掌握底层原理。
- 对于指向学习系统应用的同学,快速移植,直接在freertos原生代码中找到结构层进行替换即可。
参考:
- ARM开发官网:http://infocenter.arm.com/
- 《The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors_c.pdf》
- 李柱明博客:https://www.cnblogs.com/lizhuming/p/16062486.html
posix 标准接口层设计
模拟器不涉及到CPU寄存器组。
模拟器的系统心跳
RTOS系统周期是使用ITIMER生成的,并且信号仅被传递给当前执行的pthread。
RTPS系统滴答信号处理器增加滴答计数,并选择下一个RTOS任务上下文。
它恢复该线程,并向自己发送一个信号来暂停。
挂起仅在系统滴答信号处理程序退出时进行处理,因为信号已排队。
模拟器的task底层实质
FreeRTOS模拟器的实现是简单地包装平台本地线程,所有切换任务上下文的调用将调用OS挂起和恢复线程API。
这个模拟器使用Posix条件变量和Signals来控制底层Posix线程的执行。
信号可以异步地传递给线程,这样它们就会中断目标线程的执行,而挂起的线程则会等待条件变量恢复。
模拟器的任务切换原理
当一个新的Task被创建时,一个pthread被创建为Task的执行上下文。
pthread立即挂起自己,并将执行返回给创建者。
当一个pthread挂起时,它正在pthread_cond_wait调用中等待,这个调用被阻塞,直到它收到一个恢复信号pthread_cond_signal。
任务可以通过协作调用taskYIELD()或RTOS系统Tick调度两种方式。
在这个模拟器中,通过恢复下一个任务上下文(由FreeRTOS Scheduler决定)和挂起当前上下文(两者之间进行简短的握手)来切换Task上下文。
cortex M3/M4异常处理
参考:《The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors_c.pdf》
读者可以翻看cortex m3/m4的权威指南查看更多细节即可,本教程只粗略说明下异常时栈帧的动态过程。
CPU寄存器组可自行百度。
双堆栈指针
Cortex-M3内核有两个堆栈指针:
- MSP:主堆栈指针,是给系统栈空间使用的。
- PSP:进程堆栈指针,是给任务栈使用的。
在FreeRTOS任务中,所有栈空间的使用都是通过PSP指针进行指向的。
一旦进入了中断函数以及可能发生的中断嵌套都是用的MSP指针。
双操作模式
Cortex-M3支持两种操作模式(handler模式和thread模式),这两种模式是为了区别正在执行代码的类型:
- handler模式为异常处理程序的代码。
- 线程模式为普通应用程序的代码。
栈帧
异常后硬件压栈部分:
- 下图描述的是启用或需要双字栈对齐调整时,Cortex-M3或Cortex-M4处理器(不带浮点)的栈帧。
- 双字栈对齐这个特性是AAPCS规则的一个要求,意思是栈指针的数值在函数入口或出口处应该是双字对齐,若未对齐,异常硬件压栈时会自动插入一个字来保证双字对齐。(了解即可)

注意,异常时硬件压栈的LR值和函数调用时的函数栈帧中的LR值是不一样的,具体可以了解下EXC_RETURN。
EXC_RETURN
进入异常服务程序以后,LR的值被自动更新为特殊的EXC_RETURN(只有[3:0]位有意义,其他位都为1)。如图说明:

| 位段 | 意义 |
|---|---|
| 3 | 0:返回后进入Handler模式 1:返回后进入线程模式 |
| 2 | 0:从主堆栈中执行出栈操作,返回后使用MSP 1:从进程栈中执行出栈操作,返回后使用PSP |
| 1 | 保留,必须为0 |
| 0 | 0:返回ARM状态 1:返回Thumb状态(在CM3中必须为1) |
有效值如下:

如主程序在线程模式下运行,并且在使用PSP时被中断,则在服务程序中LR=0xFFFFFFFD(主程序被打断前LR已被自动入栈)。
异常及异常嵌套时LR动态及栈指针使用过程:下图是线程模式使用进程栈为基础:

【freertos】002-posix模拟器设计与cortex m3异常处理的更多相关文章
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors
Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...
- ARM Cortex M3(V7-M架构)硬件启动程序 二
解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...
- Python[小甲鱼-002用Python设计第一个游戏]
–Code——————————————————————- print("----------第一个小游戏----------") temp = input("猜一下我现在 ...
- stm32和cortex M3学习内核简单总结
1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...
随机推荐
- 简单的springboot + vue
安装vue 脚手架 npm install -g @vue/cli 查看vue 版本 vue -V 创建vue项目 vue create vue_project Vue CLI v4.5.13? Pl ...
- SpringMVC的web配置
之前并没有意愿写关于下面内容的小作文.因为总结SPI相关的标准(SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),而这个也是关于标准的,Servlet3.0 ...
- 添加删除系统右键菜单(就是上下文菜单,也就是Context Menu)中的一些选项
随着电脑安装的东西越来越多,右侧菜单也原来越长,很不方面.所以打算清理一下 我删除的大约以下几个,友好一点的都可以配置.当然也可以通过注册表直接删除. 特:注册表备份,即导入导出,避免一失足成千古恨. ...
- RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭!
什么是 RPC RPC,英文 RangPaCong,中文让爬虫,旨在为爬虫开路,秒杀一切,让爬虫畅通无阻! 开个玩笑,实际上 RPC 为远程过程调用,全称 Remote Procedure Call, ...
- JDK动态代理为什么必须要基于接口?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...
- NSSCTF-error
打开网页出现一个输入框,尝试使用127.0.0.1发现只是回显我们输入的内容 尝试进行注入,输入数字1会回显没有提示......,order by进行判断列数,得到有三列 接着就是正常注入的思路,使用 ...
- Apache-log4j漏洞复现
前言:昨天晚上当我还在睡梦中时,圈内爆出了核弹级的漏洞,今天我复现一下, 再开始前我们先建立一个maven项目,将pom.xml文件导入 <?xml version="1.0" ...
- 广州市首批!Smartbi入库信创产品资源池,引领国产BI软件崛起
为贯彻落实软件高质量发展战略,加快建设有影响力的信息技术创新(简称"信创")资源池,广州市工业和信息化局经征集申报.专家评审.现场考察等多个环节,发布了"广州市信息技术应 ...
- 【windows 操作系统】什么是窗口?|按钮也是窗口
起因 在看操作系统消息机制的时候,看到一句化:全局消息队列把消息发送到窗口所在的线程消息队列.突然就怀疑起了窗口的意思.于是就有这边基类. 文章来源:https://docs.microsoft.co ...
- maven-mvnd安装使用
目录 安装使用 官方介绍 使用注意 安装使用 下载 https://github.com/apache/maven-mvnd/releases/tag/0.7.1 ,mvnd-0.7.1-darwin ...