1.1freeRTOS必备基础
涉及:
1,基础ARM指令
2,ARM压栈过程
3,汇编详细分析
文章目录
一、ARM基础知识?
SOC架构
数据在RAM里面
代码(指令)在FLASH中
内存只有读和写的功能

CPU进行加减运算的步骤

①把数据写入RAM中 ②再把变量a和b 的值读到CPU中 ③CPU将 a和b进行运算 ④把运算出来的值再赋值给a
1、汇编指令
读:load
LDR R0, [addr A]
将addr A的值读到 R0寄存器
LDR:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。
写: store
STR R0,[addr A]
将addr A的值写到 R0寄存器
STR:用于从源寄存器中将一个32位的字数据传送到存储器
加: ADD
ADD R0,R1,R2
R0=R1+R2
ADD:两数相加
减: SUB
SUB A,B //A=A-B;
功能: 两个操作数的相减,即从A中减去B,其结果放在A中.
出栈: push
push {R3,LR}//括号中的顺序不强制规定
作用: push寄存器:将一个寄存器中的数据入栈(写入内存)
写入内存的位置由SP指定
高编号的寄存器保存在高地址,低编号的寄存器保存在低地址
出栈:pop
pop {R3,PC}//读数据赋值给RC和PC
读数据从SP指向的位置读取数据

- R3=[SP]:读取R3中的数据
- SP递增
- PC=[SP]:读取LR (函数返回地址)
2、重要寄存器
高编号的寄存器保存在高地址,低编号的寄存器保存在低地
R0-R12:数据寄存器
调用C函数时 第一个参数保存在R0中 第二个参数保存在R1中
R13:SP:栈
R14:LR
- 跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复。
- 异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址
R15:PC
- 存放指令(函数)的地址 (后续会放入R0寄存器中)
3、汇编指令详解

4、栈:
发生中断时,会保存现场:值保存在栈中
栈的整体作用
(1)保存现场/上下文
(2)传递参数:汇编代码调用c函数时,需传递参数
(3)保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
需要保存哪些数值
C程序中的保存数值
1.任务切换的时候 寄存器都要保护
2.函数调用的时候只保存改变后的值
用于传参的寄存器则不需要保存如上面的R0 R1 R2
内核中的中断保存数值
cortex M3和M4
- 硬件保存一部分 R0 R1 R2 入栈
- 软件就保存用到的值
栈的大小取决于
- 局部变量的多少
- 调用深度
栈的内存从哪里分配
- freertos的栈 由一个巨大的 全局数组 分配
- 调用深度
二、freeRTOS系统注意事项
- 对于实时操作系统 高优先级的任务 永远优先执行(如果没有delay 将程序进入阻塞态 那实时操作系统就一直执行高优先级)
- 空闲任务(优先级通常较低)由调度器创建 会影响同样是0的优先级任务(相同优先级 空闲任务最后创建 所以最先执行)
- 空闲任务礼让:同等优先级 先等其他任务运行一次后 再运行空闲任务
- 在大于或 等于 优先级的时 如果任务1先创建 任务2后创建 就会先执行任务2

- 当任务 配置成 不抢占 不轮流 不礼让的时候
创建 顺序从左到右: 任务①<<任务②<<任务③<<空闲任务A
执行顺序如下:空闲任务 A 执行释放内存后 会礼让
空闲任务A << 任务① << 任务① << 任务①
一直会执行 任务①(可设置主动放弃入 即加入delay进入阻塞态就可以运行任务②)
不抢占就不会轮流执行 中断的优先级>任务优先级
版权声明:本文为qq_54806957原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。