ThreadX Mutex如何在STM32上工作?

互斥锁基本上是一个二进制信号量,这意味着一次只有一个线程可以拥有一个互斥锁。此外,同一个线程可以多次对所拥有的互斥执行成功的互斥获取操作。互斥对象上有两个主要操作:tx_mutex_get和tx_mutex_put。

get操作获得一个不属于另一个线程的互斥,而put操作释放先前获得的互斥。对于释放互斥的线程,put操作的数量必须等于先前get操作的数量。ThreadX互斥仅用于互斥,这意味着它与控制线程对某些应用程序区域(也称为关键部分或应用程序资源)的访问有关。

1.目标以下为:

本文的目的是通过一个关于互斥锁如何工作的工作示例提供一个简短的解释。尽管该示例使用NUCLEO-H223ZG,但您可以对其他基于STM32H7的板使用相同的步骤。主要区别通常是引脚输出和时钟配置。
本文将从头开始一个项目,使用STM32CubeIDE中提供的软件包添加AzureRTOS中间件,并添加一些代码行。2具有相同优先级的线程将用于展示互斥,控制printf(充当资源)。在这个演示中,两个线程都将收到互斥。这是演示演示:

了解功能:
UINT tx_mutex_get(tx_mutex*mute_ptr,ULONG wait_option);
 参数:
  • mute_ptr:指向先前创建的互斥对象的指针。
  • wait_option:定义如果互斥对象已经由另一个线程拥有,那么服务的行为。等待选项定义如下:
    • *TX_NO_WAIT:(0x00000000)-无论是否成功,选择TX_NO_ WAIT都会立即从该服务返回。
    • TX_WAIT_FOREVER超时值(0xFFFFFFFF)
    • timeout value(0x00000001到0xFFFFFFFE)-选择一个数字值(1-0xFFFFFFFE。
UINT tx_mutex_create(tx_mutex*互斥_ptr,CHAR*名称_ptr,UINT优先级_继承);
参数:
  • mute_ptr:指向互斥控制块的指针。
  • name_ptr:指向互斥对象名称的指针。
  • priority_inherit:指定此互斥对象是否支持优先级继承。如果此值为TX_INHERIT,则支持优先级继承。但是,如果指定了TX_NO_INHERIT,则此互斥对象不支持优先级继承。

2.STM32CubeIDE–逐步演示:


启动STM32CubeIDE(1.7.0使用的版本),选择您喜欢的工作空间,单击Launch(启动)。打开后,找到信息中心,选择启动新的STM32项目——或者,单击文件->新建->STM32项目。对于这个演示,我们将使用NUCLEO-H723ZG作为起点

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

在组件选择窗口中浏览并定位AzureRTOS包,然后o打开RTOS ThreadX并选中“核心”框,然后单击“确定”
这将在类别的下部添加软件包:

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

由于这个演示只是为了创建小的printfs来指示它是哪个线程并使用互斥,所以默认设置是可以的,但我们确实需要做另一个修改。默认情况下,HAL驱动程序将使用Systick作为其主要时基,但此计时器应仅留给AzureRTOS。We可以简单地为HAL选择不同的时基,方法是点击System Core/SYS并选择时基Source作为TIM6:

由于本演示中未使用USB和以太网,我们可以通过取消选中项目经理选项卡/高级设置中的复选框来将其删除:

所有设置,我们可以按Alt+K生成代码,并按Ctrl+S保存代码。该项目现在有了一组新的文件夹,以下是其结构的详细信息:

在本文的第二部分,我们将看到演示所需的代码以及如何调试它。

3.有用的链接和资源:

  • 文章第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描述第4章-Azure RTOS ThreadX服务描述| Microsoft文档
  • Github:https://github.com/STMicroelectronics/x-cube-azrtos-h7

4.结论:

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