用CCS写了一个动态加载模块,想通过启动核0来自动加载从核1-7,但是核0发布IPC中断后,从核并没有启动,有大神知道哪里有问题吗?
这是我的代码:
#include <xdc/std.h>
#include <stdio.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#define DEF_INIT_CONFIG_PLL1_PLLM 0
#define DEF_INT_MEM_TEST_CORE_ID 1
#define MAGIC_ADDR 0x8ffffc
#define DEVICE_REG32_W(x,y) *(volatile uint32_t *)(x)=(y)
#define DEVICE_REG32_R(x) (*(volatile uint32_t *)(x))
#define BOOT_MAGIC_ADDR(x) (MAGIC_ADDR + (1<<28) + (x<<24))
#define STATUS_ADDR (MAGIC_ADDR – 0x4)
#define CHIP_LEVEL_REG 0x02620000
#define KICK0 (CHIP_LEVEL_REG + 0x0038)
#define KICK1 (CHIP_LEVEL_REG + 0x003C)
#define IPCGR(x) (0x02620240 + x*4)
#define BOOT_MAGIC_NUMBER 0xBABEFACE
extern __cregister volatile unsigned int DNUM;
void write_boot_magic_number(void)
{
printf("core %d\n",DNUM);
DEVICE_REG32_W(MAGIC_ADDR, BOOT_MAGIC_NUMBER);
while(1);
}
/******************************************************************************
* Function: main
******************************************************************************/
int main ()
{
int coreNum;
int core=0;
/* Unlock the chip registers */
DEVICE_REG32_W(KICK0, 0x83e70b13);
DEVICE_REG32_W(KICK1, 0x95a4f1e0);
//coreNum = platform_get_coreid();
coreNum=DNUM;
if (coreNum == 0)
{
/* Writing the entry address to other cores */
printf("core0\n");
for (core = 1; core < 8; core++)
{
DEVICE_REG32_W(BOOT_MAGIC_ADDR(core), (uint32_t)write_boot_magic_number);
}
for (core = 1; core < 8; core++)
{
DEVICE_REG32_W(IPCGR(core), 1);
}
}
else
{
write_boot_magic_number();
}
return 0;
}
Shine:
请问用的是哪款器件?看一下MAGIC_ADDR地址是否正确?BOOT_MAGIC_ADDR是各个核的Local L2的最后一个地址。
用ccs调试时,有没有把core0, core1~7设成一个group。
user5907651:
回复 Shine:
在CCS5.5.0上写的,暂时没有连接开发板。
还有怎么看MAGIC_ADDR地址是否正确?
Ryan BL:
回复 user5907651:
MAGIC—ADDR是LL2的最后一个word,在其他地方把这个核加载完毕后,这个位置给他写上入口,然后IPC使他从IDLE中唤醒,从核就启动了。不过你这个并不叫动态加载,而是多核加载;
TI中文支持网

