1. 创建第一个ThreadX线程

任务目标

初始化ThreadX内核,创建一个简单线程并启动调度,验证线程能够被正确创建并周期性执行。

环境依赖

需要ThreadX库(本案例使用ThreadX 6.x),以及一个支持C编译的环境。若在裸机环境运行,需提供时钟节拍源(如SysTick定时器),并确保 tx_initialize_low_level 已实现(通常由移植层提供)。

核心实现

#include "tx_api.h"

/* 定义线程栈和线程控制块 */
#define THREAD_STACK_SIZE   1024
static TX_THREAD   my_thread;
static uint8_t     thread_stack[THREAD_STACK_SIZE];

/* 线程入口函数 */
static void my_thread_entry(ULONG thread_input)
{
    /* 线程循环体 */
    while (1)
    {
        /* 每次执行后让出CPU,等待下一次调度 */
        tx_thread_sleep(100);  /* 睡眠100个时钟节拍 */
    }
}

/* 应用程序初始化入口 */
void tx_application_define(void *first_unused_memory)
{
    /* 创建线程 */
    UINT status = tx_thread_create(
        &my_thread,               /* 线程控制块指针 */
        "My Thread",              /* 线程名称 */
        my_thread_entry,          /* 线程入口函数 */
        0,                        /* 入口参数 */
        thread_stack,             /* 线程栈起始地址 */
        THREAD_STACK_SIZE,        /* 线程栈大小 */
        15,                       /* 优先级(0-31,0最高) */
        15,                       /* 抢占阈值 */
        TX_NO_TIME_SLICE,         /* 不启用时间片轮转 */
        TX_AUTO_START             /* 创建后自动启动 */
    );

    /* 若创建失败,可在此处处理错误 */
    if (status != TX_SUCCESS)
    {
        /* 实际工程中可记录错误状态 */
    }
}

编译与运行

  1. 将上述代码与ThreadX库一起编译链接。
  2. 确保 tx_initialize_low_level 已正确配置系统时钟节拍(通常为10ms或1ms一个tick)。
  3. 程序入口调用 tx_kernel_enter() 启动ThreadX内核,内核初始化完成后会自动调用 tx_application_define。

验证方法

在 my_thread_entry 的循环体内添加一个调试引脚翻转或串口打印语句(如每100个tick输出一次字符),观察输出频率是否符合预期。若线程被正确创建并调度,应能看到周期性输出;若线程未运行,则说明创建或调度存在问题。

通过条件:线程入口函数被周期性调用,且每次调用间隔与 tx_thread_sleep(100) 设置的节拍数一致(误差在允许范围内)。

常见问题

  • 线程未启动:检查 tx_thread_create 返回值是否为 TX_SUCCESS,并确认 TX_AUTO_START 已设置。
  • 系统卡死:确认时钟节拍中断已正确触发,否则 tx_thread_sleep 永远不会返回。
  • 栈溢出:若线程栈过小,可增大 THREAD_STACK_SIZE 或使用 tx_thread_stack_error_notify 进行监控。