ti专家你好:
之前有提问过如何从c66x emif flash启动的问题,看了关于shine给的帖子里面有关cmd的配置,帖子如下:
但是我烧写进去之后,发现了一个问题,就是关于如果加入了中断函数比如说gpio中断,程序固化进去是不会进入中断的,不加入中断函数,程序固化又是成功的,我的cmd跟上面给的帖子的cmd一模一样,我查了资料是说中断不能放在flash中,所以我现在不知道如何去修改这个问题,因为程序里面必须需要中断,所以不知道如何去修改这个cmd,麻烦ti专家帮忙解答一下,谢谢!(我在之前的帖子有看到有一模一样的问题帖子如下:)
e2echina.ti.com/…/181247
JohnieSi1:
抱歉 第一个帖子发错了应该是e2e 论坛里面这个帖子e2e.ti.com/…/367102
JohnieSi1:
回复 JohnieSi1:
我的cmd是按照这个e2e.ti.com/…/367102 没有中断程序,固化到板子中是可以正常启动,但是一旦加入中断程序,程序跑到中断函数里面 然后就跑飞了
JohnieSi1:
回复 JohnieSi1:
我按照之前的一个帖子修改了cmd文件,修改如下:
然后我又在main函数入口把load在flash的vecs段直接搬移到L2SRAM上执行 程序仿真情况下直接就跑飞,麻烦ti专家帮忙指导一下!!!
KeyStone_noboot1.txt
我的main函数入口修改如下:
void main()
{
int i,ret;memcpy(&RAM_VECT_START,&FLASH_VECT_START,(size_t)&VECT_SIZE);BOOT_init();//初始化主频和ddrCSL_BootCfgUnlockKicker();//GPIO16作为普通io*(volatile unsigned int *)(0x02620580)= 0xffff0000;gpio_init();EMIF16_Init();memset(read_data,0,2048);TSC_init(); //enable time stame counter for testTM6657_BOARD_INIT();//gpio中断ret = DDRTest();while(1);
}
interrupt void GPIOIsr(){//CICClearSystemEvent(SOC_CIC_0_REGS, INTC0_GPIO16_B);flag= ~flag;gpGPIO_regs->BANK_REGISTERS[0].OUT_DATA =flag<<16;printf("gpio16 intc!\r\n");*(volatile unsigned int *)(0x02600000+0x0024)= 0; //清中断}
Shine:
请问您烧写的程序是裸机的还是基于sys/bios的?您指的中断程序是代码中加入中断向量表吗?不进入中断是中断没有产生?还是产生后不能进入中断子程序?
JohnieSi1:
回复 Shine:
我要烧写的程序是裸机程序 就是上面那个main函数程序,直接烧写在0x70000000这个地址!底下那个Gpioisr程序就是中断程序;仿真时正常的,加载到板子里面他可以进入到中断子程序,但是进入2-3之后他退出就直接程序跑飞。中断向量表如下:
(GPIO_vectos.asm)
.ref _c_int00 .ref GPIOIsr .ref Exception_service_routine .ref exception_record .global VECTORS
;————————————————————–
.sect ".text";create interrupt vector for NMINMI_ISR: STW B1,*-B15[1]
;save some key registers when exception happens MVKL exception_record,B1 MVKH exception_record,B1
STW B3, *+B1[0] STW A4, *+B1[1] STW B4, *+B1[2] STW B14, *+B1[3] STW B15, *+B1[4]
;jump to exception service routine MVKL Exception_service_routine, B1 MVKH Exception_service_routine, B1 B B1
LDW *-B15[1],B1 NOP 4
;————————————————————–;create interrupt vector for reset (interrupt 0)VEC_RESET .macro addr MVKL addr,B0 MVKH addr,B0 B B0 MVC PCE1,B0 NOP 4 .align 32 .endm
;create interrupt vector for other used interrupts VEC_ENTRY .macro addr STW B0,*–B15 MVKL addr,B0 MVKH addr,B0 B B0 LDW *B15++,B0 NOP 4 .align 32 .endm
;create interrupt vector for unused interrupts VEC_DUMMY .macrounused_int?: B unused_int? ;dead loop for unused interrupts NOP 5 .align 32 .endm
;————————————————————–;interrupt vector table .sect "vecs" .align 1024vectors: VEC_RESET _c_int00 ;RESET VEC_ENTRY NMI_ISR ;NMI/Exception VEC_DUMMY ;RSVD VEC_DUMMY ;RSVD VEC_ENTRY GPIOIsr ;interrupt 4 VEC_DUMMY ;interrupt 5 VEC_DUMMY ;interrupt 6 VEC_DUMMY ;interrupt 7 VEC_DUMMY ;interrupt 8 VEC_DUMMY ;interrupt 9 VEC_DUMMY ;interrupt 10 VEC_DUMMY ;interrupt 11 VEC_DUMMY ;interrupt 12 VEC_DUMMY ;interrupt 13 VEC_DUMMY ;interrupt 14 VEC_DUMMY ;interrupt 15
.end
JohnieSi1:
回复 Shine:
说白了 现在就是 我在cmd指定段到flash上面 我无法搬移到ram中运行,不清楚到底是怎么情况,在cmd指定的段在flash上的 我都无法正常搬移,只要在main函数入口memcpy函数,他都会直接跑飞 。
Shine:
回复 JohnieSi1:
把heap stack加大试试。
Shine:
回复 Shine:
另外,建议参考下面这个帖子,用IBL来搬移代码。
e2echina.ti.com/…/45496
TI中文支持网