文章目录

  • 1.配置
  • 2.移植
  • 3.适配
  • 4.运行
  • 5.运行
  • 参考
  • 交流

1.配置

取消 Pendable request for system service 和 System tick timer 选项

库函数时基源改为普通定时器

Project Manager 不生成 mian 入口函数

2.移植

下载 threadx 源码包:源码包

拷贝下面两个文件夹到项目

ports 选择对应的内核,M32F103CB 是 cortex-m3 内核,使用 keil 编译,拷贝 cortex_m3/keil 下的文件夹到 ports 中,将 example_build 中的 tx_initialize_low_level.s 拷贝出来,删除其他文件夹

keil 分组导入对应的文件,ThreadX/common 分组导入 common 路径下所有 C 文件;ThreadX/ports 分组导入 ports 路径下所有 S 文件以及 tx_initialize_low_level.s

3.适配

修改 tx_initialize_low_level.s,仅保留系统时钟信息、_tx_initialize_low_level 函数和 __tx_SysTickHandler 函数

;   在 _tx_initialize_low_level 中使用的外部函数IMPORT  _tx_thread_system_stack_ptrIMPORT  _tx_initialize_unused_memoryIMPORT  __initial_spIMPORT  __Vectors
;   在 __tx_SysTickHandler 中使用的外部函数   IMPORT  _tx_timer_interrupt; 系统时钟信息
SYSTEM_CLOCK        EQU     72000000
SYSTICK_CYCLES      EQU     ((SYSTEM_CLOCK / 1000) -1)AREA ||.text||, CODE, READONLY;   __initial_sp 取代 |Image\$\$ZI\$\$Limit|,__Vectors 取代 __tx_vectorsEXPORT  _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 Registers; Note: PnSV must be lowest priority, which is 0xFFBX      lr;   SysTick_Handler 取代 __tx_SysTickHandlerEXPORT  SysTick_Handler
SysTick_HandlerPUSH    {r0, lr}BL      _tx_timer_interruptPOP     {r0, lr}BX      LRALIGNLTORGEND

4.运行

创建 tx_application_define.c 文件,定义 tx_application_define 函数,实现 main 函数入口,循环打印内部温度

#include "tx_api.h"
#include <stdio.h>
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "rtc.h"
#include "usart.h"
#include "usb_device.h"
#include "gpio.h"#define DEMO_STACK_SIZE 1024
#define DEMO_BYTE_POOL_SIZE 2048TX_THREAD thread_0;
TX_BYTE_POOL byte_pool_0;
UCHAR memory_area[DEMO_BYTE_POOL_SIZE];#define AVMAX 10
struct
{uint16_t temp;uint16_t vref;
} AdcValue[AVMAX];
UINT status;
RTC_DateTypeDef sdatestructure;
RTC_TimeTypeDef stimestructure;// 引入 main.c 中的时钟配置
extern void SystemClock_Config(void);// 主函数入口
int main()
{HAL_Init();SystemClock_Config();// 挂起时基HAL_SuspendTick();tx_kernel_enter();
}void thread_0_entry(ULONG thread_input);/* Define what the initial system looks like.  */void tx_application_define(void *first_unused_memory)
{CHAR *pointer = TX_NULL;/* Create a byte memory pool from which to allocate the thread stacks.  */tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE);/* Put system definition stuff in here, e.g. thread creates and other assortedcreate information.  *//* Allocate the stack for thread 0.  */tx_byte_allocate(&byte_pool_0, (VOID **)&pointer, DEMO_STACK_SIZE, TX_NO_WAIT);/* Create the main thread.  */tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,pointer, DEMO_STACK_SIZE,1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
}/* Define the test threads.  */void thread_0_entry(ULONG thread_input)
{// 恢复时基HAL_ResumeTick();MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();MX_USB_DEVICE_Init();MX_RTC_Init();MX_ADC1_Init();HAL_ADCEx_Calibration_Start(&hadc1);HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&AdcValue, sizeof(AdcValue) / sizeof(uint16_t));/* This thread simply sits in while-forever-sleep loop.  */while (1){HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, &sdatestructure, RTC_FORMAT_BIN);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("%02d/%02d/%02d\r\n", 2000 + sdatestructure.Year, sdatestructure.Month, sdatestructure.Date);printf("%02d:%02d:%02d\r\n", stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds);int32_t temp = 0.0, vref = 0.0;for (uint8_t i = 0; i < AVMAX; i++){temp += AdcValue[i].temp;vref += AdcValue[i].vref;}temp /= AVMAX;vref /= AVMAX;printf("MCU Temperature : %.5f\r\n", ((temp * 3300.0 / 4096 - 1410) / 4.2 + 25));printf("Vrefint value = %1.3fV \r\n", vref * 3.3f / 4096);HAL_GPIO_TogglePin(LED_TSF_GPIO_Port, LED_TSF_Pin);/* Sleep for 10 ticks.  */tx_thread_sleep(1000);}
}

在调度器开启之前,进行外设资源的初始化操作,可能会导致不可预测的错误,我在实际项目中出现了意外死机,频繁产生 HardFault…在放置在任务中进行初始化资源后,错误消失,具体原因尚未深究

