本帖最后由 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。
|