ThreadX消息队列如何在STM32上工作第2部分
ThreadX消息队列如何在STM32上工作?这是本文的第2部分,通过工作示例解释ThreadX消息队列如何在STM32上工作。欢迎回来!1.STM32CubeIDE–逐步演示:启动STM32CubeIDE(1.7.0使用的版本)。。。
ThreadX消息队列如何在STM32上工作?
这是本文的第2部分,通过工作示例解释ThreadX消息队列如何在STM32上工作。欢迎回来!
1.STM32CubeIDE–逐步演示:
启动STM32CubeIDE(1.7.0使用的版本),选择您喜欢的工作空间,单击Launch(启动)。打开后,找到信息中心,选择启动新的STM32项目——或者,单击文件->新建->STM32项目。对于这个演示,我们将使用NUCLEO-H723ZG作为起点

给你的项目起一个名字,只需记住避免空格和特殊字符——本文给出的名字是“队列”
一个弹出窗口询问我们是否应该在默认模式下初始化外围设备,单击“是”。然后第二个弹出窗口要求打开设备配置透视图,再次单击“是”
添加软件包的时间:

在组件选择窗口中浏览并定位AzureRTOS包:

打开RTOS ThreadX并选中Core(核心)框,然后单击OK(确定)


现在,通过单击它,您可以添加RTOS ThreadX框,这将显示AzureRTOS应用程序的配置选项

由于这个演示只是为了创建小的printfs来指示它是哪个线程并使用消息队列,所以默认设置是可以的,但我们确实需要做另一个修改。默认情况下,HAL驱动程序将使用Systick作为其主要时基,但此计时器应仅留给AzureRTOS。
如果HAL库没有单独的时间源,编译将失败,因为两个库都想使用SysTick_Handler中断。为了防止这种情况,我们可以简单地为HAL选择一个不同的时基,方法是点击System Core/SYS并选择时基Source作为TIM6:

最后一个修改是,为了防止生成太多未使用的代码,我们可以决定不创建USB和以太网的功能,因为它们是在我们基于板创建设计时本地添加的,这可以通过删除它们的生成代码来完成:

一切就绪,我们可以按Alt+K生成代码,按Ctrl+S保存代码:

该项目现在有了一组新的文件夹,以下是其结构的详细信息:

最后一部分是创建我们的演示代码。简单回顾一下,演示的第一部分将使用单个发送方和接收方,使用队列发送消息:

Open Core\Src\app_threadx.c–在这里,我们将使用命令tx_thread_create和消息队列创建2个线程,方法是使用tx_queue_create。
Sender1线程将发送队列消息,增加内容,然后休眠2秒,以避免向终端发送垃圾邮件。接收器线程始终处于挂起模式,等待接收队列。您可以复制并粘贴下面的代码,请使用用户代码找到正确的区域进行粘贴:
/*用户代码开始包括*/#include“stdio.h”#include”main.h“/*用户代码结束包括*/
/*用户代码开始PD*/#定义THREAD_STACK_SIZE 512#定义QUEUE_STACK_IZE 128/*用户代码结束PD*/
/*用户代码开始PV*/uint8_t thread_sender1[thread_STACK_SIZE];uint8_t线程接收器[thread_STACK_SIZE];uint8_t queue_stack[queue_stack_SIZE];TX_THREAD发送器1_ptr;TX_THREAD接收器ptr;TX_QUEUE队列_ptr;/*用户代码端PV*/
/*用户代码开始PFP*/无效发件人1(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(&receiver_ptr,“接收器”,接收器,0,thread_receiver,thread_STACK_SIZE,15,15,1,tx_AUTO_START);/*用户代码END App_ThreadX_Init*/return ret;}
/*用户代码BEGIN 1*/VOID Sender1(ULONG initial_input){/*无限循环*/uint32_t message1=0;for(;;){printf(“Sender1\r\n”);tx_queue_send(&queue_ptr,&message1,tx_NO_WAIT);printf(”Sender1 delay\r\n“);message1++;/*睡眠2秒*/tx_thread_Sleep(200);}}VOID Receiver年(&queue_ptr,&message_received,TX_WAIT_FOREVER);printf(“收到的消息:%lu\r\n”,message_received);}/*用户代码端1*/打开Core\Src\main.c–您可以复制并粘贴以下代码:
/*用户代码开始0*/void __io_putchar(char ch){//在UART HAL_UART_Transmit上写入字符“ch”的代码(&huart3,(uint8_t*)&ch,1,10);}/*用户代码结束0*/从这一点开始,按Ctrl+B进行构建,您应该会看到0个错误和0个警告。
将板连接到计算机,并通过首先单击项目名称,然后菜单“运行/调试为/STM32”进入调试模式。在“编辑配置”窗口中,单击“调试”:

进入“调试”透视图后,单击“继续”按钮,即可享受使用互斥操作的ThreadX应用程序。您还可以使用窗口/显示视图/ThreadX/ThreadX线程列表,并对ThreadX队列再次执行此操作,以增强整体调试选项(一旦应用程序运行一段时间并暂停,线程列表将自动加载):

现在,最后一步是启用STM32CubeIDE中的控制台来查看打印消息。找到“控制台”选项卡,然后单击命令行外壳控制台:

在弹出窗口中,将“连接类型”更改为“串行端口”,然后单击“新建…”添加与STLINK相关的VCOM:

您可以给端口一个名称,这样以后也更容易使用,在这种情况下,它将被标记为NUCLEO_H723ZI:

单击finish,控制台上的消息将指示它现在已连接。
以下是在启用了线程和队列视图的情况下,在接收器线程中添加断点时的调试视图。可以看到队列的大小为32,这是因为在创建队列时,它被设置为具有堆栈大小为128字节的单个字(32位长或4字节长),因此128/4=32。您还可以检查“消息队列”选项卡是否显示当前队列中有1条消息,因此可用大小为31:

通过删除断点,添加控制台视图并点击F8,我们可以看到运行的代码和显示的消息:

在第三部分也是最后一部分中,我们将添加第二个发送方线程,并探讨优先级更改的影响。
再见!
https://community.st.com/s/article/how-do-threadx-message-queues-work-on-stm32-part-3