打印
[应用相关]

RTOS内核技术研究:ARM汇编指令

[复制链接]
1003|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2021-7-1 20:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
启动文件
       STM32F103,ARM架构,所以,需要了解ARM的汇编指令,了解MCU上电后的启动流程。启动流程主要是硬件上电到进入main主函数之间的过程。

        STM32使用ST HAL库开发时,可以使用ST HAL库中提供的启动文件,如:【startup_stm32f101xe.s】。汇编语言编写。Keil MDK、gcc、IAR编译平台,略有不同,这里,我选择Keil MDK平台的。









        需要掌握一点基础的汇编指令的使用方法,并且可以自己写几个汇编函数,才能读懂启动文件。后期RTOS的开发,需要掌握更多的汇编指令。

        这里想熟悉几个重要的汇编指令。


使用特权

评论回复
沙发
晓伍|  楼主 | 2021-7-1 20:08 | 只看该作者
汇编语法

汇编文件,.s结尾


EQU指令

类似于C语言的#define,用于将一个数值(立即数)或寄存器(地址)赋给一个指定的符号名。

用例如下:

Stack_Size                EQU     0x400

这里定义栈大小为:0x400,也就是1K Bytes。


使用特权

评论回复
板凳
晓伍|  楼主 | 2021-7-1 20:09 | 只看该作者
AREA

指示汇编程序汇编一个新的代码段或数据段。

用例如下:

AREA    STACK, NOINIT, READWRITE, ALIGN=3

段名:STACK

NOINIT 即不初始化

READWRITE:可读可写

ALIGN=3:8(2^3)字节对齐


使用特权

评论回复
地板
晓伍|  楼主 | 2021-7-1 20:09 | 只看该作者
SPACE

用于分配一定大小的内存空间,单位为字节。

用例:

Stack_Mem       SPACE   Stack_Size

这里分配一个:Stack_Size 字节大小的内存。Stack_Mem为标号,地址。


PROC

汇编子程序 开始



ENDP

汇编子程序结束




EXPORT

导出符号(函数名),其他文件,如C文件,可以调用。

EXPORT  Reset_Handler             [WEAK]

这里 [WEAK],弱定义,外部文件可以重写这个函数。


使用特权

评论回复
5
晓伍|  楼主 | 2021-7-1 20:11 | 只看该作者
IMPORT

导入符号,可以调用其他文件里定义的变量或函数

IMPORT  SystemInit

这个SystemInit,来自外部文件:系统初始化与时钟配置。



LDR

加载(load)指令,从存储器中将一个32位的字数据传送到目的寄存器中

LDR     R0, =SystemInit

把SystemInit函数地址,加载到MCU通用寄存器的R0。



BLX

BLX 带返回和状态切换的跳转指令

指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。


  •                 LDR     R0, =SystemInit



  •                 BLX     R0


加载SystemInit函数地址, 跳转执行SystemInit。


使用特权

评论回复
6
晓伍|  楼主 | 2021-7-1 20:13 | 只看该作者
BX

BX 带状态切换的跳转指令
指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。
                LDR     R0, =__main                BX      R0加载__main 地址到R0,跳转执行__main,注意这个__main执行后,会进入用户的main.c中的main函数。




B

B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。
【注意】存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)
NMI_Handler     PROC                EXPORT  NMI_Handler                [WEAK]                B       .                ENDP这个NMI_Handler汇编函数中,有个:【B .】  ,意思是说,如果进入这个函数,会:whiel(1),让程序无法返回。
STM32代码【死掉】时,注意是否有进入异常处理的函数,如:HardFault_Handler,默认也是【B .】即while(1),软件调试,可以停止调试,看看程序运**在哪里。


END汇编文件的结束

使用特权

评论回复
7
晓伍|  楼主 | 2021-7-1 20:14 | 只看该作者
小结

汇编指令很多,用到时,查资料,慢慢积累,不断掌握使用的语法、用法。

掌握部分STM32 ARM汇编用法,用于后期RTOS开发,如任务的上下文切换,可以用汇编高效的实现。



使用特权

评论回复
8
mkkop| | 2024-7-10 17:41 | 只看该作者
谢谢分享,楼主辛苦了

使用特权

评论回复
9
hehhehee| | 2024-7-26 14:42 | 只看该作者
STM32F103 上电后的启动流程包括硬件初始化到进入 main 函数的过程。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

4113

帖子

1

粉丝