[STM32H7] 【STM32H745I-DISCO试用】3、核心间通知

[复制链接]
 楼主| sujingliang 发表于 2025-1-21 12:47 | 显示全部楼层 |阅读模式
<
本帖最后由 sujingliang 于 2025-1-21 18:44 编辑

为了解决双核之间的协同工作问题,ST设计了硬件信号量 (HSEM)。
硬件信号量(HSEM)是一种在硬件层面实现的信号量机制,它主要用于管理共享资源的访问权限和同步操作,特别是在多核处理器系统中。以下是对硬件信号量(HSEM)的详细解释:

硬件信号量是一种硬件资源,它允许处理器核心之间或任务之间通过硬件机制进行同步。与软件信号量相比,硬件信号量具有更高的效率和更低的延迟,因为它是在硬件层面实现的,不依赖于操作系统的调度。

硬件信号量通常包含两个主要的操作:获取(Take)和释放(Release)。
获取(Take):当一个处理器核心或任务需要访问共享资源时,它会尝试获取硬件信号量。如果信号量当前可用(即未被其他核心或任务占用),则获取操作成功,信号量的状态会更新为“已占用”。如果信号量不可用,则获取操作会失败,并且可以根据具体的实现方式,选择阻塞当前核心或任务,直到信号量变为可用,或者通过中断方式通知当前核心或任务。
释放(Release):当处理器核心或任务完成共享资源的访问后,它会释放硬件信号量。这会将信号量的状态更新为“可用”,从而允许其他等待的核心或任务获取该信号量。

硬件信号量的实现方式可能因具体的硬件平台和处理器架构而异。以下是一些常见的实现方式:
基于寄存器的实现:在某些处理器中,硬件信号量可能通过特定的寄存器来实现。这些寄存器用于存储信号量的状态和相关信息。例如,在STM32系列单片机中,HSEM(硬件信号量)就是通过一组寄存器来实现的,每个信号量都有一个独立的Rx寄存器和RLRx寄存器,用于获取和释放信号量。

基于中断的实现:当信号量不可用时,等待的核心或任务可以通过中断方式被通知。当其他核心或任务释放信号量时,会产生一个中断信号,通知等待的核心或任务信号量已经变为可用。这种方式可以减少等待时间,提高系统的响应能力。

本文描述双核之间通过硬件信号量 (HSEM)进行消息通知实现对LED的控制

一、STM32CuteMX配置
1、GPIO配置
26.png
配置2个GPIO驱动LED
55904678f2324008d1.png
output level设为high,保证LED初始为关闭。

2、CM4中断配置
25.png
设置好CM4中断后,在CM7释放硬件信号量后,CM4会进入HSEM2中断处理程序:
  1. void HSEM2_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN HSEM2_IRQn 0 */

  4.   /* USER CODE END HSEM2_IRQn 0 */
  5.   HAL_HSEM_IRQHandler();
  6.   /* USER CODE BEGIN HSEM2_IRQn 1 */

  7.   /* USER CODE END HSEM2_IRQn 1 */
  8. }

二、程序
1、CM7程序
  1.   while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.           HAL_HSEM_FastTake(HSEM_ID_0);
  6.           for(int i=0;i<10;i++)
  7.           {
  8.                   HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
  9.                     HAL_Delay(100);
  10.           }
  11.           HAL_HSEM_Release(HSEM_ID_0,0);
  12.   }
HAL_HSEM_FastTake(HSEM_ID_0);获得硬件信号量:CM7工作,CM4等待中断
翻转10次LED,LED亮5次。
HAL_HSEM_Release(HSEM_ID_0,0);释放硬件信号量:将控制权交给CM4

2、CM4程序

  1. void HAL_HSEM_FreeCallback(uint32_t SemMask)
  2. {
  3.         notifReceived=1;
  4.         HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
  5. }
新增HSEM中断回调函数,设置标志notifReceived=1;
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));激活可以获取下一次HSEM通知


  1.   notifReceived=0;
  2.   HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
  3.   /* USER CODE END 2 */

  4.   /* Infinite loop */
  5.   /* USER CODE BEGIN WHILE */
  6.   while (1)
  7.   {
  8.     /* USER CODE END WHILE */

  9.     /* USER CODE BEGIN 3 */

  10.           if(notifReceived==1)
  11.           {
  12.                   notifReceived=0;
  13.                  HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
  14.           }
  15.   }
  16.   /* USER CODE END 3 */
进入while(1)前,初始化标志notifReceived。
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));激活可以获取下一次HSEM通知
如果标志notifReceived为1,翻转LED。


三、运行效果

tutieshi_640x1137_5s (1).gif

CM7控制绿LED,每亮5次释放硬件信号量,CM4进入HSEM中断,置标志位,翻转红LED。
理想阳 发表于 2025-1-21 14:58 | 显示全部楼层
HSEM通信速率可以达到多少?
Amazingxixixi 发表于 2025-1-21 16:49 | 显示全部楼层
学习一下啊,还有好多需要学习的。
xionghaoyun 发表于 2025-1-21 17:12 | 显示全部楼层
分享代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部