ThreadX消息队列如何在STM32上工作?

欢迎回到“ThreadX消息队列如何在STM32上工作”文章的第三部分。

1.如何添加Sender2线程

现在第一个演示已经完成,让我们添加Sender2线程并评估行为。为此,让我们添加这些代码行。为了简化这个过程,以下是添加了Sender2附加代码的完整代码,因此您可以简单地替换前一个:
 
/*用户代码开始PV*/uint8_t thread_sender1[thread_STACK_SIZE];uint8_t thread_sender2[thread_STACK_SIZE];uint8_t线程接收器[thread_STACK_SIZE];uint8_t queue_stack[queue_stack_SIZE];TX_THREAD发送器1_ptr;TX_THREAD发送器2_ptr;TX_THREAD接收器ptr;TX_QUEUE队列_ptr;/*用户代码端PV*/
/*用户代码开始PFP*/无效发件人1(ULONG initial_input);无效发送器2(ULONG initial_input);VOID接收器(ULONG initial_input);/*用户代码端PFP*/
UINT App_ThreadX_Init(VOID*memory_ptr){UINT ret=TX_SUCCESS;TX_BYTE_POOL*BYTE_POOL=(TX_BYTE_POOL*)memory_ptr;/*用户代码BEGIN App_ThreadsX_MEM_POOL*/(VOID)BYTE_pol;/*结束应用程序线程MEM_POOL*/*用户代码开始应用程序线程初始化*/TX_queue_create(&queue_ptr,“队列0”,1,queue_stack,128);TX_thread_create,发送器1,0,thread_Sender1,thread_STACK_SIZE,15,15,1,TX_AUTO_START);tx_thread_create(&sender2_ptr,“sender2”,sender2,0,thread_sender2,thread_STACK_SIZE,15,15,1,tx_AUTO_START);tx_thread_create(&receiver_ptr,“接收器”,接收器,0,thread_receiver,thread_STACK_SIZE,15,15,1,tx_AUTO_START);/*用户代码END App_ThreadX_Init*/return ret;}
/*用户代码BEGIN 1*/VOID Sender2(ULONG initial_input){/*无限循环*/uint32_t message2=2;for(;;){printf(“Sender2\r\n”);tx_queue_send(&queue_ptr,&message2,tx_NO_WAIT);printf(”Sender2 delay\r\n“);/*睡眠2秒*/tx_thread_Sleep(200);}
正如您所看到的,Sender2将始终发送消息“2”,Sender1将继续在每次交互时将其消息值增加一。
按Ctrl+B构建并进入调试模式。通过允许项目运行,我们将看到打印的订单是:

这正是我们预期的流量:

现在,作为最后的更改,修改Receiver线程的优先级和抢占优先级,看看我们如何稍微更改一下。
回想一下,优先级和抢占阈值参数是这样工作的:
  • priority:线程的数字优先级。合法值的范围从0到(TX_MAX_PRIORITES-1),其中值0表示最高优先级。
  • preempt_threshold:禁用抢占的最高优先级(0到(TX_MAX_PRIORITIES-1))。只有高于此级别的优先级才允许抢占此线程。此值必须小于或等于指定的优先级。等于线程优先级的值将禁用抢占阈值。
接收器线程应更新为如下所示:
tx_thread_create(&receiver_ptr,“接收器”,接收器,0,thread_receiver,thread_STACK_SIZE,10,1,tx_AUTO_START);
现在Receiver线程具有更高的优先级,我们知道它将是应用程序启动时调用的第一个线程,此外,只要队列可用,它就可以抢占Sender1和Sender2线程,并且它只能被优先级为10的线程抢占,这在演示中不存在,因此我们可以预期会发生这种情况:

正如我们在构建和调试时所看到的,这是预期的流程:

这就是队列文章,希望你喜欢!

2.有用的链接:

  • 文章第1部分第2部分
  • STM32管:https://www.st.com/en/development-tools/stm32cubeide.html
  • 核子-H723ZG:https://www.st.com/en/evaluation-tools/nucleo-h723zg.html
  • ThreadX用户指南https://docs.microsoft.com/en-us/azure/rtos/threadx/about-this-guide
  • ThreadX API描述第3章-Azure RTOS ThreadX的功能组件| Microsoft文档
  • Github:https://github.com/STMicroelectronics/x-cube-azrtos-h7

3.结论: 

向ThreadX应用程序添加队列包括:
    • 在STM32CubeMX/STM32CubeIDE中添加ThreadX组件
    • 在STM32CubeMX/STM32CubeIDE中适配ThreadX配置
    • 从STM32CubeMX/STM32CubeIDE生成代码
      1. 这将使用所有需要的文件更新项目结构
    • 使用ThreadX API创建ThreadX组件线程和队列
    • 玩得高兴