stm32移植threadx rtos

stm32移植threadx rtos文章目录写在前面准备移植开始移植验证最后一点点击下方阅读原文可访问文中超链接写在前面 ThreadX 是由 ExpressLogic 公司开发的实时操作系统 目前已被微软收购 并且前不久开源了 当开源的时候很多论坛都第一时间发布了相关文章 可见其影响力还是很不错的 刚好最近有一个新项目 需要用到网络协议栈 而 threadx 有自己的网络协议栈组件 之前打算用 freeRTOS 加 LWIP 的方式 现在直接用 threadx 加 netx 的方式 首先到 github 上下载 threadx 的源码 建议使用 git 下载 zi

点击下方阅读原文可访问文中超链接

写在前面

准备移植

开始移植

  • 首先更改时钟频率及给滴答定时器设置的重装载值
SYSTEM_CLOCK EQU  SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 1000) -1) 
  • 删掉堆栈大小定义代码段(冲突)
  • 删掉向量表的定义(冲突)
  • 删掉Reset_Handler代码段(冲突)
  • 删掉__user_initial_stackheap代码段(冲突)
  • 删掉__tx_BadHandler代码段(没用)
  • 删掉__tx_SVCallHandler代码段(没用)
  • 删掉__tx_IntHandler代码段(没用)
  • 删掉__tx_NMIHandler代码段(没用)
  • 删掉__tx_DBGHandler代码段(没用)
IMPORT __Vectors 

再次编译提示PendSV_Handler重复定义,但是却未提示SysTick_Handler重复定义,从以往移植其它rtos的经验来看,基本上都是使用滴答定时器作为系统心跳,我们暂且继续往下看
stm32移植threadx rtos
屏蔽掉stm32f4xx_it.c文件中的PendSV_Handler函数,threadx需要用来进行上下文切换。
再次编译提示tx_application_define未定义,这个是在threadx系统启动的时候会自动调用,我们如果需要创建任务或者信号量等资源的话都是在这个函数里面完成,参考实现可仿照sample_threadx.c文件。
stm32移植threadx rtos
在main函数中添加头文件并且添加此函数的实体










#include "tx_api.h" VOID tx_application_define(VOID *first_unused_memory) { 
     /*暂时留空*/ } 

这个问题解决后再次编译又报了几个错,也是未定义,猜测这几个符号是编译完代码后在某个中间文件生成的,在链接的时候这里再获取其值,因为keil编译完程序生成的map文件有类似的符号
stm32移植threadx rtos
经过搜索,发现只有ImageZILimit有用(这里$显示不出来),其它都没有使用,从官方提供的其它移植的例程得知这里是用户可用内存(运行环境需要的除外,比如C运行环境的堆栈)的起始地址,设置为__initial_sp,同样的需要在前面IMPORT这个符号,__initial_sp有点特殊,需要勾选keil选项中的Use MicroLIB选项,不然的话提示找不到这个符号的定义,这是从启动文件得知的。




;* ; User Stack and Heap initialization ;* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap ... 

现在已经编译成功了,但是你会发现系统跑不起来,这就是前面为什么说SysTick_Handler这个函数没有报重复定义的错,因为系统的心跳还没有提供,看下PendSV_Handler是怎么实现的。

; /* Generic context switching PendSV handler. */ ; EXPORT __tx_PendSVHandler EXPORT PendSV_Handler __tx_PendSVHandler PendSV_Handler 

这里将两个标号写在一起,也就是相当于一个函数的两个名字,实际上是同一个东西,模仿一下,添加SysTick_Handler,然后屏蔽掉stm32f4xx_it.c文件中的SysTick_Handler函数。

 EXPORT __tx_SysTickHandler EXPORT SysTick_Handler __tx_SysTickHandler SysTick_Handler 

编译成功,现在移植已经就大功告成了,添加两个线程测试下(参考sample_threadx.c文件)

