freertos里面用到的汇编语言总结

汇编语言基础知识

      • 多重存储器访问
      • MRS 和 MSR
      • isb 和 dsb
      • ldr 和 str
      • mov
      • bl 和 bx
      • cps

多重存储器访问

在这里插入图片描述

感叹号!表示要自增(Increment)或自减(Decrement)基址寄存器 Rd 的值,时机是在每次访问前(Before)或访问后(After)。增/减,单位:字(4字节)。

Ldr R1,=0x10000000          //传送数据的起始地址0x10000000        LDMIA R1!,{R0,R4-R6}         //从左到右加载,相当于 LDR R0,10000000  LDR R4,10000004... .../*传送后地址加+4,所以R0=0X10000000地址里的内容,地址加4,R4=0X10000004地址里的内容,地址加4,R5=0X10000008地址里的内容,地址加4,R6=0X1000000C 地址里的内容,地址加4,由于!,最后的地址写回到R1中,所以R1=0X10000010   */

MRS 和 MSR

这两条指令是访问特殊功能寄存器的“绿色通道”—当然必须在特权级下。

MRS <Rn>, <SReg> ;加载特殊功能寄存器的值到 Rn 
MSR <Sreg>,<Rn> ;存储 Rn 的值到特殊功能寄存器

在这里插入图片描述

指定 PSP 进行更新的例子:

LDR R0, =0x20008000 
MSR PSP, R0 
BX LR ;如果是从异常返回到线程状态,则使用新的 PSP 的值作为栈顶指针

isb 和 dsb

isb:如果某个程序从下一条要执行的指令处更新了自己,但是先前的旧指令已经被预取到流水线中去了,此时就必须清洗流水线,把旧版本的指令洗出去,再预取新版本的指令。因此,必须在被更新代码段的前面使用 ISB,以保证旧的代码从流水线中被清洗出去,不再有机会执行。

DSB:如果把向量表重定位到了RAM中,且这块RAM所在的存储器区域是写缓冲的,向量更新就可能被延迟。为了以防万一,必须在建立完所有向量后追加一条“数据同步隔离(DSB)” 指令,以等待缓冲写入后再继续,从而确保所有数据都已落实。

DSB:如果存储器的映射关系,或者内存保护区的设置可以在运行时更改,就必须在更改之后立即补上一条 DSB 指令(数据同步指令)。因为对 MMU/MPU 的写操作很可能会被放到一个写缓冲中。写缓冲是为了提高存储器的总体访问效率而设的,但它也有副作用,其中之一,就是会导致写内存的指令被延迟几个周期执行,因此对存储器的设置不能即刻生效,这会导致紧临着的下一条指令仍然使用旧的存储器设置。

在这里插入图片描述

ldr 和 str

用于访问存储器的基础指令是“加载(Load)”和“存储(Store)”。

ldr命令:把数据从内存加载到寄存器。

