在lut1lut的“如何利用STR71x的UART进行IAP 补充说明 版本1.0”的方法中,用户程序要使用中断必须手动拷贝用户程序的异常向量表、启动代码和中断处理函数。(使用的是
api_segment_init.c)。而在用户程序的lnkarm.xcl文件里可以看到: // put in ram area -Z(CODE)INTVEC=RAMSTART-RAMEND //....ram : put 71x_vect.s in ram -Z(CODE)ICODE=RAMSTART-RAMEND //...ram : put 71x_init.s in ram -Z(CODE)CODE_RAM=RAMSTART-RAMEND //.ram : put 71x_it.c really in ram
// declare in rom place -Z(CODE)CODE_ROM_INTVEC=ROMSTART-ROMEND // declare the rom place for 71x_vect.s -Z(CODE)CODE_ROM_ICODE=ROMSTART-ROMEND // declare the rom place for 71x_init.s -Z(CODE)CODE_ROM=ROMSTART-ROMEND // declare the rom place for 71x_it.c
// transfer from rom to ram -QICODE=CODE_ROM_ICODE // transfer 71x_init.s -QINTVEC=CODE_ROM_INTVEC // transfer 71x_vect.s -QCODE_RAM=CODE_ROM // transfer 71x_it.c
已经隐含调用了动态库完成了拷贝操作。
为何需要手动再次拷贝。难道此刻不能调用动态库吗。不能调用为何要做 // transfer from rom to ram -QICODE=CODE_ROM_ICODE // transfer 71x_init.s -QINTVEC=CODE_ROM_INTVEC // transfer 71x_vect.s -QCODE_RAM=CODE_ROM // transfer 71x_it.c 这样的操作。做这样的操作只是为了看三个段的起始地址和大小吗?以便写api_segment_init.c中init_ram_code()的地址参数吗? __root void init_ram_code() { ... ... ... ... memcpy((char *)0x20000000,(char *)0x40003000,0x428); memcpy((char *)0x20000428,(char *)0x40003428,0x1b8); memcpy((char *)0x200005E0,(char *)0x400038DC,0x144); ... ... ... ... }
请教各位DX,可能我有些概念没有弄清楚。
|