打印
[STM32H7]

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

[复制链接]
63|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 sujingliang 于 2025-1-21 13:04 编辑

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

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

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

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

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

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

一、STM32CuteMX配置
1、GPIO配置

配置2个GPIO驱动LED

output level设为high,保证LED初始为关闭。

2、CM4中断配置

CM7释放硬件信号量后,CM4会进入HSEM2中断。
void HSEM2_IRQHandler(void)
{
  /* USER CODE BEGIN HSEM2_IRQn 0 */

  /* USER CODE END HSEM2_IRQn 0 */
  HAL_HSEM_IRQHandler();
  /* USER CODE BEGIN HSEM2_IRQn 1 */

  /* USER CODE END HSEM2_IRQn 1 */
}

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

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

2、CM4程序

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


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

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

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


三、运行效果



CM7控制绿LED,每亮5次释放硬件信号量,CM4进入HSEM中断,置标志位,翻转红LED。

使用特权

评论回复
沙发
理想阳| | 2025-1-21 14:58 | 只看该作者
HSEM通信速率可以达到多少?

使用特权

评论回复
板凳
Amazingxixixi| | 2025-1-21 16:49 | 只看该作者
学习一下啊,还有好多需要学习的。

使用特权

评论回复
地板
xionghaoyun| | 2025-1-21 17:12 | 只看该作者
分享代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

89

帖子

0

粉丝