HSEM--双核MCU_H417的核与核之间的硬件信号量
在RTOS中,信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资
源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要
同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。在双核MCU中同样存在
核与核之间对公共资源的访问,任务同步等问题,H417提供了32路硬件信号量通道,用于在多核中不
同进程运行间的同步操作,并提供非阻塞单指令锁定模式。
1,通知:
我们可以利用此机制实现双核之间通知
配置如下:
中断服务函数:
当我们屏蔽掉上面的释放信号量函数时,发现V3中的代码会一直卡在
while(Notif_Rx == 0)标志上。,
2,同步:
一般有两种方式,可以利用上面的释放信号量产生中断来唤醒对应核来实现,其实我们几乎任意demo都采用了该机制
也就相当于是例程的执行流程一般都是:先进V3,V3里NVIC_WakeUp_V5F(Core_V5F_StartAddr);唤醒V5,然后执
行V5,并且此时V3进入低功耗,然后V5触发信号量,唤醒V3,从而实现双核的同步。
方式1,
该方式也可以放到主循环while1中,以实现低功耗的目的。
方式2,我们采用硬件信号量机制:
这个就比较好理解了,不在过多赘述,其中一个核心释放信号量,才会跳过该循环,以实现同步的目的。
while(HSEM_GetOneSemTakenState(HSEM_ID0) == 0)
3,互斥
既然是双核心,避免不了的可能会同时使用到共享资源,如都需要使用同一个通讯接口发送数据,同一个IO,同一段
内存等,这个是不能同时使用的,不然可能会造成一些意料之外的问题,需要避免,这时就可以利用硬件信号量实现互斥
的机制。我们来验证下。
这时我们通过串口打印可以很清晰的看到,当PA1接地时,V3申请到信号量,
这时V5中将会一直打印printf("V5 get no ok..\r\n");,当松开PA1时,V5得以
申请到信号量。