前言
- 先让threadx在板子上跑起来再说;
- 使用的芯片stm32f407zgt6
- 开发环境使用的是clion+cubemx
- 编译使用的是arm-none-gcc
实现效果
- 定时打印输出
- 添加threadx的cpu扩展工具,打印threadx任务相关信息
测试代码
相关宏定义
#define TX_CONV_STACK_SIZE(size) ((((UINT) size)+((sizeof(ULONG)) - ((UINT) 1)))/sizeof(ULONG))
main入口函数
/*
* Copyright (c) 2024-2024,shchl
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-4-4 shchl first version
*/
#include "includes.h"
int main() {
/*系统初始化*/
System_Init();
/*外设初始化*/
bsp_Init();
/*进入threadx 内核*/
tx_kernel_enter();
while (1) {
printf("app run\r\n");
HAL_Delay(1000);
}
return 0;
}
threadx 切入点函数(这里使用了tx里面的一个宏定义去初始化通信变量)
/*
* Copyright (c) 2024-2024,shchl
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-4-4 shchl first version
*
*
* tx_kernel_enter() 执行逻辑(关键)
* TX_PORT_SPECIFIC_PRE_INITIALIZATION----可扩展
* _tx_initialize_low_level() --- 设备层(寄存器)初始化
* _tx_initialize_high_level() --- tx os 内部相关初始化
* TX_INITIALIZE_KERNEL_ENTER_EXTENSION----可扩展
* tx_application_define(_tx_initialize_unused_memory);
* TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION ---可扩展
*
*/
#include "includes.h"
//#define USE_THREADX_BYTE_POOL
//#define USE_FILEX_BYTE_POOL
//#define USE_FILEX_BYTE_POOL
/*
*******************************************************************************************************
* 外部引入变量
*******************************************************************************************************
*/
/*
*******************************************************************************************************
* 变量
*******************************************************************************************************
*/
TX_MUTEX AppPrintfSemp; /* 用于printf互斥 */
/*
*********************************************************************************************************
* 静态全局变量
*********************************************************************************************************
*/
#ifdef USE_THREADX_BYTE_POOL
/* USER CODE BEGIN TX_Pool_Buffer */
/* USER CODE END TX_Pool_Buffer */
static UCHAR tx_byte_pool_buffer[TX_APP_MEM_POOL_SIZE];
static TX_BYTE_POOL tx_app_byte_pool;
#endif
#ifdef USE_FILEX_BYTE_POOL
/* USER CODE BEGIN FX_Pool_Buffer */
/* USER CODE END FX_Pool_Buffer */
static UCHAR fx_byte_pool_buffer[FX_APP_MEM_POOL_SIZE];
static TX_BYTE_POOL fx_app_byte_pool;
#endif
#ifdef USE_FILEX_BYTE_POOL
/* USER CODE BEGIN NX_Pool_Buffer */
/* USER CODE END NX_Pool_Buffer */
static UCHAR nx_byte_pool_buffer[NX_APP_MEM_POOL_SIZE];
static TX_BYTE_POOL nx_app_byte_pool;
#endif
/*
*********************************************************************************************************
* 函数声明
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* 外部函数
*********************************************************************************************************
*/
/**
* @brief 此函数 被宏定义 TX_INITIALIZE_KERNEL_ENTER_EXTENSION 引用
*/
void tx_initialize_kernel_enter_extension() {
/* 创建互斥信号量 */
tx_mutex_create(&AppPrintfSemp, "AppPrintfSemp", TX_NO_INHERIT);
}
/**
* @brief 应用组件定义初始化
* @param first_unused_memory : Pointer to the first unused memory
* @retval None
*/
VOID tx_application_define(VOID *first_unused_memory) {
(void *) first_unused_memory;
VOID *memory_ptr;
#ifdef USE_THREADX_BYTE_POOL
if (tx_byte_pool_create(&tx_app_byte_pool, "Tx App memory pool", tx_byte_pool_buffer, TX_APP_MEM_POOL_SIZE) !=
TX_SUCCESS) {
/* USER CODE BEGIN TX_Byte_Pool_Error */
/* USER CODE END TX_Byte_Pool_Error */
} else {
/* USER CODE BEGIN TX_Byte_Pool_Success */
/* USER CODE END TX_Byte_Pool_Success */
memory_ptr = (VOID *) &tx_app_byte_pool;
if (App_ThreadX_Init(memory_ptr) != TX_SUCCESS) {
/* USER CODE BEGIN App_ThreadX_Init_Error */
/* USER CODE END App_ThreadX_Init_Error */
}
/* USER CODE BEGIN App_ThreadX_Init_Success */
/* USER CODE END App_ThreadX_Init_Success */
}
#else
if (App_ThreadX_Init(TX_NULL) != TX_SUCCESS) {
/* USER CODE BEGIN App_ThreadX_Init_Error */
/* USER CODE END App_ThreadX_Init_Error */
}
#endif
#ifdef USE_FILEX_BYTE_POOL
if (tx_byte_pool_create(&fx_app_byte_pool, "Fx App memory pool", fx_byte_pool_buffer, FX_APP_MEM_POOL_SIZE) !=
TX_SUCCESS) {
/* USER CODE BEGIN FX_Byte_Pool_Error */
/* USER CODE END FX_Byte_Pool_Error */
} else {
/* USER CODE BEGIN FX_Byte_Pool_Success */
/* USER CODE END FX_Byte_Pool_Success */
memory_ptr = (VOID *) &fx_app_byte_pool;
if (MX_FileX_Init(memory_ptr) != FX_SUCCESS) {
/* USER CODE BEGIN MX_FileX_Init_Error */
/* USER CODE END MX_FileX_Init_Error */
}
/* USER CODE BEGIN MX_FileX_Init_Success */
/* USER CODE END MX_FileX_Init_Success */
}
#else
// if (MX_FileX_Init(TX_NULL) != FX_SUCCESS) {
// /* USER CODE BEGIN MX_FileX_Init_Error */
//
// /* USER CODE END MX_FileX_Init_Error */
// }
#endif
#ifdef USE_FILEX_BYTE_POOL
if (tx_byte_pool_create(&nx_app_byte_pool, "Nx App memory pool", nx_byte_pool_buffer, NX_APP_MEM_POOL_SIZE)