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