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.

C6657 emif flash加载问题



ti专家你好:

    之前有提问过如何从c66x emif flash启动的问题,看了关于shine给的帖子里面有关cmd的配置,帖子如下:

但是我烧写进去之后,发现了一个问题,就是关于如果加入了中断函数比如说gpio中断,程序固化进去是不会进入中断的,不加入中断函数,程序固化又是成功的,我的cmd跟上面给的帖子的cmd一模一样,我查了资料是说中断不能放在flash中,所以我现在不知道如何去修改这个问题,因为程序里面必须需要中断,所以不知道如何去修改这个cmd,麻烦ti专家帮忙解答一下,谢谢!(我在之前的帖子有看到有一模一样的问题帖子如下:)

e2echina.ti.com/.../181247

  • 抱歉 第一个帖子发错了 应该是e2e 论坛里面这个帖子e2e.ti.com/.../367102
  • 我的cmd是按照这个e2e.ti.com/.../367102 没有中断程序,固化到板子中是可以正常启动,但是一旦加入中断程序,程序跑到中断函数里面 然后就跑飞了
  • 我按照之前的一个帖子修改了cmd文件,修改如下:

    然后我又在main函数入口把load在flash的vecs段直接搬移到L2SRAM上执行 程序仿真情况下直接就跑飞,麻烦ti专家帮忙指导一下!!!

    6835.KeyStone_noboot1.txt

    我的main函数入口修改如下:

    void main()

    {

    int i,ret;
    memcpy(&RAM_VECT_START,&FLASH_VECT_START,(size_t)&VECT_SIZE);
    BOOT_init();//初始化主频和ddr
    CSL_BootCfgUnlockKicker();
    //GPIO16作为普通io
    *(volatile unsigned int *)(0x02620580)= 0xffff0000;
    gpio_init();
    EMIF16_Init();
    memset(read_data,0,2048);
    TSC_init(); //enable time stame counter for test
    TM6657_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; //清中断
    }

  • 请问您烧写的程序是裸机的还是基于sys/bios的?您指的中断程序是代码中加入中断向量表吗?不进入中断是中断没有产生?还是产生后不能进入中断子程序?
  • 我要烧写的程序是裸机程序 就是上面那个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 NMI
    NMI_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 .macro
    unused_int?:
    B unused_int? ;dead loop for unused interrupts
    NOP 5
    .align 32
    .endm


    ;--------------------------------------------------------------
    ;interrupt vector table
    .sect "vecs"
    .align 1024
    vectors:
    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

  • 说白了 现在就是 我在cmd指定段到flash上面 我无法搬移到ram中运行,不清楚到底是怎么情况,在cmd指定的段在flash上的 我都无法正常搬移,只要在main函数入口memcpy函数,他都会直接跑飞 。
  • 把heap stack加大试试。
  • 另外,建议参考下面这个帖子,用IBL来搬移代码。
    e2echina.ti.com/.../45496