前言

如果对硬件任务内核切换不感兴趣的同学可以跳过。

由于任务源码分析开始涉及到接口层,所以在学习源码前,先了解下posix接口层的设计。

本系列接口层会讲解两个:

  1. posix标准接口。因为本教程demo在linux上跑freertos时实际使用的就是这个接口。
  2. cortex m3/m4架构接口。因为这才是真正设计到ARM架构硬件的接口。且,这个网上资料较多,看不懂本作者的笔记也可以找度娘辅助分析。

强烈建议:

  1. 涉及到接口,建议找到对应的架构权威指南学习,掌握底层原理。
  2. 对于指向学习系统应用的同学,快速移植,直接在freertos原生代码中找到结构层进行替换即可。

参考:

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异常处理的更多相关文章

  1. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  2. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  3. 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别

    ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...

  4. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  5. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  6. 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 ...

  7. ARM Cortex M3(V7-M架构)硬件启动程序 二

    解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...

  8. Python[小甲鱼-002用Python设计第一个游戏]

    –Code——————————————————————- print("----------第一个小游戏----------") temp = input("猜一下我现在 ...

  9. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

随机推荐

  1. ssh 主机之间免密配置脚本

    文章目录 单向免密 `expect` 免交互 `sshpass` 免交互 相互免密 单向免密 expect 免交互 注意修改脚本内的 your_password 为 远程主机用户的密码 脚本内的 &q ...

  2. 使用Sinopia部署私有npm仓库

    使用Sinopia部署私有npm仓库 [root@localhost ~]# hostnamectl set-hostname --static npm-server [root@npm-server ...

  3. service与systemctl命令比较

    本文将比较 linux 的 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较. 从 CentOS 7.x 开始,CentOS 开始使用 systemd 服 ...

  4. python控制浏览器上传文件

    自动化爬虫方法和库很多,难点大多数在登录.可以大致分为:普通验证码,扫码登录,QQ一键登录,拖动验证,无痕验证,人工识别(比如12306登录) 万能大法可以破解一切以上需求,自动控制浏览器行为 参考文 ...

  5. swagger 2.0

    1.引入jar包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox- ...

  6. mysql linux 导出数据

    1.mysql -hxx -uxx -pxx -e 'select "" name from a' db数据库 > file 2.导出的文件notepad++打开 3.新建e ...

  7. 强力推荐!五款能让你成为Excel“高手”的Excel插件

    excel是大家日常生活中经常用到一款表格软件,虽然软件本身的功能已经非常齐全了,但是插件可以进一步加强软件的功能,为用户提供更好的体验,提高工作效率,需要的用户快来看看吧. 1.Smartbi 首推 ...

  8. c语言结构体中的一个char数组怎么赋值?

    目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...

  9. c语言刷 设计题合计

    355. 设计推特 #define MAX_LEN 512 struct User { int userId; int followee[MAX_LEN]; // 散列表,0/1,1表示这个user被 ...

  10. Centos部署Loki日志聚合系统

    关于一些日志聚合由来及原理科普见我的另外一篇 <编程入门之日志聚合系统> https://www.cnblogs.com/uncleguo/p/15948763.html Loki日志聚合 ...