void thread_0_entry(ULONG thread_input) { 
     /* This thread simply sits in while-forever-sleep loop. */ while(1) { 
     PRINTF("thread 0 is running..\r\n"); tx_thread_sleep(1000); } } void thread_1_entry(ULONG thread_input) { 
     /* This thread simply sends messages to a queue shared by thread 2. */ while(1) { 
     PRINTF("thread 1 is running..\r\n"); tx_thread_sleep(500); } } 

验证

/*略*/ HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0U); /*新版BUG,这里参考stm32f4xx_hal.c文件的HAL_InitTick函数*/ uwTickPrio = TickPriority; /* Enable the TIM6 global Interrupt */ HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); /*略*/ 
/*略*/ HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0U); /*0x0f优先级已被threadx系统使用*/ TickPriority -= 1; /*新版BUG,这里参考stm32f4xx_hal.c文件的HAL_InitTick函数*/ uwTickPrio = TickPriority; /* Enable the TIM6 global Interrupt */ HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); /*略*/ 

最后一点

欢迎扫码关注我的微信公众号
漫长当下


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220434.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:29
下一篇 2026年3月17日 下午8:29


相关推荐

  • Cursor 超进化:全面掌握新功能与高级玩法

    Cursor 超进化:全面掌握新功能与高级玩法

    2026年3月16日
    5
  • 如果我说熟悉SpringBoot 面试官会怎么问?

    如果我说熟悉SpringBoot 面试官会怎么问?SpringBoot因简化了Spring框架使用难度,极大地提高了Java企业级应用开发的效率,成为企业考核人才的重要标准之一。但随着现今互联网行业快速发展、企业业务不断深入,相应地对SpringBoot技术要求也愈来愈高。春节时期有一位打算金三银四面试的读者私信问我:如果我说熟悉SpringBoot面试官会怎么问?​可能不少朋友跟他一样,不清楚当下企业真实生产环境下对SpringBoot有哪些具体要求,需要掌握到什么程度。为此,结合这些年的面试经历及各大厂的职位要求,给

    2022年6月5日
    29
  • 电容是根据什么分类_电容的分类与识别图片

    电容是根据什么分类_电容的分类与识别图片一、瓷介电容器(CC)1.结构用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分1类电介质(NPO、CCG));2类电介质(X7R、2X1)和3类电介质(Y5V、2F4)瓷介电容器。2.特点1类瓷介电容器具有温度系数小、稳定性高、损耗低、耐压高等优点。最大容量不超过1000pF,常用的有CC1、CC2、CC18A、CC11、CCG等系…

    2022年8月22日
    8
  • C语言链表详解(通俗易懂,超详细)

    C语言链表详解(通俗易懂,超详细)前言 想要很好的学好链表 我们首先要了解链表的优缺点 面试 优点 1 插入删除不需移动其他元素 只需改变指针 2 链表各个节点在内存中空间不要求连续 空间利用率高缺点 1 访问数组元素效率低 2 数组的存储空间连续 内存空间利用率低 1 单链表通俗讲就是结构体变量与结构体变量链接在一起 链表结构体变量 一般由数据域 任何数据 和指针域组成 也就是所说的结点 结点组成 stru

    2026年3月16日
    2
  • GATK变异检测

    GATK变异检测变异检测 GATK 变异检测简述 GATK 全称 TheGenomeAna 是基于二代测序的分析软件 主要功能是寻找变异位点 数据类型 Illumina 数据软件版本 Gatk4 1 8 1 fastp0 20 0 bwa0 7 17 samtools1 9 测试数据 ref home jingke meng database hg19 BWA hg19 fa fq1 home jingke meng GATK passway Illu

    2026年3月16日
    3
  • 外地人在北京的真实状态(漫画)

    这就是外地人在北京的真实状态! 北京这个城市看似中国的首都,实则在这里很不容易,但是感谢阿Q的存在,能把这种苦逼包装成一种高大上的状态。早上每天5:30起床睡眠不足,我们包装成早期…

    2021年6月21日
    189

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号