BinWin 发表于 2025-3-30 17:28

【STM32H745I-DISCO试用】双核共享外设

STM32H745是双核架构,那么如何共用同一个外设资源呢,厂家是有提供方法和例程的。
   打开例程文件夹内可以看到ResourcesManager_SharedResources的例程,也就是资源管理器的应用案例--共享资源。
   通过阅读readme.txt文件可知,该程序是在CM4和CM7的程序中同时使用USART3进行字符打印。CM4获取使用权限后,打印字符串,并在2S后释放资源。
CM7获取使用权限后,占用1S时间后释放,在PC的串口助手上就可以看到交替打印。
      
   很明显,同时使用是不可能的,那如何使两者都能使用呢?ST提供了资源管理器模块,也就是对一个资源列表的互斥管理。该例程中有如下相关函数使用

ResMgr_Status_tResMgr_Request ( uint32_t id, uint32_t flags, uint32_t prio, void *phandle)ResMgr_Status_tResMgr_Release ( uint32_t id, uint32_t flags)             即请求资源和释放资源。两个核对应的代码仅有占用时间的差别,其余相同,如下for (;;)
{
    do
    {
      status =ResMgr_Request(RESMGR_ID_USART1, RESMGR_FLAGS_ACCESS_NORMAL|\
      RESMGR_FLAGS_CPU2 , 0, NULL) ;
    }while (status == RESMGR_BUSY);

    /* Here We can use the resource */

    BSP_LED_On(LED2);

    if(HAL_UART_Init(&UartHandle) != HAL_OK)
    {
      /* Initialization Error */
      Error_Handler();
    }

    HAL_UART_Transmit(&UartHandle,CM4_Message,sizeof(CM4_Message),0xff);
    HAL_Delay(2000); /* To simulate the use of the resource*/
    if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
    {
      /* Initialization Error */
      Error_Handler();
    }
    ResMgr_Release(RESMGR_ID_USART1, RESMGR_FLAGS_CPU2);

    BSP_LED_Off(LED2);
    HAL_Delay(100);
}         HAL_UART_Init()是配置串口参数,实际使用的是串口3,这个串口连接到STLINK的虚拟串口,打印信息也是这个串口。但和下面函数 中RESMGR_ID_USART1不是真实对应关系,这里有可能会带来误解。status =ResMgr_Request(RESMGR_ID_USART1, RESMGR_FLAGS_ACCESS_NORMAL|\
      RESMGR_FLAGS_CPU2 , 0, NULL) ;       转到这个函数的内部,有RESMGR_TBL_LOCK()和RESMGR_TBL_UNLOCK(),这里就和其他库函数的__HAL_LOCK()类似了。其他是状态维护的代码。这里就用到HSEM,是一个硬件信号量。CM7加锁的资源,CM4是无法释放的。通过近似于互斥的管理方式,两个核轮流使用该资源。
   




jobszheng 发表于 2025-3-31 09:54

获取到使用权限了,仍然需要重新初始化一下吗?
是延续了之前的配置,还是必须要再 重新配置?
楼主有测试吗?

BinWin 发表于 2025-3-31 21:03

jobszheng 发表于 2025-3-31 09:54
获取到使用权限了,仍然需要重新初始化一下吗?
是延续了之前的配置,还是必须要再 重新配置?
楼主有测试 ...

使用之前HAL_UART_Init(&UartHandle),使用之后HAL_UART_DeInit(&UartHandle)是为了保证每次使用按照当前内核所需的配置参数来运行。例程使用配置完全一样,确实可以在进入循环之前HAL_UART_Init(&UartHandle) 一次就可以了。

丢丢手绢666 发表于 2025-3-31 23:46

CM4和CM7核通过资源管理器共享这个外设。每个核都尝试访问USART3进行数据打印,但在每次访问之前,都会通过资源管理器申请访问权限。

wengh2016 发表于 2025-4-4 18:04

为避免两个内核同时访问同一外设资源而引发冲突,可使用互斥锁机制。

rosemoore 发表于 2025-4-5 19:53

对于需要频繁交换数据的场景,可以使用共享内存来实现数据的同步。通过在共享内存中定义数据结构,两个内核可以安全地读写数据。

updownq 发表于 2025-4-5 21:23

无需手动管理共享内存。
支持中断触发和优先级管理。

chenjun89 发表于 2025-4-5 21:30

双核编程,怎么烧写程序呢?

ccook11 发表于 2025-4-8 10:19

定义外设的所有权、访问顺序和异常处理机制。

jimmhu 发表于 2025-4-8 13:30

合理分配总线权限、复用功能和外设模式。

alvpeg 发表于 2025-4-8 16:39

使用互斥锁            

linfelix 发表于 2025-4-9 22:12

FreeRTOS 等 RTOS 提供了信号量、消息队列和内存保护机制,简化双核协作。

ingramward 发表于 2025-4-10 01:16

共享外设的时钟源在两个核心之间正确配置和共享。

backlugin 发表于 2025-4-10 14:20

STM32H745 提供了共享内存区域,两个内核能够通过该区域交换数据和状态信息。

uiint 发表于 2025-4-10 15:58

将与外设相关的任务分离到不同的核上,以减少双核之间的交互和同步需求。

minzisc 发表于 2025-4-10 16:18

在 STM32H745 里,可借助硬件标志位或者软件标志位来实现。

earlmax 发表于 2025-4-10 16:35

定义一个全局变量当作标志位,在访问外设前,先检查该标志位的状态。若标志位表明资源未被占用,就将其置为占用状态,接着访问外设;使用完毕后,再把标志位恢复为未占用状态。

ccook11 发表于 2025-4-10 17:36

可以使用互斥锁(Mutex)来实现外设资源的互斥访问。

10299823 发表于 2025-4-10 18:39

通过信号量、DMA、中断优先级实现资源调度。

janewood 发表于 2025-4-10 20:12

按照预先设定的时间片,让两个内核轮流使用外设资源。可以利用定时器来实现时间片的切换。
页: [1] 2
查看完整版本: 【STM32H745I-DISCO试用】双核共享外设