ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

news2024/11/16 21:27:31

在这里插入图片描述

在嵌入式系统开发中,实时操作系统(RTOS)的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS,它以其小巧、快速和可靠而闻名。在本文中,我们将探讨如何将ThreadX移植到STM32微控制器上,特别是我们将深入研究通用启动文件tx_initialize_low_level.s

什么是tx_initialize_low_level.s?

tx_initialize_low_level.s是ThreadX启动过程的关键组成部分。这个文件包含了一些底层的初始化代码,这些代码在系统启动时运行,以设置正确的硬件环境并跳转到主程序。

tx_initialize_low_level.s的主要组成部分

让我们来看一下tx_initialize_low_level.s的主要组成部分:

IMPORT  _tx_thread_system_stack_ptr
IMPORT  _tx_initialize_unused_memory
IMPORT  _tx_thread_context_save
IMPORT  _tx_thread_context_restore
IMPORT  _tx_timer_interrupt
IMPORT  __main
IMPORT  __initial_sp
IMPORT  __Vectors
IMPORT  __tx_PendSVHandler

这部分代码导入了一些外部符号

SYSTEM_CLOCK        EQU     16800000
SYSTICK_CYCLES      EQU     ((SYSTEM_CLOCK / 1000) -1)

这部分代码定义了一些常量,包括系统时钟频率、SysTick定时器的周期。

AREA ||.text||, CODE, READONLY
PRESERVE8

这部分代码定义了代码区域,并指示堆栈应保持8字节对齐。

EXPORT  _tx_initialize_low_level
_tx_initialize_low_level

这部分代码是_tx_initialize_low_level函数的定义开始的地方。在这个函数中,会写入初始化系统的代码。

EXPORT  SysTick_Handler
SysTick_Handler
PUSH    {r0, lr}
BL      _tx_timer_interrupt
POP     {r0, lr}
BX      LR

这部分代码是SysTick中断处理程序的定义。当系统定时器产生中断时,这个函数会被调用。

完整代码

	IMPORT  _tx_thread_system_stack_ptr
	IMPORT  _tx_initialize_unused_memory
	IMPORT  _tx_thread_context_save
	IMPORT  _tx_thread_context_restore
	IMPORT  _tx_timer_interrupt
	IMPORT  __main
	IMPORT  __initial_sp
	IMPORT  __Vectors
	IMPORT  __tx_PendSVHandler
SYSTEM_CLOCK        EQU     7200000
SYSTICK_CYCLES      EQU     ((SYSTEM_CLOCK / 1000) -1)
	AREA ||.text||, CODE, READONLY
	PRESERVE8
	EXPORT  _tx_initialize_low_level
