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

在这里插入图片描述

在嵌入式系统开发中,实时操作系统(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汇编器)使用缩进来区分标签和指令。具体来说:
如果一行的开始处直接是一个指令,那么汇编器可能会将其视为一个标签。标签通常用于表示内存位置,如函数的开始。
如果一行的开始处是一个或多个空格,然后是一个指令,那么汇编器会正确地将其视为一个指令。
因此,如果你删除了指令前面的空格,汇编器可能会误将指令视为标签,从而导致错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 Cisco路由信息协议(RIP)实验

一、实验内容 1、命名 2、关闭域名解释 3、设置路由器接口IP地址 4、根据要求配置RIP以实现所有客户机都能相互通信 5、配置默认路由 二、实验数据处理 1、建立拓扑图 2、PC机地址配置 主机IP地址子网掩码网关PC110.23.1.2255.255.255.010.23.1.1PC210.23.1.3255.255.2…

[论文分享] Large Language Model guided Protocol Fuzzing

笔记目录 Large Language Model guided Protocol Fuzzing [NDSS 2024]IntroductionConstructionContribution BackgroundProtocol FuzzingChallenges Large Language ModelsMotivation Case StudyLifting Message Grammars: Quality and DiversityEnriching the Seed Corpus: D…

如何利用open3D来生成OCC

config.yaml depth: 10:#深度,设定为10,常用于决定处理或计算的层次或深入程度。 min_density: 0.1:#最小密度,设置为0.1,用于过滤或选择的密度阈值。 n_threads: -1:#线程数,设为-…

群晖(Synology)NAS 启用 SSH

群晖(Synology)NAS 是可以启用 SSH 的。 如果使用 SSH 命令,我们可以在 NAS 上运行相关的 Linux 命令,比如说在服务器网络传输数据上,就会有明显的优势了。 如何启用 进入 NAS 的服务器控制台,然后找到终…

LeetCode 349. 两个数组的交集

LeetCode 349. 两个数组的交集 1、题目 力扣题目链接:349. 两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 […

锂电池寿命预测 | Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测 程序设计 完整程序和数据获取方式:私信博主回复Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测。 参考资料 [1] h…

【菜狗学前端】npm i -g nodemon 遇到的下载卡住及运行权限问题解决记录

一、下载nodemon原因 nodemon作用:用node环境运行js文件时可以实时刷新运行出结果 (即修改js代码后不需再手动重新运行js文件) 二、下载卡住 reify:semver:timing reifyNode:node_modules/nodemon Completed 卡住位置:reify:semver: timing reifyNode…

力扣第20题有效的括号

typedef char STDataType; //动态栈 #define allocator_may_return_null 1typedef struct ST {STDataType* _a;int _top;//栈顶元素int _capacity;//最大容量 }Stack; //初始化栈 void StackInit(Stack *pst);//入栈 void StackPush(Stack* pst, STDataType x);//出栈 void Sta…

优思学院|2024年如何成为一名六西格玛黑带?

如果你总是觉得无论多么努力,职场上似乎难以有所突破,那么你应该知道,你并不是孤独的。 实际上,大量研究表明,高达90%的人对自己的工作感到不满,这意味着在你认识的每10人中,可能只有1人对其工…

CMC学习系列 (9):对侧半球可能支持中风后的恢复

对侧半球可能支持中风后的恢复 0. 引言1. 主要贡献2. 方法2.1 患者信息2.2 行为测试2.3 运动任务/实验范式 3. 结果3.1 对照参与者和卒中患者的相干图3.2 地形图上的CMC标签 4. 讨论5. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/science/article/pii/S2…

认识OpenEuler操作系统

引言 在信息技术日新月异的时代,开源软件已成驱动创新的核心动能,其中,OpenEuler作为一款冉冉升起的开源操作系统典范,凭借其对开源精神的坚守与技术创新的不懈追求,自亮相以来便引发了全球关注。本文将全方位深挖Open…

QT文本操作

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

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码

关于运行阿里云直播Demo报的错

flutter --version dart --version 如何使用Flutter框架推流_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心MediaBox音视频SDK下载指南_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心 终端输入 dart pub --trace get --no-precompile 打印详细报错信息 详细咨询…

Scrapy框架 进阶

Scrapy框架基础Scrapy框架进阶 【五】持久化存储 命令行:json、csv等管道:什么数据类型都可以 【1】命令行简单存储 (1)语法 Json格式 scrapy crawl 自定义爬虫程序文件名 -o 文件名.jsonCSV格式 scrapy crawl 自定义爬虫程…

【C#】 删除首/尾部字符

代码 static void Main(string[] args){string str "123abc";string strdelete "abc";string str1 str.Trim(1);string strc str1.Trim(c);string str11 str1.TrimStart(1);string strcc str1.TrimEnd(c);string strabc str.Trim(strdelete.ToCharA…

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…

mybatis自制插件+注解实现数据脱敏

欢迎来到我的博客,代码的世界里,每一行都是一个故事 mybatis自制插件注解实现数据脱敏 前言数据脱敏的实现方式构思从哪个地方进行脱敏?它怎么知道我什么数据需要脱敏 项目实现拦截器实现注解实现枚举实现效果图展示 前言 在数字时代&#x…

C++初识

这里会对一些内容进行简单的提起,后面会详细讲解 一、注释 作用:在代码中加入一些说明和解释,方便自己或其他人阅读代码 两种格式: 1、单行注释: // 描述信息 通常放在一行代码的上方,或者一条语句的末…

LeetCode55题:跳跃游戏(原创)

【题目描述】 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1&am…