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_ptrIMPORT  _tx_initialize_unused_memoryIMPORT  _tx_thread_context_saveIMPORT  _tx_thread_context_restoreIMPORT  _tx_timer_interruptIMPORT  __mainIMPORT  __initial_spIMPORT  __VectorsIMPORT  __tx_PendSVHandler
SYSTEM_CLOCK        EQU     7200000
SYSTICK_CYCLES      EQU     ((SYSTEM_CLOCK / 1000) -1)AREA ||.text||, CODE, READONLYPRESERVE8EXPORT  _tx_initialize_low_level
_tx_initialize_low_levelCPSID   iLDR     r0, =_tx_initialize_unused_memory       ; Build address of unused memory pointerLDR     r1, =__initial_sp                       ; Build first free addressADD     r1, r1, #4                              ;STR     r1, [r0]                                ; Setup first unused memory pointerMOV     r0, #0xE000E000                         ; Build address of NVIC registersLDR     r1, =__Vectors                          ; Pickup address of vector tableSTR     r1, [r0, #0xD08]                        ; Set vector table addressLDR     r0, =_tx_thread_system_stack_ptr        ; Build address of system stack pointerLDR     r1, =__Vectors                          ; Pickup address of vector tableLDR     r1, [r1]                                ; Pickup reset stack pointerSTR     r1, [r0]                                ; Save system stack pointerMOV     r0, #0xE000E000                         ; Build address of NVIC registersLDR     r1, =SYSTICK_CYCLESSTR     r1, [r0, #0x14]                         ; Setup SysTick Reload ValueMOV     r1, #0x7                                ; Build SysTick Control Enable ValueSTR     r1, [r0, #0x10]                         ; Setup SysTick ControlLDR     r1, =0x00000000                         ; Rsrv, UsgF, BusF, MemMSTR     r1, [r0, #0xD18]                        ; Setup System Handlers 4-7 Priority RegistersLDR     r1, =0xFF000000                         ; SVCl, Rsrv, Rsrv, RsrvSTR     r1, [r0, #0xD1C]                        ; Setup System Handlers 8-11 Priority Registers
; Note: SVC must be lowest priority, which is 0xFFLDR     r1, =0x40FF0000                     ; SysT, PnSV, Rsrv, DbgMSTR     r1, [r0, #0xD20]                    ; Setup System Handlers 12-15 Priority RegistersBX      lrEXPORT  SysTick_Handler
SysTick_HandlerPUSH    {r0, lr}BL      _tx_timer_interruptPOP     {r0, lr}BX      LRALIGN
LTORGEND

注意事项:

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

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

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

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

相关文章

#381. 四边形继承练习

太爽了 甚至还现学了叉积判断线段是否相交和求面积的方法 先给出我的代码&#xff1a; #include <iostream> #include <vector> #include <iomanip> #include <cmath>using namespace std;//下面需要补充多个类的声明及实现代码 const double EPS 1…

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

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

【基于HTML5的网页设计及应用】——事件代理.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

gcn代码处理出现的问题

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

每个人都可以做一个赚钱的社群

如何创建并运营一个赚钱的社群 一、引言 大家好&#xff0c;今天&#xff0c;我想和大家分享一下如何创建并运营一个赚钱的社群。我的分享目的是希望能够持续输出有价值的内容。 二、心态建设 1. 重要性&#xff1a;创业心态与平常心 在开始社群运营之前&#xff0c;我们需…

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

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

持续上榜!赛宁网安多项能力入选《中国网络安全行业全景图》

4月12日&#xff0c;国内网安咨询机构安全牛正式发布《中国网络安全行业全景图》第十一版。赛宁网安凭借在网络安全领域前沿的技术创新优势、丰富的实践经验积累以及专业的综合安全服务&#xff0c;入选此次全景图安全支撑技术与体系的安全靶场领域、安全管理与运营的BAS领域和…

hierarchy-utils 通用树形数据工具库

通用树形数据工具库 hierarchy-utils链接地址使用示例数据结构 - 菜单数据源1.通过原数据结构返回树形数据2.通过转换数据结构&#xff08;Map / JSONObject&#xff09;返回树形数据3.返回源数据列表中id为rootId的元素或pid为rootId且id能整除2的全部子元素的数据列表 &#…

docker特殊问题处理3——docker-compose安装配置nacos

最近几年随着大数据和人工智能持续大热&#xff0c;容器化安装部署运维已经走进了各个中小公司&#xff0c;也得已让众多开发者能上手实际操作&#xff0c;不过说真心话&#xff0c;“万物皆可容器化”的理念越来越深入人心。 而如何使用docker-compose安装&#xff0c;配置&a…

Windows下安装GPU版Pytorch

升级Driver到最新版本 Windows搜索栏中输入设备管理器找到显示适配器一项&#xff0c;点击展开&#xff0c;你将看到你的NVIDIA显卡列在其中右键点击你的NVIDIA显卡&#xff0c;选择更新驱动软件…。在弹出的对话框中&#xff0c;选择自动搜索更新的驱动软件。之后&#xff0c…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

股票开户佣金最低多少?万一!A股开户多少钱合适?

开户佣金 通常情况下&#xff0c;股票开户佣金只要在达成交易的前提才收手续的费用&#xff0c;即买入和卖出的时候。目前&#xff0c;国规定收取最高佣金的比例为千分之三。 也就是说&#xff0c;最高为成交金额的3%&#xff0c;一般都会小于这个比例。最低交易佣金是5元起&a…

前端面试01总结

1.Js 中!x为true 时,x可能为哪些值 答: 1.false&#xff1a;布尔值false 2.0或-0&#xff1a;数字零 3.""或’或 &#xff08;空字符串&#xff09;&#xff1a;长度为0的字符串 4.null&#xff1a;表示没有任何值的特殊值 5.undefined&#xff1a;变量未定义时的默认…

如何为不同内容主题选择最适合的移动滑轨屏方案?

在数字化信息时代背景下&#xff0c;多媒体互动装置作为当前内容展示的常用手段&#xff0c;颇受大众的喜爱&#xff0c;比如应用在展厅、商业推广、活动会议等领域的滑轨屏&#xff0c;便是其中一种新颖的互动展示装置&#xff0c;并且它还能根据不同的内容主题&#xff0c;来…

java中的正则表达式匹配

匹配单个字符 \d&#xff1a;匹配一个数字字符。 \w&#xff1a;匹配一个字母、数字或下划线字符。 \s&#xff1a;匹配一个空白字符&#xff08;空格、制表符、换行符等&#xff09;。 .&#xff1a;匹配除换行符外的任意字符。量词 *&#xff1a;匹配前一个元素零次或多次。 …

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

Java面试题:解释Java中的项目Jigsaw以及其对Java平台的影响

Java中的项目Jigsaw是Java 9中引入的一个重要特性&#xff0c;它为Java语言和平台带来了模块化的支持。Jigsaw项目的主要目标是引入模块化概念&#xff0c;创建Java 9中的模块&#xff0c;然后将其应用于JDK。这一创新性的设计使得Java应用程序能够更高效地管理依赖关系&#x…

基于springboot的综合成绩管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的综合成绩管理系统2拥有三个角色 管理员&#xff1a;学生管理、班主任管理、班级管理、综合测评管理等 学生&#xff1a;综合测评/德育成绩/课程成绩/体育成绩的登记 班…

STM32H7的DMA双缓冲控制IO输出脉冲

STM32H7的DMA双缓冲控制IO输出脉冲 keil的sct文件配置MPU配置初始化DMA双缓冲初始化TIM12用处触发DMAMUX的请求发生器 keil的sct文件配置 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***…

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…