在多核程序中外设是共享的,一般来说只有核0做初始化就够了。
DNUM是核心寄存器,它用来表示当前的程序跑在哪个核心。需要引用
#include <c6x.h>头文件
中断在每个核心都是独立的因此每个核心都要初始化一遍。每个核心的IPC事件中断号都是独立的,直接映射到CoreOPac不需要CIC。接下来判断程序运行在哪个核心去运行不同的任务,若是核心0,需要执行一个多核启动的操作,由于核心0是主核,是最先被引导的,引导其他核心需要两个步骤:
1、将其他核心的入口地址正确配置,使用MultiCoreBoot函数,参数1是启动哪个核心,参数2是启动地址。
2、写好这个地址后会向这个核发送一个IPC中断,第一次收到这个中断会查找这个入口地址,若这个地址有效则从这个地址开始运行。然后给启动标志位置位表示已经成功启动。(不太确定)
在接下来的通信中,若核心1启动完成,将一个标志位置位,向核心1发送一个中断,同时携带一个ID用来表示核心0到核心1的中断。
若核心0核心1正常初始化了以后核心1就会进到中断服务函数中,然后根据核心ID判断,若是1首先响应中断,首先清一下源ID,将flag修改,同时向核心0发送IPC中断,同样进入IPC中断服务函数,看到了修改后的flag值,实现了通讯。
对于c6678,使用了sys/bios,需要将对应地址的缓存关闭,因为涉及的通信数据是自己CPU以外的其他核心访问,打开缓存会使拿到的数据是旧的,因此需要关闭。从内存重新读数据,然后核心0将flag标志修改,由于核心0使能了缓存所以需要将缓存里面的值回写到内存中,然后向核心1发送ipc中断。核心1进入中断服务函数相应中断,然后将标志位flag改写再从缓存写回内存上,然后再触发一个IPC的中断通知核心0。在核心0中响应中断后,关闭缓存就跳过缓存从内存读数据并输出。