[STM32H7]

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

[复制链接]
1458|37
手机看帖
扫描二维码
随时随地手机跟帖
BinWin|  楼主 | 2025-3-30 17:28 | 显示全部楼层 |阅读模式
  STM32H745是双核架构,那么如何共用同一个外设资源呢,厂家是有提供方法和例程的。
     打开例程文件夹内可以看到ResourcesManager_SharedResources的例程,也就是资源管理器的应用案例--共享资源。
     通过阅读readme.txt文件可知,该程序是在CM4和CM7的程序中同时使用USART3进行字符打印。CM4获取使用权限后,打印字符串,并在2S后释放资源。
CM7获取使用权限后,占用1S时间后释放,在PC的串口助手上就可以看到交替打印。
       1.png
     很明显,同时使用是不可能的,那如何使两者都能使用呢?ST提供了资源管理器模块,也就是对一个资源列表的互斥管理。该例程中有如下相关函数使用

ResMgr_Status_t  ResMgr_Request ( uint32_t id, uint32_t flags, uint32_t prio, void *phandle)
ResMgr_Status_t  ResMgr_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 | 显示全部楼层
按照预先设定的时间片,让两个内核轮流使用外设资源。可以利用定时器来实现时间片的切换。

使用特权

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

本版积分规则

20

主题

65

帖子

0

粉丝