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

【STM32C0评测】使用ThreadX创建RTOS线程

[复制链接]
北方 发布时间:2025-4-24 09:18

1 threadX

ThreadX 是一个实时操作系统(RTOS),由 Microsoft(微软)开发,专为嵌入式系统设计。ThreadX 以其高性能、低开销和易用性而闻名,广泛应用于各种嵌入式应用。

STM32C071 是一款基于 ARM Cortex-M0+ 内核的微控制器,适合多种RTOS开发,threadX和rtThread,FreeRTOS等都采用类似的逻辑,但是也有不同点。

2 创建工程和开发

2.1 导入范例工程并编译通过。

20.PNG

核心代码入口在main.c,并启动线程

int main(void)
{
  HAL_Init();

  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_ThreadX_Init();

  while (1)
  {
  }
}

启动线程的核心代码,分别分配内存,堆栈,并启动线程

UINT App_ThreadX_Init(VOID *memory_ptr)
{
  UINT ret = TX_SUCCESS;
  TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;

  CHAR *pointer;

  if (tx_byte_allocate(byte_pool, (VOID**) &pointer,
                       TX_APP_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }
  if (tx_thread_create(&tx_app_thread, "Main Thread", MainThread_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;
  }

  if (tx_byte_allocate(byte_pool, (VOID **) &pointer,
                       TX_APP_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }

  if (tx_thread_create(&ThreadOne, "Thread One", ThreadOne_Entry, 0, pointer,
                       TX_APP_STACK_SIZE, THREAD_ONE_PRIO, THREAD_ONE_PREEMPTION_THRESHOLD,
                       TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START) != TX_SUCCESS)
  {
    return TX_THREAD_ERROR;
  }

  if (tx_byte_allocate(byte_pool, (VOID **) &pointer,
                       TX_APP_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }

  if (tx_thread_create(&ThreadTwo, "Thread Two", ThreadTwo_Entry, 0, pointer,
                       TX_APP_STACK_SIZE, THREAD_TWO_PRIO, THREAD_TWO_PREEMPTION_THRESHOLD,
                       TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START) != TX_SUCCESS)
  {
    return TX_THREAD_ERROR;
  }

  if (tx_event_flags_create(&EventFlag, "Event Flag") != TX_SUCCESS)
  {
    return TX_GROUP_ERROR;
  }
  /* USER CODE END App_ThreadX_Init */

  return ret;
}

其中典型线程是一个点灯

void ThreadOne_Entry(ULONG thread_input)
{
  (void) thread_input;
  uint8_t count = 0;
  /* Infinite loop */
  while(1)
  {
    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);

    /* Delay for 500ms (App_Delay is used to avoid context change). */
    App_Delay(50);
    count ++;
    if (count == 10)
    {
      count = 0;
      if (tx_event_flags_set(&EventFlag, THREAD_ONE_EVT, TX_OR) != TX_SUCCESS)
      {
        Error_Handler();
      }
    }
  }
}

2.2 ThreadX 线程创建应用说明

该应用提供了 Azure RTOS ThreadX 堆栈使用的示例,展示了如何使用 ThreadX 线程管理 API 开发应用程序。它演示了如何使用 Azure RTOS ThreadX API 创建和销毁多个线程。此外,它还展示了如何在线程之间使用抢占阈值和在运行时更改优先级。 在 ThreadX 内核启动期间,调用主要入口函数 tx_application_define()。在这个阶段,应用程序创建 3 个具有不同优先级的线程:

MainThread (优先级:5;抢占阈值:5) ThreadOne (优先级:10;抢占阈值:9) ThreadTwo (优先级:10;抢占阈值:10) 启动后,MainThread 挂起并等待事件标志。 ThreadOne 开始每 500ms 切换一次 LED_GREEN,而 ThreadTwo 无法这样做,因为它的优先级低于 ThreadOne 的阈值。 5 秒后,它向 MainThread 发送事件 THREAD_ONE_EVT。 收到 THREAD_ONE_EVT 后,MainThread 将 ThreadTwo 的优先级更改为 8,并将其抢占阈值更改为 8,以使其大于 ThreadOne 的阈值,然后等待事件。 现在,ThreadTwo 可以抢占 ThreadOne,并在 5 秒内每 200ms 切换一次 LED_GREEN。完成后,它向 MainThread 发送 THREAD_TWO_EVT。 一旦收到 THREAD_TWO_EVT,MainThread 将 ThreadTwo 的优先级和抢占阈值重置为它们的原始值(10, 10),ThreadOne 重新调度,并重做上述场景。 重复上述序列 3 次后,MainThread 应销毁 ThreadOne 和 ThreadTwo,并每秒切换一次 LED_GREEN。 预期成功行为 LED_GREEN 每 500ms 切换一次,持续 5 秒 LED_GREEN 每 200ms 切换一次,持续 5 秒 成功状态(3 次后):LED_GREEN 每秒切换一次,持续 forever。 错误行为 失败时,错误消息将打印到串口,同时 LED_GREEN 熄灭。

3 演示及小结

3.1 下载成功并正确启动运行

21.PNG

运行的结果是先快速闪灯,然后变化频率,最后经过3个循环后转换到持续的1秒闪灯的过程。

3.2 ThreadX 使用提示 ThreadX 使用 SysTick 作为时间基准,因此 HAL 必须通过 TIM IP 使用单独的时间基准。 ThreadX 在内核启动期间禁用所有中断以避免任何意外行为,因此所有系统相关调用(HAL、BSP)应要么在应用程序的开头执行,要么在线程入口函数内部执行。 ThreadX 提供了“tx_application_define()”函数,该函数由 tx_kernel_enter() API 自动调用。这个函数还可以在配置选项后启动一个内置的ASM汇编语言程序。这个是与其他的RTOS显著不同的点,基本没有提供这个来自底层代码的访问选择。

收藏 评论0 发布时间:2025-4-24 09:18

举报

0个回答

所属标签

相似分享

官网相关资源

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