ldr r0, =addr	;r0 = addr
ldr r1, [r0]		; r1 = *r0 r0指向的内容给r1
ldr r1, [r0, #4]	; r1 = *(r0+4)
ldr r1, [r0, #4] !	; r1 = *(r0+4);r0=r0+4;
ldr r1, [r0], #4	; r1 = *(r0);r0=r0+4;

str命令:把数据从寄存器保存到内存。

str r1, [r0]		; *r0 = r1 r1的值作为r0的内容
str r1, [r0, #4]	; *(r0+4) = r1 
str r1, [r0, #4] !	; *(r0+4) = r1;r0=r0+4;
str r1, [r0], #4	; *r0 = r1;r0=r0+4;

在这里插入图片描述

LDR R3, =MY_NUMBER ; R3= MY_NUMBER 
LDR R4, [R3] ; R4= *R3,也就是把R3指向的内容给R4

汇编器通常都支持”LDR Rd, = imm32”伪指令。(LDR内涵挺多)

LDR r0, =0x12345678

mov

MOV 寄存器加载数据,既能用于寄存器间的传输,也能用于加载立即数。

MOV R8,    R3     ;把 R3 的数据传送给 R8
MOV R0, #0x12     ;16位指令 MOV 支持 8 位立即数加载

bl 和 bx

BL 转移并连接。用于呼叫一个子程序,返回地址被存储在 LR 中。

子程呼叫与无条件转移指令:

BL Label ;转移到 Label 处对应的地址,并且把转移前的下条指令地址保存到 LR
BX reg  ;转移到由寄存器 reg 给出的地址

在BX中,reg的最低位指示出在转移后,将进入的状态是ARM(LSB=0)还是Thumb(LSB=1)。 既然 CM3 只在 Thumb 中运行,就必须保证 reg 的 LSB=1。关于bx这个指令,前面中断部分也有讲到。

cps

为了快速地开关中断,CM3 专门设置了 CPS 指令,有 4 种用法:

CPSID I ;PRIMASK=1, ;关中断
CPSIE I ;PRIMASK=0, ;开中断
CPSID F ;FAULTMASK=1, ;关异常
CPSIE F ;FAULTMASK=0 ;开异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

freertos内核 任务定义与切换 原理分析

freertos内核 任务定义与切换 原理分析主程序任务控制块任务创建函数任务栈初始化就绪列表调度器总结任务切换主程序 这个程序目的就是&#xff0c;使用freertos让两个任务不断切换。看两个任务中变量的变化情况(波形)。 下面这个图是任务函数里面delay(100)的结果。 下面这个…

freertos临界段保护

freertos临界段保护中断的基础知识cortex-m里面开中断、关中断指令关中断和开中断进入临界段和退出临界段中断的基础知识 嵌套&#xff1a; 嵌套向量中断控制器 NVIC(Nested Vectored Interrupt Controller与内核是紧耦合的。提供如下的功能&#xff1a;可嵌套中断支持、向量…

改进版的CBOW模型

复习 首先复习一下之前的CBOW笔记。 采用推理的方法认知单词、CBOW模型这里面主要是&#xff1a; CBOW模型的核心思路&#xff1a;给出周围的单词&#xff08;上下文&#xff09;时&#xff0c;预测目标词处会出现什么单词。 要用神经网络处理单词&#xff0c;需要先将单词…

freertos空闲任务、阻塞延时

freertos空闲任务、阻塞延时空闲任务阻塞延时SysTick实验现象阻塞态&#xff1a;如果一个任务当前正在等待某个外部事件&#xff0c;则称它处于阻塞态。 rtos中的延时叫阻塞延时&#xff0c;即任务需要延时的时候&#xff0c;会放弃CPU的使用权,进入阻塞状态。在任务阻塞的这段…

树莓派配置

树莓派配置1.安装操作系统2.修改镜像源3.配置VNC连接1.安装操作系统 安装操作系统&#xff0c;首先在官网下载https://www.raspberrypi.com/software/operating-systems/ 下载出来的解压后是一个光盘映像文件&#xff0c;接下来就需要把这个文件写入到树莓派的tf卡里。 安装树…

远程桌面连机器人

这里需要PC和机器人处于同一局域网下。 PC使用xhell连接机器人&#xff0c;通过 ifconfig 查看机器人的无线 IP 地址。 然后退出xshell&#xff0c;打开NoMachine软件进行远程桌面连接。输入机器人无线ip地址。 输入用户名和密码 然后就远程连接上了 现在开一个终端如下所示&…

RNNLM

RNNLM 基于RNN的语言模型称为RNNLM(Language Model)。 Embedding 层&#xff1a;将单词ID转化为单词的分布式表示&#xff08;单词向量&#xff09;。 RNN层&#xff1a;向下一层(上方)输出隐藏状态&#xff0c;同时也向下一时刻的RNN层(右边)输出隐藏状态。 对于“you say …

使用c#制作赛尔号登录器

使用c#制作赛尔号登录器 需求&#xff1a; 打开赛尔号官网&#xff0c;发现我的chrome浏览器无法运行Flash。这是因为Adobe 公司放弃了对 Flash Player 的支持。 那么如果我想要玩游戏&#xff0c;又不想下载别的浏览器&#xff0c;只好自己写一个登陆器了。 创建项目 首先…

普通RNN的缺陷—梯度消失和梯度爆炸

之前的RNN&#xff0c;无法很好地学习到时序数据的长期依赖关系。因为BPTT会发生梯度消失和梯度爆炸的问题。 RNN梯度消失和爆炸 对于RNN来说&#xff0c;输入时序数据xt时&#xff0c;RNN 层输出ht。这个ht称为RNN 层的隐藏状态&#xff0c;它记录过去的信息。 语言模型的任…

LSTM的结构

RNN和LSTM 简略表示RNN层&#xff1a;长方形节点中包含了矩阵乘积、偏置的和、tanh函数的变换。将下面这个公式表示成一个tanh节点。 LSTM&#xff1a;Long Short-Term Memory&#xff08;长短期记忆&#xff09;&#xff0c;长时间维持短期记忆。 LSTM与RNN的接口(输入输出)…

STM32 USART 补充

串口通讯的数据包&#xff1a;发送设备通过自身的TXD接口传输到接收设备的RXD接口。 串口通讯的协议层中&#xff0c;规定了数据包的内容&#xff0c;由起始位、主体数据、校验位、停止位组成&#xff0c;通讯双方的数据包格式要约定一致才能正常收发数据。 异步通讯&#xf…

ROS TF变换

静态坐标转换&#xff1a;机器人本体中心到雷达中心的转换。因为激光雷达可能没安装到机器人的中心。 动态坐标转换&#xff1a;机器人中心和里程计坐标的变换。机器人从起点出发后&#xff0c;里程计坐标相对于本体就会产生一个偏移&#xff0c;这个偏移随着机器人的运动不断…

ROS底盘控制节点 源码分析

先在机器人端通过launch文件启动底盘控制。 robot:~$ roslaunch base_control base_control.launch ... logging to /home/jym/.ros/log/3e52acda-914a-11ec-beaa-ac8247315e93/roslaunch-robot-8759.log Checking log directory for disk usage. This may take a while. Pres…

ROS + OpenCV

视觉节点测试 先进行一些测试。并记录数据。 圆的是节点&#xff0c;方的是话题。 1.robot_camera.launch robot:~$ roslaunch robot_vision robot_camera.launch ... logging to /home/jym/.ros/log/bff715b6-9201-11ec-b271-ac8247315e93/roslaunch-robot-8830.log Check…

ROS+雷达 运行数据记录

先测试一下雷达&#xff0c;记录数据。方便接下来分析源码。 1.roslaunch robot_navigation lidar.launch robot:~$ roslaunch robot_navigation lidar.launch ... logging to /home/jym/.ros/log/7136849a-92cc-11ec-acff-ac8247315e93/roslaunch-robot-9556.log Checking l…

ROS 找C++算法源码的方法

在gmapping的launch文件中看到&#xff0c;type“slam_gmapping”&#xff0c;这里的slam_gmapping是c编译后的可执行文件。 如果想要修改gmapping算法&#xff0c;就需要找到slam_gmapping的c源码。 但是这是用apt下载的包&#xff0c;是二进制类型的&#xff0c;没有下载出…

ros 雷达 slam 导航 文件分析

ros 雷达 slam 导航 文件分析robot_slam_laser.launchrobot_lidar.launchlidar.launchraplidar.launchkarto.launchgmapping.launchcartographer.launchrobot_navigation.launchmap.yamlmap.pgmamcl_params.yamlmove_base.launchcostmap_common_params.yamllocal_costmap_param…

Apprentissage du français partie 1

Apprentissage du franais partie 1 键盘转换图&#xff1a; 字母&#xff1a;26个 元音字母&#xff1a;a、e、i、o、u、y b浊辅音(声带)-p清辅音 d-t 音符 音符&#xff1a;改变字母发音。 &#xff1a;闭音符 [e] &#xff1a;开音符 /ε/ &#xff1a;长音符 /ε/…

stm32基本定时器

定时器分类 stm32f1系列&#xff0c;8个定时器&#xff0c;基本定时器(TIM6,7)、通用定时器(TIM2,3,4,5)、高级定时器(TIM1,8)。 基本定时器&#xff1a;16位&#xff0c;只能向上计数的定时器&#xff0c;只能定时&#xff0c;没有外部IO 通用定时器&#xff1a;16位&#…

stm32高级定时器 基础知识

stm32高级定时器 高级定时器时基单元&#xff1a; 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT&#xff0c;可向上/下计数 一个16位可编程预分频器PSC&#xff0c;预分频器时钟源有多种可选&#xff0c;有内部的时钟、外部时钟。 一个8位的重复计数器 RCR&…