前言

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

由于任务源码分析开始涉及到接口层,所以在学习源码前,先了解下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. [LeetCode]35.搜索插入位置(Java)

    原题地址: search-insert-position 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使 ...

  2. Jenkins项目迁移JOB

    Jenkins项目迁移JOB:从旧的迁移到新的Jenkins上 北京介绍 今天由于迁移Jenkins服务器,需要完全拷贝Jenkins里的Job. 经实验,直接在服务器上移动Jobs目录下的文件即可. ...

  3. Java的Future接口

    Java的Future接口 Java 中的 Future 接口和其实现类 FutureTask,代表了异步计算的结果. 1. Future接口简介 Future 是异步计算结果的容器接口,它提供了下面 ...

  4. 攻防世界之Web_supersqli

    题目 本题考查sql注入传送门https://www.cnblogs.com/shacker/p/15917173.html 按照SQL注入一步一步执行 发现有2个列 然后用union select联 ...

  5. ☕Java 面向对象进阶内容

    目录 == 和 equals 方法 封装 多态 抽象类和抽象方法 抽象方法 抽象类 抽象类的使用要点 接口 接口使用 内部类 String 字符串常量拼接时的优化 String Pool String ...

  6. ASP.NET Core 6框架揭秘实例演示[13]:日志的基本编程模式[上篇]

    <诊断跟踪的几种基本编程方式>介绍了四种常用的诊断日志框架.其实除了微软提供的这些日志框架,还有很多第三方日志框架可供我们选择,比如Log4Net.NLog和Serilog 等.虽然这些框 ...

  7. C#中default 、base 、this关键字用法简介

     C#中default关键字用法简介 default 关键字可在switch语句或泛型代码中使用.switch语句:指定默认标签.泛型代码:指定类型参数的默认值.对于引用类型为空,对于值类型为零swi ...

  8. Java课程设计---安装解压版mysyql

    1.解压 将mysql-5.7.13-winx64.rar解压到C盘根目录.(将原有data文件夹清空,注意是清空,不是删除data文件夹) 2. 配置环境变量MYSQL_HOME (参照java打开 ...

  9. tp6微信公众号开发者模式基础消息

    官方文档 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages ...

  10. CA周记 2022年的第一课 - Rust

    现代编程语言有很多,在我的编程学习里面有小学阶段的 LOGO , 中学阶段的 Pascal ,也有大学阶段的 C/C++.Java..NET,再到工作的 Objective-C .Swift.Go.K ...