_tx_initialize_low_level
	CPSID   i
	LDR     r0, =_tx_initialize_unused_memory       ; Build address of unused memory pointer
	LDR     r1, =__initial_sp                       ; Build first free address
	ADD     r1, r1, #4                              ;
	STR     r1, [r0]                                ; Setup first unused memory pointer
	MOV     r0, #0xE000E000                         ; Build address of NVIC registers
	LDR     r1, =__Vectors                          ; Pickup address of vector table
	STR     r1, [r0, #0xD08]                        ; Set vector table address
	LDR     r0, =_tx_thread_system_stack_ptr        ; Build address of system stack pointer
	LDR     r1, =__Vectors                          ; Pickup address of vector table
	LDR     r1, [r1]                                ; Pickup reset stack pointer
	STR     r1, [r0]                                ; Save system stack pointer
	MOV     r0, #0xE000E000                         ; Build address of NVIC registers
	LDR     r1, =SYSTICK_CYCLES
	STR     r1, [r0, #0x14]                         ; Setup SysTick Reload Value
	MOV     r1, #0x7                                ; Build SysTick Control Enable Value
	STR     r1, [r0, #0x10]                         ; Setup SysTick Control
	LDR     r1, =0x00000000                         ; Rsrv, UsgF, BusF, MemM
	STR     r1, [r0, #0xD18]                        ; Setup System Handlers 4-7 Priority Registers
	LDR     r1, =0xFF000000                         ; SVCl, Rsrv, Rsrv, Rsrv
	STR     r1, [r0, #0xD1C]                        ; Setup System Handlers 8-11 Priority Registers
; Note: SVC must be lowest priority, which is 0xFF
	LDR     r1, =0x40FF0000                     ; SysT, PnSV, Rsrv, DbgM
	STR     r1, [r0, #0xD20]                    ; Setup System Handlers 12-15 Priority Registers
	BX      lr
	EXPORT  SysTick_Handler
SysTick_Handler
	PUSH    {r0, lr}
	BL      _tx_timer_interrupt
	POP     {r0, lr}
	BX      LR
	ALIGN
LTORG
	END

注意事项:

  1. 在移植到自己板子上的时候要注意更改系统时钟频率,我这里是168Mhz,
  2. 代码中的指令是有缩进的,不能取消,不然会把指令识别成标签

在某些汇编语言中,指令前面的空格可能是有意义的。这是因为一些汇编器(如ARM汇编器)使用缩进来区分标签和指令。具体来说:
如果一行的开始处直接是一个指令,那么汇编器可能会将其视为一个标签。标签通常用于表示内存位置,如函数的开始。
如果一行的开始处是一个或多个空格,然后是一个指令,那么汇编器会正确地将其视为一个指令。
因此,如果你删除了指令前面的空格,汇编器可能会误将指令视为标签,从而导致错误。

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

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

相关文章

IDP之Backstage - 环境搭建

0. 目录 1. 前言2. 环境准备(Windows10下)2.1 安装nvm2.2 git和docker安装 3. 创建模板项目3.1 典型错误: fails on the yarn install step3.2 再次启动3.3 验证 4. 相关 1. 前言 本不想写这篇,因为看着官网文档写着挺简单的,但实…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

小程序变更主体需要多久?

小程序迁移变更主体有什么作用?小程序迁移变更主体的好处有很多哦!比如可以获得更多权限功能、公司变更或注销时可以保证账号的正常使用、收购账号后可以改变归属权或使用权等等。小程序迁移变更主体的条件有哪些?1、新主体必须是企业主体&am…

3dmax制作小熊猫的基本流程

1.透视图插入面片,改高度宽度,把参考图放进面片里。 2.角度捕捉切换,角度改为90 3.shift旋转,旋转面片,复制一个出来 4.在前视图,把参考图片中的正式图小熊猫的一半的位置(可以是眼睛&#x…

2024最新 PyCharm 2024.1 更新亮点看这篇就够了

2024最新 PyCharm 2024.1 更新亮点看这篇就够了 文章目录 2024最新 PyCharm 2024.1 更新亮点看这篇就够了🚀 PyCharm 2024.1 发布:全面升级,助力高效编程!摘要引言 🚀 快速掌握 Hugging Face:模型与数据集文…

【微服务】Nacos生产环境配置技巧分享

前面我们介绍了Nacos作为配置中心组件实现,是如何配置和接入的。对于Nacos来说,他是集注册中心及配置中心为一体的。基于它的强大能力,我们在这里来统一分享几个Nacos在生产环境的配置技巧。 一、热加载配置 Nacos 本身是支持配置热加载的&…

面试官:MySQL的自增 ID 用完了,怎么办?

如果你用过或了解过MySQL,那你一定知道自增主键了。每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1)。虽然,自然数是没有上限的,但是我们在设计表结构的时候,通常都会指定字段长…

基于Spring Boot的入职匹配推荐系统设计与实现

基于Spring Boot的入职匹配推荐系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录界面,登录成功后进入到系统操…

一文搞定关于SkyWalking告警的那些事儿

Apache SkyWalking告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。 告警规则 告警规则定义了触发告警所考虑的条件。告警规则有两种类型,单独规则和复合规则,复合规则是单独规则的组合。这里重点介绍一下单独规则&a…

怎么转行做产品经理?

小白转产品经理第一点要先学基础理论知识,学了理论再去实践,转行,跳槽! 学理论比较好的就是去报NPDP的系统班,考后也会有面试指导课、职场晋升课程,对小白来说非常合适了~(B站:不爱…

QT文本操作

文本的操作 文本的读写流程 文本的读写流程 // 文本的读写流程// 1.打开文件》打到文本》QFileDialog::getOpenFileName返回的是// 一个字符串,包括了路径文件名字// open()方法打开文本// 2.读写文本// readAll(),readLine(),write()// 3.关闭文本 // close()使用…

kylin java.io.IOException: error=13, Permission denied

linux centos7.8 error13, Permission denied_linux open error13-CSDN博客 chmod -R 777 /home/zengwenfeng/kkFileView-4.2.1 2024-04-15 13:15:17.416 WARN 3400 --- [er-offprocmng-1] o.j.l.office.LocalOfficeProcessManager : An I/O error prevents us to determine…

蓝桥杯——18

学习视频&#xff1a;21-广度优先搜索练习_哔哩哔哩_bilibili Q&#xff1a;密码锁 #include<iostream> #include<queue> using namespace std; int s, e; bool vis[10000]; struct node {int state;int step;node(int s1, int s2) {state s1;step s2;} }; int…

排序算法—堆排序

文章目录 堆排序堆思路过程建堆排序 代码实现 堆排序 时间复杂度&#xff1a;O(N*logN) 稳定性&#xff1a;不稳定&#xff08;相同元素排序后的相对位置改变&#xff09; 堆 堆的逻辑结构是一棵完全二叉树&#xff1b;堆的物理结构是一个数组&#xff0c;通过下标表示父子结…

[计算机效率] 时间记录工具:ManicTime

3.24 时间记录工具&#xff1a;ManicTime ManicTime是一款数据收集软件&#xff0c;主要用于记录电脑上各种软件使用所花费的时间以及电脑闲置的时间。用户还可以定制记录某一时间段内的系统活动。 数据收集&#xff1a;ManicTime能够静默运行于后台&#xff0c;自动跟踪并收…

美易全球投资中心:金价暴涨背后,美债越来越没人要了?

金价暴涨背后&#xff1a;天量发行的美债越来越没人要了&#xff1f; 近期&#xff0c;国际金价的大涨几乎吸引了全世界投资者的目光。而在狂热的金市买盘背后&#xff0c;而另一避险资产美国国债&#xff0c;则呈现了完全不同的一幕萧条场景。 一系列疲软的美国国债拍卖表现&…

在线知识库如何从零开始搭建?这篇文章来教你!

引言&#xff1a; 有没有想过把那些零散在脑海中的点点滴滴整理起来&#xff0c;建立一个属于自己的在线知识库&#xff1f;无论是个人学习&#xff0c;团队协作&#xff0c;还是企业管理&#xff0c;一个良好的知识库都能帮我们更高效地存储和分享知识。如果你还在为“怎么建知…

创新营销利器:淘宝扭蛋机小程序开发全解析

在数字化浪潮的推动下&#xff0c;淘宝扭蛋机小程序的开发成为了一种全新的购物体验。它巧妙地将传统扭蛋机的乐趣与移动技术的便捷相结合&#xff0c;为用户带来了前所未有的惊喜与互动。 淘宝扭蛋机小程序的开发&#xff0c;不仅是一次技术的革新&#xff0c;更是一次购物方…

基于Springboot+Vue的Java项目-高校心理教育辅导系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

【C 数据结构】静态链表

文章目录 【 1. 基本原理 】1.1 静态链表中的节点1.2 备用链表 【 2. 静态链表的创建 】2.1 实例1 - 创建静态链表&#xff0c;指定值2.2 实例2 - 创建静态链表&#xff0c;默认值 【 3. 静态链表 添加元素 】【 4. 静态链表 删除元素 】【 5. 静态链表 查找元素 】【 6. 静态链…