Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTOS
内核技术
ARM汇编
操作系统内核技术研究:ARM汇编指令
发布于 2021-07-23 22:08:19 浏览:1560
订阅该版
[tocm] [入门学习笔记 - 目录](https://club.rt-thread.org/ask/article/3420.html) [操作系统内核技术研究:开篇](https://club.rt-thread.org/ask/article/2905.html) [操作系统内核技术研究:环境搭建](https://club.rt-thread.org/ask/article/2906.html) [操作系统内核技术研究:ARM汇编指令](https://club.rt-thread.org/ask/article/2913.html) [操作系统内核技术研究:STMFD与LDMFD的使用](https://club.rt-thread.org/ask/article/2914.html) [操作系统内核技术研究:任务上下文切换](https://club.rt-thread.org/ask/article/2918.html) [操作系统内核技术研究:线程切换与运行](https://club.rt-thread.org/ask/article/2919.html) ## 启动文件 - 测试平台:STM32F103,ARM架构,需要了解ARM的汇编指令,了解MCU上电后的启动流程。 - 启动流程主要是硬件上电到进入main主函数之间的过程。 - STM32使用ST HAL库开发时,可以使用ST HAL库中提供的启动文件,如:【startup_stm32f101xe.s】。 - 汇编语言编写。Keil MDK、gcc、IAR编译平台,略有不同,这里只选择Keil MDK平台的。 ![2021-06-26_170715.png](https://oss-club.rt-thread.org/uploads/20210723/3ec9d9d59732efdb599d46ab06ee3823.png) ![2021-06-26_170916.png](https://oss-club.rt-thread.org/uploads/20210723/5b347acd48aae1a53b8186eb04380a11.png.webp) - 掌握一些基础的汇编指令的使用方法,并且可以自己写几个汇编函数,能读懂启动文件。 - 研究RTOS开发技术,需要掌握更多的汇编指令,可以手动编写平台移植相关的汇编函数 - 这里熟悉几个启动文件中常用的且重要的汇编指令。 ## 汇编语法 - 汇编文件,经常以.s 或 .S结尾 - 分号 ; 用于汇编的`单行注释` ### EQU指令 类似于C语言的`#define`,用于将一个数值(立即数)或寄存器(地址)赋给一个指定的符号名。 - 用例如下: ```c Stack_Size EQU 0x400 ; 这里定义栈大小为:0x400,也就是1K Bytes。 ``` ### AREA 指示汇编程序汇编一个新的代码段或数据段。 - 用例如下: ```c AREA STACK, NOINIT, READWRITE, ALIGN=3 ; 段名:STACK ``` ### NOINIT 即不初始化 - READWRITE:可读可写 - `ALIGN=3:8(2^3)`字节对齐 ### SPACE 用于分配一定大小的内存空间,单位为字节。 - 用例: ```c Stack_Mem SPACE Stack_Size ; 这里分配一个:Stack_Size 字节大小的内存。Stack_Mem为标号,地址。 ``` ### PROC 汇编子程序 `开始` ### ENDP 汇编子程序 `结束` ### EXPORT 导出符号(函数名),其他文件,如C文件,可以调用。 ```c EXPORT Reset_Handler [WEAK] ; 这里 [WEAK],弱定义,外部文件可以重写这个函数。 ``` ### IMPORT 导入符号,可以调用其他文件里定义的变量或函数 - 用例: ```c IMPORT SystemInit ; 这个SystemInit,来自外部文件:系统初始化与时钟配置。 ``` ### LDR 加载(load)指令,从存储器中将一个32位的字数据传送到目的寄存器中 ```c LDR R0, =SystemInit ; 把SystemInit函数地址,加载到MCU通用寄存器的R0。 ``` ### BLX BLX 带返回和状态切换的跳转指令 - 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。 ```c LDR R0, =SystemInit BLX R0 ; 加载SystemInit函数地址, 跳转执行SystemInit。 ``` ### BX BX 带状态切换的跳转指令 - 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。 ```c LDR R0, =__main BX R0 ; 加载__main 地址到R0,跳转执行__main,注意这个__main执行后,会进入用户的main.c中的main函数。 ``` ### B - B 指令是最简单的`跳转`指令。 - 一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。 - 【注意】存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间) ```c NMI_Handler PROC EXPORT NMI_Handler [WEAK] B . ENDP ; 这个NMI_Handler汇编函数中,有个:【B .】 ,意思是说,如果进入这个函数,会:whiel(1),让程序无法返回。 ``` - STM32代码【死掉】时,注意是否有进入异常处理的函数,如:`HardFault_Handler`,默认也是【B .】即while(1),软件调试,可以停止调试,看看程序运行卡在哪里。 ### END 汇编文件的`结束` ## 小结 - ARM汇编指令很多,用到时,查资料,慢慢积累,不断掌握使用的语法、用法。ST的编程手册里,有ARM汇编指令的介绍。 - 掌握部分STM32 ARM汇编用法,用于后期RTOS开发,如任务的上下文切换,可以用汇编高效的实现。 ## 指令汇总 ![1287290-20180416231826749-1864141304.png](https://oss-club.rt-thread.org/uploads/20210723/51d8a844f580bcbe4f564c9c7d54ba39.png.webp)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
809
被采纳
175
关注TA
发私信
相关文章
1
RTOS情况下,串口字节丢失
2
RTT的休眠模式怎么样
3
物联网操作系统有哪些
4
新手小白,关于RTOS选择的疑问
5
用rt在stmf103里面产生pwm(400KHZ),大佬们是怎么做的?
6
Linux开发和RTOS开发的区别?
7
rttread os 对于引脚复用的配置
8
发生hard fault on handler怎么定位什么问题?
9
HC32F030F8TA移植RT_Thread在创建任务完成进入任务调度中出错跑飞怎么处理?
10
用mountriver创建rtt工程,整数ok,开浮点一到rt_thread_mdelay就挂了
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部