你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-STM32U385RG开发板测评】05 启用ThreadX

[复制链接]
星海灿烂 发布时间:2025-7-13 22:47

一、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

1752417774287.jpg

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

1752417799935.jpg

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

1752417824389.jpg

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、下载验证如下:

1752417952711.jpg

收藏 评论0 发布时间:2025-7-13 22:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版