【M32】F103CBTx 移植 ThreadX
文章目录
- 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相关推荐
- ThreadX应用开发笔记之二:移植ThreadX到STM32H7平台
前面我们将ThreadX成功移植到了STM32F4平台,但这只是我们的部分应用.我们希望将ThreadX的优势发挥到我们的更多应用中,所以在这一篇中我们就来实现将ThreadX移植到STM32H7 ...
- ZYNQ移植ThreadX demo
本次演示是基于vivado 2018.3版本完成的.硬件是7020 512M DDR 7010与7020的arm a9核是相同的,可以直接参考自己的硬件进行创建自己的工程. 本次的原始工程文件连接在论 ...
- STM32H743+CubeMX-移植ThreadX
文章目录 一.前言 二.STM32CubeMX 2.1.新建工程 2.2.配置RCC 2.3.配置Clock Configuration 2.4.配置Debug方式 2.5.使能CPU ICache与 ...
- ThreadX移植——STM32H7+MDK-AC6平台
作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 在uCOS全家桶宣布开源之后被微软收购的ThreadX也开源了,真是喜大普奔,对于我们这些嵌入式行业从业者来说,能 ...
- 【STM32H7】第3章 ThreadX FileX移植SDIO接口SD的基础知识
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第3章 ThreadX FileX移植SDIO接 ...
- ThreadX最小移植及tx_initialize_low_level.s的简要分析
ThreadX最小移植 写在开头 平台介绍 移植 准备一个简单的裸机程序 复制ThreadX源码到LED工程文件夹 在LED工程中添加ThreadX文件 修改tx_initialize_low_lev ...
- 【ThreadX全家桶】GuiX移植之DMA2D
[ThreadX全家桶]GuiX移植之DMA2D 前言 一.DMA2D配置 前言 因为HAL提供的DMA2D API仅在初始化函数中设置了输入/输出的偏移参数,后续想修改偏移参数需要重新初始化.所以我 ...
- 【STM32F429】第4章 ThreadX FileX文件系统移植到STM32F429(SD卡)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第4章 ThreadX FileX文件系统移植到 ...
- 【STM32F407】第4章 ThreadX FileX文件系统移植到STM32F407(SD卡)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第4章 ThreadX FileX文件系统移植到 ...
最新文章
- Java后端Java面试题总结2021(春招+秋招+社招)
- 模型保存的序列化文件pb 什么是PB文件 pb是protocol(协议) buffer(缓冲)的缩写
- cmake find_package 中,include_directories,target_link_libraries 的值怎么知道?
- Myeclipse的破解步骤
- linux mount文件夹
- 一周学会Mootools 1.4中文教程:(7)汇总收尾
- C ++ STL中的set :: upper_bound()函数
- 聚类实践(无监督学习)
- Java Protected 解读
- ZEROC究竟是何方神圣? Leader-us 大神来的回答 Leader-us mycat的发起者
- 苹果3月新品发布会one more thing曝光:或许就是iPhone SE 2
- 1971旗舰cpu intel_AMD依然yes!官宣锐龙5000系列CPU,单核性能首次超越英特尔,苏妈:最好的游戏CPU!...
- Windows学习总结(11)——Windows批处理命令编写代码及小程序简介
- maven+scala和java_maven打包scala+java工程
- oracle常用查询语句
- PCWorld:Android游戏业务渐露锋芒
- jmeter下载文件
- CLRC66301国产替代,国产首颗全协议NFC芯片,可兼容A卡,B卡,F卡,15693卡,KK量级出货。
- 4ME1,4W1H,5W2H,6W2H,6W3H,6S、8D等……含义?
- python qq群发消息_使用python发送QQ消息,QQ消息自动发送