【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
获取到使用权限了,仍然需要重新初始化一下吗?
是延续了之前的配置,还是必须要再 重新配置?
楼主有测试 ...
使用之前HAL_UART_Init(&UartHandle),使用之后HAL_UART_DeInit(&UartHandle)是为了保证每次使用按照当前内核所需的配置参数来运行。例程使用配置完全一样,确实可以在进入循环之前HAL_UART_Init(&UartHandle) 一次就可以了。 CM4和CM7核通过资源管理器共享这个外设。每个核都尝试访问USART3进行数据打印,但在每次访问之前,都会通过资源管理器申请访问权限。 为避免两个内核同时访问同一外设资源而引发冲突,可使用互斥锁机制。 对于需要频繁交换数据的场景,可以使用共享内存来实现数据的同步。通过在共享内存中定义数据结构,两个内核可以安全地读写数据。 无需手动管理共享内存。
支持中断触发和优先级管理。 双核编程,怎么烧写程序呢? 定义外设的所有权、访问顺序和异常处理机制。 合理分配总线权限、复用功能和外设模式。 使用互斥锁 FreeRTOS 等 RTOS 提供了信号量、消息队列和内存保护机制,简化双核协作。 共享外设的时钟源在两个核心之间正确配置和共享。 STM32H745 提供了共享内存区域,两个内核能够通过该区域交换数据和状态信息。 将与外设相关的任务分离到不同的核上,以减少双核之间的交互和同步需求。 在 STM32H745 里,可借助硬件标志位或者软件标志位来实现。 定义一个全局变量当作标志位,在访问外设前,先检查该标志位的状态。若标志位表明资源未被占用,就将其置为占用状态,接着访问外设;使用完毕后,再把标志位恢复为未占用状态。 可以使用互斥锁(Mutex)来实现外设资源的互斥访问。 通过信号量、DMA、中断优先级实现资源调度。 按照预先设定的时间片,让两个内核轮流使用外设资源。可以利用定时器来实现时间片的切换。
页:
[1]
2