This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6678获取cpuid问题...



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 你好,

    1. 直接读取寄存器DNUM即可获取当前coreID;

    2. direct方式请求信号量,读取相应SEM_DIRECTx寄存器的相应位即可,如果为1表示获取信号量成功,该位由硬件改写,不需软件维护;读取寄存器SEM_DIRECTx中的OWNER位即可获取该信号量当前的owner cpuID;

    上述请求及释放信号量的代码没问题。

    hardware semaphore相关例程可参考如下帖子

    www.deyisupport.com/.../2034.aspx

    C6678 Semaphore2 Hardware Module 问题

    3. 初始化例程后续整理后会上传,你可以参考一下PDK。

  • Andy Yin 您好,

    首先谢谢您的回复。我现在仍有几个问题,

    1.6678的数据手册里面没有DNUM的地址映射,请问这个要在哪个文档里面找?

    2.PDK是什么?初次做这方面的东西,对TI的一些工具,程序例程,技术资料不是很了解,还请多多指导。

    3.启动过程中主核通过发送IPC中断给从核,让从核开始初始化,这个IPC的中断响应需要有中断返回吗?(我觉得是没有,但是这又和一般的中断有中断响应、中断返回产生不一致)

    4.TIMER的问题,让每个核拥有相同的时钟频率,但是让这些核不在同一时间点产生时钟中断,(也就是说让不同的核在不同的时刻产生时钟中断)。这个要怎么样实现呢?请给些建议。

    谢谢!!!

  • 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产生中断。

  • 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文件夹。

    敬请指导,谢谢!!!

  • xiangzhong kong您好,

    1. Uint coreID = DNUM; 即可

    2. 每个核有独立的中断服务表.

    3. 我查了一下我自己安装的CCS,其中没有自带的CSL,只在PDK中有。

  • 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里面没有找到。

  • xiangzhong kong您好,

    1. INTC中的host interrupt对应你所说的Event事件;

    2. 对于INTC0与INTC1均存在的input event,INTC0与INTC1均可处理,可以根据应用选择enable相应的INTCx并map到相应的output channel,然后映射到相应的中断等即可;

  • 您好:

    1.您说的"enable相应的INTCx"应该是操作ENABLE_SET_INDEX_REG寄存器,使能对应的系统事件吧?

    2.某个系统事件发生时,我如何将该事件映射到INTC四个控制器中的一个?寄存器CH_MAP_REGx的位域

    CH0_MAP-CH3_MAP代表着INTC0-INT3吗?

    3.CH_MAP_REGx有256个,当某个系统事件发生时,我该将事件映射到256个寄存器中的哪个?

    谢谢!

  • Andy Yin您好,

    1.您前面提到,c6678每个核有独立的中断服务表,那么是不是每个核都有独立的与中断处理相关的8个寄存器(CSR、IFR、IER等)?如果是的话,那么每个核也有独立的ISTP寄存器,但是每个ISTP的ISTB在reset之后的默认值是多少?在data manual里面没有找到。

    2.如果每个核有独立的中断相关寄存器。启动的时候,先初始化core0(主核),其他core(从核)执行空指令,并处于等待IPC中断的状态,(这时候从核应该是没做任何初始化的,包括IER也没有初始化,不知道是不是这样?)。如果是的话,这里有一个问题:从核在reset之后IER是禁止所有可屏蔽中断的,那么它怎么去发现并响应主核发送的启动IPC呢?

    谢谢!

  • 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相关中断做好初始化配置工作。

    不同的问题请另起帖子,谢谢!