注意:如果编译提示 __initial_sp 未定义,一定要勾选微库

在 startup_stm32f103xb.s 启动文件中,识别到微库的宏,才释放 __initial_sp

IF      :DEF:__MICROLIB           EXPORT  __initial_sp

5.运行

系统启动后,成功打印

参考

1.手把手教你移植ThreadX操作系统,基于在Keil MDK环境
2.stm32移植threadx rtos
3.关于Free-RTOS调度器启动前API调用造成中断关闭问题
4.【安富莱】ThreadX内核教程更新记录帖

交流

项目仓库:https://github.com/dissor/F1-Link.git

git clone https://github.com/dissor/F1-Link.git
cd F1-Link
git reset --hard bd3590d197ff7ad90462c88c7722282b983d482d

微信公众号:物联指北
B站:物联指北
千人企鹅群:658685162

【M32】F103CBTx 移植 ThreadX相关推荐

  1. ThreadX应用开发笔记之二:移植ThreadX到STM32H7平台

      前面我们将ThreadX成功移植到了STM32F4平台,但这只是我们的部分应用.我们希望将ThreadX的优势发挥到我们的更多应用中,所以在这一篇中我们就来实现将ThreadX移植到STM32H7 ...

  2. ZYNQ移植ThreadX demo

    本次演示是基于vivado 2018.3版本完成的.硬件是7020 512M DDR 7010与7020的arm a9核是相同的,可以直接参考自己的硬件进行创建自己的工程. 本次的原始工程文件连接在论 ...

  3. STM32H743+CubeMX-移植ThreadX

    文章目录 一.前言 二.STM32CubeMX 2.1.新建工程 2.2.配置RCC 2.3.配置Clock Configuration 2.4.配置Debug方式 2.5.使能CPU ICache与 ...

  4. ThreadX移植——STM32H7+MDK-AC6平台

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 在uCOS全家桶宣布开源之后被微软收购的ThreadX也开源了,真是喜大普奔,对于我们这些嵌入式行业从业者来说,能 ...

  5. 【STM32H7】第3章 ThreadX FileX移植SDIO接口SD的基础知识

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第3章   ThreadX FileX移植SDIO接 ...

  6. ThreadX最小移植及tx_initialize_low_level.s的简要分析

    ThreadX最小移植 写在开头 平台介绍 移植 准备一个简单的裸机程序 复制ThreadX源码到LED工程文件夹 在LED工程中添加ThreadX文件 修改tx_initialize_low_lev ...

  7. 【ThreadX全家桶】GuiX移植之DMA2D

    [ThreadX全家桶]GuiX移植之DMA2D 前言 一.DMA2D配置 前言 因为HAL提供的DMA2D API仅在初始化函数中设置了输入/输出的偏移参数,后续想修改偏移参数需要重新初始化.所以我 ...

  8. 【STM32F429】第4章 ThreadX FileX文件系统移植到STM32F429(SD卡)

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第4章   ThreadX FileX文件系统移植到 ...

  9. 【STM32F407】第4章 ThreadX FileX文件系统移植到STM32F407(SD卡)

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第4章   ThreadX FileX文件系统移植到 ...

最新文章

  1. Java后端Java面试题总结2021(春招+秋招+社招)
  2. 模型保存的序列化文件pb 什么是PB文件 pb是protocol(协议) buffer(缓冲)的缩写
  3. cmake find_package 中,include_directories,target_link_libraries 的值怎么知道?
  4. Myeclipse的破解步骤
  5. linux mount文件夹
  6. 一周学会Mootools 1.4中文教程:(7)汇总收尾
  7. C ++ STL中的set :: upper_bound()函数
  8. 聚类实践(无监督学习)
  9. Java Protected 解读
  10. ZEROC究竟是何方神圣? Leader-us 大神来的回答 Leader-us mycat的发起者
  11. 苹果3月新品发布会one more thing曝光:或许就是iPhone SE 2
  12. 1971旗舰cpu intel_AMD依然yes!官宣锐龙5000系列CPU,单核性能首次超越英特尔,苏妈:最好的游戏CPU!...
  13. Windows学习总结(11)——Windows批处理命令编写代码及小程序简介
  14. maven+scala和java_maven打包scala+java工程
  15. oracle常用查询语句
  16. PCWorld:Android游戏业务渐露锋芒
  17. jmeter下载文件
  18. CLRC66301国产替代,国产首颗全协议NFC芯片,可兼容A卡,B卡,F卡,15693卡,KK量级出货。
  19. 4ME1,4W1H,5W2H,6W2H,6W3H,6S、8D等……含义?
  20. python qq群发消息_使用python发送QQ消息,QQ消息自动发送

热门文章

  1. 搞好SEO内部链接是第一步
  2. php制作图片轮播_轮播图怎么做
  3. word批量删除中英文间的多个空格
  4. 如何上传全国计算机考试的图片,操作令人窒息!报名计算机考试照片上传成逗比表情包...
  5. 知名公司入职前的「背景调查」,到底在查什么?
  6. Allegro5全屏切换
  7. 全球PML_V2陆地蒸散发与总初级生产力数据
  8. XDOJ 171-考勤系统
  9. Lua+合宙框架知识点
  10. kafka入门(4)-java操作kafka