Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTOS
内核技术
汇编指令
操作系统内核技术研究:STMFD与LDMFD的使用
发布于 2021-07-23 22:28:22 浏览:1890
订阅该版
[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) ## 前言 - ARM 汇编多用于MCU的启动文件、RTOS的移植。 - 启动文件或RTOS的移植中,会用到一些基本的汇编指令。 - RTOS任务上下文切换时,经常使用STMFD与LDMFD,使用方法总结一下 ## STMFD `连续压栈`,如:`STMFD r1!, {r4 - r11}`,把r4~r11寄存器,压栈,注意`r11先入栈`。 ## LDMFD `连续出栈`,如:`LDMFD r1!, {r4 - r11}`,把栈中数据,加载到r4~r11,注意`先加载r4` ## 测试用例 编写汇编文件:`test.s`,并导出函数: `void stmfd_test(void);` ```c ;/* ASM Test */ AREA |.test|, CODE, READONLY, ALIGN=2 THUMB REQUIRE8 PRESERVE8 ;/* void stmfd_test(void); */ stmfd_test PROC EXPORT stmfd_test MRS r1, msp ; get from main stack pointer ldr r4, =0x44444444 ldr r5, =0x55555555 ldr r6, =0x66666666 ldr r7, =0x77777777 ldr r8, =0x88888888 ldr r9, =0x99999999 ldr r10, =0xAAAAAAAA ldr r11, =0xBBBBBBBB STMFD r1!, {r4 - r11} ; push r4 - r11 register ldr r4, =0x44440000 ldr r5, =0x55550000 ldr r6, =0x66660000 ldr r7, =0x77770000 ldr r8, =0x88880000 ldr r9, =0x99990000 ldr r10, =0xAAAA0000 ldr r11, =0xBBBB0000 LDMFD r1!, {r4 - r11} ; pop r4 - r11 register BX lr ENDP ALIGN 4 END ``` - 这里使用汇编,编写一个测试函数,导出函数,可以使用C调用。 ## 调试 - 使用Keil MDK5+STM32调试环境,调试,查看寄存器与内存数据(栈数据)。 ```c #include
#include
#include "test.h" /** * @brief The application entry point. * @retval int */ int main(void) { hw_board_init(); stmfd_test(); while (1) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_Delay(1000); } } ``` ## 工作流程 - 修改r4~r11寄存器的值(这几个寄存器,简单的代码,一般不使用),用于测试。 ![2021-07-15_234438.png](https://oss-club.rt-thread.org/uploads/20210723/d279a915a9d3c89f783778683f8d4008.png.webp) - 调用:STMFD r1!, {r4 - r11} ,注意压栈的寄存器的次序!r11先入栈。 ![2021-07-15_234656.png](https://oss-club.rt-thread.org/uploads/20210723/07f1799b817fadec36e005ca61365cd4.png.webp) - 再次修改寄存器:r4~r11,用于区别之前的数据 ![2021-07-15_235108.png](https://oss-club.rt-thread.org/uploads/20210723/d056d68dc59d46b8b7d6863618e105a5.png.webp) - 调用:LDMFD r1!, {r4 - r11} ,此时r4~r11寄存器的数据被栈中的数据加载更新。 ![2021-07-15_235215.png](https://oss-club.rt-thread.org/uploads/20210723/01989ca2f3c0244ec9529765398ff1f5.png.webp) ## 压栈次序 ![wx_20210715080014.png](https://oss-club.rt-thread.org/uploads/20210723/f94b0712bf83716f0320d29f67df1c33.png) ## 小结 - 基本了解STMFD与LDMFD的使用,寄存器的入栈与出栈的次序。 - 通过软件调试,加深对STMFD与LDMFD的工作原理的了解
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
813
被采纳
177
关注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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部