一、threadx是什么操作系统
ThreadX是一款专为深度嵌入式系统设计的硬实时操作系统(RTOS),以高实时性、低资源占用和强可靠性为核心优势。其内核精简(最小约2KB),支持多线程调度、中断管理及模块化扩展(如文件系统FileX、网络协议栈NetX),适用于资源受限场景。ThreadX已通过EAL4+安全认证和FIPS 140-2加密认证,广泛应用于消费电子(惠普打印机、三星数码产品)、汽车电子、工业自动化及航空航天领域(如NASA“深度撞击”任务)。
二、与FREERTOS有什么区别
维度 |
ThreadX |
FreeRTOS |
实时性 |
硬实时(微秒级确定性) |
软实时(毫秒级响应) |
中断响应 |
23 周期(~5ns) |
120-200 周期(~0.5–1μs) |
内核大小 |
2KB |
4KB |
安全认证 |
ASIL-D/SIL-4/FDA 医疗 |
SIL-2 |
内存管理 |
块内存池(碎片<0.3%) |
单一堆分配(可能碎片化) |
开源协议 |
Apache 2.0(Azure 生态绑定) |
MIT(完全自由) |
典型场景 |
航天、医疗、汽车控制 |
IoT 设备、消费电子 |
三、如何使用threadx
STM32CubeMX里面已经包含了threadx中间,因此只需要直接启用即可,不需要繁琐的移植过程。
1、新建工程
2、初始化时钟
3、开启cache
4、启用threadx
点击threadx,勾选core

产生APP初始化代码,相关配置如下

5、由于threadx占用了内部的systick定时器,需要给内部的延时指定其他定时器时钟

6、创建三个任务LED/UART/TEST
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file app_threadx.c
* @author MCD Application Team
* @brief ThreadX applicative file
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "app_threadx.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "main.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define LED_TASK_PRIO 11
#define LED_TASK_PREEMPTION_THRESHOLD LED_TASK_PRIO
#define LED_TASK_STACK_SIZE 256
#define UART_TASK_PRIO 12
#define UART_TASK_PREEMPTION_THRESHOLD UART_TASK_PRIO
#define UART_TASK_STACK_SIZE 512
#define TEST_TASK_PRIO 13
#define TEST_TASK_PREEMPTION_THRESHOLD TEST_TASK_PRIO
#define TEST_TASK_STACK_SIZE 512
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
TX_THREAD tx_app_thread;
/* USER CODE BEGIN PV */
uint8_t LED_TASK_stack[LED_TASK_STACK_SIZE];
uint8_t UART_TASK_stack[UART_TASK_STACK_SIZE];
uint8_t TEST_TASK_stack[TEST_TASK_STACK_SIZE];
TX_THREAD LedTask;
TX_THREAD UartTask;
TX_THREAD TestTask;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void LedTask_Entry(ULONG thread_input);
void UartTask_Entry(ULONG thread_input);
void TestTask_Entry(ULONG thread_input);
void fun_create_task(ULONG thread_input);
/* USER CODE END PFP */
/**
* @brief Application ThreadX Initialization.
* @param memory_ptr: memory pointer
* @retval int
*/
UINT App_ThreadX_Init(VOID *memory_ptr)
{
UINT ret = TX_SUCCESS;
TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
/* USER CODE BEGIN App_ThreadX_MEM_POOL */
/* USER CODE END App_ThreadX_MEM_POOL */
CHAR *pointer;
/* Allocate the stack for tx app thread */
if (tx_byte_allocate(byte_pool, (VOID**) &pointer,
TX_APP_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
{
return TX_POOL_ERROR;
}
/* Create tx app thread. */
if (tx_thread_create(&tx_app_thread, "tx app thread", tx_app_thread_entry, 0, pointer,
TX_APP_STACK_SIZE, TX_APP_THREAD_PRIO, TX_APP_THREAD_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START) != TX_SUCCESS)
{
return TX_THREAD_ERROR;
}
/* USER CODE BEGIN App_ThreadX_Init */
/* USER CODE END App_ThreadX_Init */
return ret;
}
/**
* @brief Function implementing the tx_app_thread_entry thread.
* @param thread_input: Hardcoded to 0.
* @retval None
*/
void tx_app_thread_entry(ULONG thread_input)
{
/* USER CODE BEGIN tx_app_thread_entry */
fun_create_task(thread_input);
/* USER CODE END tx_app_thread_entry */
}
/**
* @brief Function that implements the kernel's initialization.
* @param None
* @retval None
*/
void MX_ThreadX_Init(void)
{
/* USER CODE BEGIN Before_Kernel_Start */
/* USER CODE END Before_Kernel_Start */
tx_kernel_enter();
/* USER CODE BEGIN Kernel_Start_Error */
/* USER CODE END Kernel_Start_Error */
}
/* USER CODE BEGIN 1 */
void fun_create_task(ULONG thread_input)
{
tx_thread_create(&LedTask, "led Task", LedTask_Entry, 0, LED_TASK_stack,
LED_TASK_STACK_SIZE, LED_TASK_PRIO, LED_TASK_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START);
tx_thread_create(&UartTask, "UART Task", UartTask_Entry, 0, UART_TASK_stack,
UART_TASK_STACK_SIZE, UART_TASK_PRIO, UART_TASK_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START);
tx_thread_create(&TestTask, "TEST Task", TestTask_Entry, 0, TEST_TASK_stack,
TEST_TASK_STACK_SIZE, TEST_TASK_PRIO, TEST_TASK_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START);
}
void LedTask_Entry(ULONG thread_input)
{
while(1)
{
printf("LED task run \r\n");
tx_thread_sleep(100);
}
}
void UartTask_Entry(ULONG thread_input)
{
while(1)
{
printf("uart task run !\r\n");
tx_thread_sleep(100);
}
}
void TestTask_Entry(ULONG thread_input)
{
while (1)
{
printf("test task3 run !\r\n");
tx_thread_sleep(100);
}
}
/* USER CODE END 1 */
7、下载验证如下:
