双核心之间如何互相协调
随着汽车智能化的不断发展,汽车电子行业有着越来越大的市场。作为NXP在汽车电子上主推的控制器件,MPC系列高性能和高安全性MCU正在逐步提高自身的地位,发挥着更为显著的作用。本文以MPC5746R的实际应用为例,讲解双核心之间如何互相协调,共同发挥更大的性能。
MPC5746R采用双CPU核心机制,两个独立可编程的基于e200z425的内核0和内核1,每个内核主频最高可达200M。另外还有一个基于e200z424的安全内核用于和内核0同步运行,以确保程序运行时的可靠性。
MPC5746R的两个核心共享片内外设及内存单元。同时中断控制器可以为两个核心提供各自独立的控制单元,使中断请求可以根据用户设置而交给不同的核心处理。
用户可以为两个内核编写各自独立的程序,看上去就像一个系统运行了两个线程。事实也确实如此,两个内核并行以200M的速度执行用户为其各自编写的程序,处理着各种复杂的任务。但是有时候也会出现一些问题导致不愉快的事情发生。
可以举几个例子:
1) 某一时刻,内核1要往某个寄存器写数据来执行功能1,但不巧此时内核0也需要往这个寄存器写数据来执行功能0。同时写入冲突可能导致功能0和功能1都不能正常执行,这时应该何如避免。
2) 由于外设资源只有1份,假设用户设定让内核1初始化系统和资源,内核0需要在初始化完成后执行相关功能操作,那么内核0如何在第一时间内知道初始化已经完成。
3) 内核1和内核0合作处理复杂的算法,当内核0处理完了一部分算法之后想把处理结果交给内核1,这时候彼此独立的双核之间如何通信。通信时间如何节省。
其实芯片在设计的时候,早已考虑好了这些问题,并做出了相应的功能来保证双核之间的协调运作。基于以上的示例,我们需要了解一个重要的知识点叫做信号量,信号量是一种在进程之间作用资源保护和同步的机制。
MPC5746R提供了16路的硬件信号量供用户使用,用户可以写入处理器对应的号码以锁定某一路信号量并且只有锁定该信号的处理器能解锁该信号。这样就为处理器之间的资源访问保护及同步提供了硬件基础。
我们以具体的方法来解决上诉三个例子所面临的问题:
1) 内核在写入某个寄存器之前,先检测信号量是否锁定,如果锁定,等待信号解锁再进行操作,如果没有锁定,则先锁定一个信号量,等到操作完成后,再释放信号量,这样就不会出现共享资源的访问冲突。
2) 内核0需要等待内核1初始化完成之后才能进行功能操作,即与内核1之间进行同步。可以在内核1程序开始的时候,上锁信号量,等各项初始化完成之后,解锁信号量。而内核0则在程序开始的时候就等待该信号量的解锁,一旦解锁,就说明初始化完成,即完成同步操作,也就解决了上诉第二个问题。
3) 两个内核在通信的时候,最重要的一个问题是接收方如何随时准备好接收数据而不过多消耗CPU资源。在MPC5746R中,可以通过软中断解决。内核1 需要发送数据给内核0的时候,先配置好软件中断的优先级,然后将中断请求设置成内核0。在数据写入之后,触发中断,中断请求发送至内核0。而内核0只要写好相应的中断服务函数,就能在不过多消耗CPU资源的情况下,通过中断接收数据,完成内核间的通信。
需要注意的是,对于独立的双核之间通信数据的存取,MPC5746R并没有为此单独开辟一个空间。但是在实际应用中,一种可行的方法是灵活的使用各通信模块中,未使用的缓冲单元。例如CAN模块中,最多有96个数据缓冲结构,CAN通信的过程中并不一定都会使用,我们可以根据实际需要使用几个数据缓冲单元作为内核间数据传输的通道。需要发送数据的内核将数据写入指定的数据缓冲结构体,然后触发软件中断。接收一方在中断服务函数中将数据从数据缓冲结构体中读取出来。可以在缓冲结构体中设置一些标志位来判断读写是否成功。
以上就是双核之间资源保护,同步和通信的一些具体示例方法,当然方法并不是唯一的,希望读者在使用过程中能够举一反三,灵活运用,最终达到"双核交火,协同作战"的目的。
cpu 相关文章:
- 基于自适应技术的CPU供电电路系统(10-27)
- 嵌入式CPU卡在医用便携式监护仪中的应用及设计(09-23)
- 四核Vs八核移动处理器 性能差异并不大(03-10)
- 可编程逻辑控制器(PLC)基本操作及功能简介(03-07)
- 评测:采用AMD APU平台的联想启天M5800——均衡+全能(02-17)
- 智能手机省电秘诀:看如何从设计源头来降低功耗(02-14)