1.现在将UC/OS-II操作系统向多核扩展,但是,运行多任务的内核的许多操作需要获取当前运行core的ID,
请问6678有没有物理机制上的coreID,然后有没有提供一种方式去获取这个ID呢?
2.semaphore2的核间互斥机制,采用direct request方式请求信号量,read之后获取信号量,
然后SEM_DIRECTx寄存器的相应位(标示拥有信号量的CoreID和信号量是否FREE)是由硬件直接改写的吗?
如果是,这个CoreID又是怎样获取到的呢?
还有就是read操作可以这样写吗
#define SEM_DIRECT0 *(INT32U*)0x.........//配置寄存器地址
void get_sem()//DIRECT方式请求信号量
{
while(SEM_DIRECT0 != 0x1){}//如果读取的值为COREID(不是0x1)则一直循环读取,直到读取值为0x0 }
void post_sem()//释放信号量
{
SEM_DIRECT0 = 0x1//设置
}
3.有没有相关的PLL、EMIF、TIMER、MMU相关的初始化例程?
新手上路,请多多指教!!谢谢
xiangzhong kong:
回复 Andy Yin:
Andy Yin 您好,
首先谢谢您的回复。我现在仍有几个问题,
1.6678的数据手册里面没有DNUM的地址映射,请问这个要在哪个文档里面找?
2.PDK是什么?初次做这方面的东西,对TI的一些工具,程序例程,技术资料不是很了解,还请多多指导。
3.启动过程中主核通过发送IPC中断给从核,让从核开始初始化,这个IPC的中断响应需要有中断返回吗?(我觉得是没有,但是这又和一般的中断有中断响应、中断返回产生不一致)
4.TIMER的问题,让每个核拥有相同的时钟频率,但是让这些核不在同一时间点产生时钟中断,(也就是说让不同的核在不同的时刻产生时钟中断)。这个要怎么样实现呢?请给些建议。
谢谢!!!
Andy Yin:
回复 xiangzhong kong:
xiangzhong kong 你好,
1. DNUM是一个通用的Register,可在C66X CPU and instruction set中找到;
2. PDK是TI针对DSP的加速器及外设等开发的底层驱动,相关的资料可以在下面的网页找到.
processors.wiki.ti.com/…/C66x
3. 关于IPC请参考样例。
www.deyisupport.com/…/2535.aspx
【资料共享】如何使用TI的IPC模块
4. 针对不同核的需求可以通过配置不同的timer产生中断。
xiangzhong kong:
回复 Andy Yin:
Andy Yin 您好,
再次谢谢您的回复。还要请教您几个问题。
1.获取coreID,通过读寄存器DNUM。但是这个读(读取之后将这个值存到一个变量里面)要怎么写呢?我对DSP的汇编不是太懂。
int coreID'
int *x;
x=&coreID; //获取coreID的地址
READ_CPU_NUM(x);
//宏定义
#define READ_CPU_NUM(x) asm(".global _x" //引用一个在C中定义的变量
"mvkl _x,B4" //将coreID的地址写入B4寄存器
"mvkh _x,B4"
"mvc DNUM,B6" //将DNUM的值写入B6
"STW B6,*B4" //将B6的值写到B4中存储的地址(X)所指向的coreID中
)
您看这样写对吗?
2.所有的核共用一个中断服务表吗?即只有一个ISTP寄存器吗?
3.安装了CCSV5版本,但是找不到CSL文件夹。
敬请指导,谢谢!!!
Andy Yin:
回复 xiangzhong kong:
xiangzhong kong您好,
1. Uint coreID = DNUM; 即可
2. 每个核有独立的中断服务表.
3. 我查了一下我自己安装的CCS,其中没有自带的CSL,只在PDK中有。
xiangzhong kong:
回复 Andy Yin:
Andy Yin谢谢!
请问:
1.片级中断控制器INTC里面有个host interrupt的概念,请问它是不是对应于CorePac内中断控制器的Event事件?
2.c6678有的INTC0和INTC1的input event事件源是相同的,但是out输出分别对应于core0-3和core4-7.请问当一个外部中断产生的时候,该中断是由INTC0还是INTC1来处理呢?这个是怎样的选择?硬件随即决定的吗?
3.c6678每个核有独立的中断服务表,那么每个核都有自己的与中断处理相关的8个寄存器(CSR\IFR\IER等),那么每个核也有独立的ISTP寄存器,但是每个ISTP的ISTB在reset之后的默认值是多少?在data manual里面没有找到。
Andy Yin:
回复 xiangzhong kong:
xiangzhong kong您好,
1. INTC中的host interrupt对应你所说的Event事件;
2. 对于INTC0与INTC1均存在的input event,INTC0与INTC1均可处理,可以根据应用选择enable相应的INTCx并map到相应的output channel,然后映射到相应的中断等即可;
si cheng:
回复 Andy Yin:
您好:
1.您说的"enable相应的INTCx"应该是操作ENABLE_SET_INDEX_REG寄存器,使能对应的系统事件吧?
2.某个系统事件发生时,我如何将该事件映射到INTC四个控制器中的一个?寄存器CH_MAP_REGx的位域
CH0_MAP-CH3_MAP代表着INTC0-INT3吗?
3.CH_MAP_REGx有256个,当某个系统事件发生时,我该将事件映射到256个寄存器中的哪个?
谢谢!
xiangzhong kong:
回复 Andy Yin:
Andy Yin您好,
1.您前面提到,c6678每个核有独立的中断服务表,那么是不是每个核都有独立的与中断处理相关的8个寄存器(CSR、IFR、IER等)?如果是的话,那么每个核也有独立的ISTP寄存器,但是每个ISTP的ISTB在reset之后的默认值是多少?在data manual里面没有找到。
2.如果每个核有独立的中断相关寄存器。启动的时候,先初始化core0(主核),其他core(从核)执行空指令,并处于等待IPC中断的状态,(这时候从核应该是没做任何初始化的,包括IER也没有初始化,不知道是不是这样?)。如果是的话,这里有一个问题:从核在reset之后IER是禁止所有可屏蔽中断的,那么它怎么去发现并响应主核发送的启动IPC呢?
谢谢!
Andy Yin:
回复 xiangzhong kong:
xiangzhong kong您好,
1. 关于INTC请参考INTC Controller user guide www.ti.com/…/sprugw4 中的说明与例子,并结合CSL更深层次理解如何操作寄存器;同时可以参考www.deyisupport.com/…/2034.aspx 其中hardware semaphore关于INTC的使用;
2. 默认值在data manual没看到,但是可以通过CCSC>view->register查看复位值;
3. 在初始化过程多核均需根据需要做初始化,如果使用IPC进行多核同步,则需要对多核对IPC相关中断做好初始化配置工作。
不同的问题请另起帖子,谢谢!
TI中文支持网

