Other Parts Discussed in Thread: SYSBIOS
Thread 中讨论的其他器件:SYSBIOS
工具/软件:TI-RTOS
您好!
当我尝试执行一个"外部"(我说是外部的、因为它将从 SDRAM 中执行)程序时、我遇到了一个问题。 该程序被链接至将从0x60000000执行。
unsigned char program_bin[]={ 0x95、0x00、0x00、0x60、0x80、 0x5、0x82、0xb0、0x00、0xaf、 0x01、0x23、 0xfb、0x71、0x00、 0x21、0x01、0x20、0x00、0xf0、 0x45、0xf8、0x03、0x46、 0x1a、 0x46、0x09、0x4b、0x1a、0x80、 0x08、0x4b、0xb3、0xf9、0x00、 0x30、 0xfa、0x1d、0x11、0x46、 0x18、0x46、0x00、0xf0、0x81、 0xf8、0x05、0x48、 0x00、0xf0、 0x94、0xf8、0x00、0x23、0x18、 0x46、0x08、0x37、0xBD、0x46、 0x80、0xbd、0x00、bbf、0xa0、 0x01、0x00、0x60、0x49、0x00、 0x00、0x60、 0x80、0xb5、0x82、 0xb0、0x00、0xaf、0x01、0x23、 0xfb、0x70、0x0E、0x4b、 0xb3、 0xf9、0x00、0x00、0xf9、0x1c、 0x00、0x23、0x01、0x22、0x00、 0xf0、 0x4f、0xf8、0x00、0x23、 0x7B、0x60、0x02、0xe0、0x7B、 0x68、0x01、0x33、 0x7B、0x60、 0x7B、0x68、0x07、0x4a、0x93、 0x42、0xf8、0xd9、0x00、0x23、 0xfb、0x70、0x04、0x4b、0xb3、 0xf9、0x00、0x00、0xf9、0x1c、 0x00、0x23、 0x01、0x22、0x00、 0xf0、0x3b、0xf8、0xe0、0xe7、 0xA0、0x01、0x00、0x60、 0x9f、 0x86、0x01、0x00、0x80、0xb5、 0x00、0xaf、0xff、0xf7、0xb4、 0xFF、 0x00、0xbf、0x80、0xbd、 0x80、b5、0x84、b0、0x00、 0xaf、0x03、0x46、 0x0a、0x46、 0xfb、0x71、0x13、0x46、0xbb、 0x71、0x05、0x4b、0xfb、0x60、 0xb9、0x79、0xfa、0x79、0xfb、 0x68、0x10、0x46、0x98、0x47、 0x03、0x46、 0x18、0x46、0x10、 0x37、0xBD、0x46、0x80、0xBD、 0x34、0xda、0x01、0x00、 0x90、 0x5、0x87、0xb0、0x00、0xaf、 0xb9、0x60、0x7B、0x60、0x03、 0x46、 0xfb、0x81、0x13、0x46、 0xbb、0x81、0x07、0x4b、0x7B、 0x61、0xBA、0x89、 0xb7、0xf9、 0x0E、0x00、0x7c、0x69、0x7B、 0x68、0xb9、0x68、0xa0、0x47、 0x03、0x46、0x18、0x46、0x1c、 0x37、0xBD、0x46、0x90、0xBD、 0x00、0xbf、 0xd8、0xda、0x01、 0x00、0x90、0xb5、0x87、0xb0、 0x00、0xaf、0xb9、0x60、 0x7a、 0x60、0x3b、0x60、0x03、0x46、 0xfb、0x81、0x06、0x4b、0x7B、 0x61、 0xb7、0xf9、0x0E、0x00、 0x7c、0x69、0x3b、0x68、0x7a、 0x68、0xb9、0x68、 0xa0、0x47、 0x03、0x46、0x18、0x46、0x1c、 0x37、0xBD、0x46、0x90、0xBD、 0x4a、0xdb、0x01、0x00、0x80、 0x5、0x84、0xb0、0x00、0xaf、 0x03、0x46、 0x39、0x60、0xfb、 0x80、0x06、0x4b、0xfb、0x60、 0xb7、0xf9、0x06、0x20、 0xfb、 0x68、0x39、0x68、0x10、0x46、 0x98、0x47、0x03、0x46、0x18、 0x46、 0x10、0x37、0xBD、0x46、 0x80、0xbd、0x00、bbf、0x4a、 0xdb、0x01、0x00、 0x80、0xb5、 0x84、0xb0、0x00、0xaf、0x78、 0x60、0x04、0x4b、0xfb、0x60、 0xfb、0x68、0x78、0x68、0x98、 0x47、0x03、0x46、0x18、0x46、 0x10、0x37、 0xBD、0x46、0x80、 0xBD、0x1a、0xdc、0x01、0x00、 0x80、b5、0x84、b0、 0x00、 0xaf、0x78、0x60、0x39、0x60、 0x05、0x4b、0xfb、0x60、0xfb、 0x68、 0x39、0x68、0x78、0x68、 0x98、0x47、0x03、0x46、0x18、 0x46、0x10、0x37、 0xBD、0x46、 0x80、0xBD、0x80、0xdc、0x01、 0x00 };
unsigned int program_bin_len = 416;
我使用自定义启动文件、其中0x60000000位置 直接包含程序中的入口点、而不是栈指针。
我需要提到的是、我使用的是 SYSBIOS。 加载程序并执行跳转后、我进入_exit。
void _exit (int 代码)
{
asm (".global C$$exit");
asm ("C$$EXIT:");
while (1){};
}
因此、重定位的执行方式如下:
void load_TO_SDRAM (void){ uint8_t * start_saddr =&program_bin[0]; uint8_t * start_daddr =(uint8_t*) 0x60000000; void (* entry)(void)=(void (*)(void)(*((uint32_t*)&program_bin[0])); for (uint32_t idx = 0;idx < program_bin_len;idx++){ *start_daddr++=*start_saddr++; } start_saddr =&program_bin[0]; start_daddr =(uint8_t*) 0x60000000; for (uint32_t idx = 0;idx < program_bin_len;idx++){ array[idx]=* start_saddr++; } entry(); }
"array"被用来比较结果、使用调试器。 "数组"包含所需的数据。
问题是,为什么我会进入_exit?