需求

如何使用 stm32cubeide 运行 threadx?

解决

启用 threadx core

  1. 打开项目 ioc 文件, Middleware and software Packs -> THREADX -> Mode 勾选 core
  2. 下方的 configuration 中, TX_TIMER_TICKS_PER_SECOND 设置为 1000.
  3. Memory Configuration 中的 ThreadX memory pool size 也设置大一点,这个是默认生成的字节池的大小。
  4. 左侧 System Core 中的 SYS, 修改 Timebase SourceTIM7. 这个一定要修改,因为 HAL 的基准是 systick, threadx 的基准也是 systick, 如果不修改,会导致不自动生成 systickhandler 函数,导致进入 hard fault. 至于到底修改为哪个 tim, 这个就随便了。
  5. 保存自动生成代码。

使用 threadx

  1. 新建文件,创建 UINT ThreadInit(TX_BYTE_POOL * byte_pool) 这样的函数,然后在 app.threadx.c 中的 App_ThreadX_Init 中调用这个 ThreadInit 即可。
  2. ThreadInit 用于分配线程堆栈,创建线程等工作。需要注意的是 app_azure_rtos.c 中的 tx_application_define 中因为 USE_STATIC_ALLOCATION 的原因,已经申请了 tx_app_byte_pool, 所以传递到 ThreadInit 中的参数其实是 byte_pool 的地址,所以不需要在 ThreadInit 中再申请字节池,直接使用传递进来的参数即可。注意不要用错,否则也会进 hard fault.
  3. 参考微软的再线教程,创建好线程,就可以运行看效果了。

启用 performance info

  1. ioc 文件中, Mode 中勾选 PerformanceInfo
  2. Configuration 中根据需要勾选,一般也就是 BYTE_POOL, QUEUE, THREAD 这样的勾选上即可。
  3. 代码中使用类似 tx_queue_info_get 这样的函数来获取信息
  4. 根据自己的项目,使用合适的打印函数把信息打印出来。

启用 trace

  1. ioc 文件中, Mode 中勾选 TraceX Support
  2. Configuration 中勾选 TX_ENABLE_EVENT_TRACE 即可,其他的默认。
  3. 添加 UCHAR trace_buffer[TRACE_BUFFER_SIZE]; 这样的数组,用来保存 trace 数据。添加宏定义 #define TRACE_BUFFER_SIZE 64000, #define TRACE_REGISTER_OBJECT_NUM 30
  4. 添加 VOID TraceFullCallback(VOID * param) 这样的回调函数,里面调用 tx_trace_disable();, 数组填满之后,就会自动停止 trace 了。
  5. app_azure_rtos.c 中申请字节池成功后,添加 tx_trace_enable(trace_buffer, TRACE_BUFFER_SIZE, TRACE_REGISTER_OBJECT_NUM);, tx_trace_buffer_full_notify(TraceFullCallback); 来启用 trace 和添加对应的回调函数。
  6. 编译并进入调试模式,查看 trace_buffer 对应的内存地址,然后在 memory 选项卡中,添加这个地址。
  7. 继续运行一段时间后,暂停,然后 memory 选项卡的右上位置,有 export 按钮,点击后,选择 RAW binary 模式,开始地址就是 trace_buffer 的地址,长度就是 TRACE_BUFFER_SIZE 对应的长度。导出文件名注意后缀是 .trx, 然后即可导出。
  8. 安装并打开 TraceX 软件,导入刚才生成的 trx 文件,即可看到具体系统运行过程信息。

参考