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.

[参考译文] RTOS/TM4C1294NCPDT:从 SDRAM 执行时出现问题

Guru**** 2614265 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/776442/rtos-tm4c1294ncpdt-issue-when-executing-from-sdram

器件型号:TM4C1294NCPDT
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?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Briceag Cosmin"]问题是,如果 SYS/BIOS 检测到错误并中止程序,为什么会调用_exit?_exit。

    1) 1)如果你查看 Hwi 下的 RTOS 对象视图(ROV)->是否报告了异常?

    2) entry()有什么值? 为 Cortex-M4F 设置函数指针时、需要设置最低有效位来指示 Thumb 模式。 试图在 ARM 模式下调用一个函数(最低有效位清零)会在 Cortex-M4F 中引起一个异常。

    请参阅 Thumb 状态下的函数指针

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1.是的、存在硬故障异常。
    2.映射文件如下所示:
    text.entry 0x60000094 0xC 启动.o
    0x60000094 条目
    但是,当我调用 entry()时,其值为0x60000095,就像在与 Thumb 兼容的 program_bin (前四个字节)中一样。

    现在、我需要弄清楚为什么我得到硬故障异常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Briceag Cosmin">现在,我需要弄清为什么我会遇到硬件故障异常。 在 StellarisRegistered微控制器中诊断软件故障 是否有帮助? 虽然该文档是为 Cortex-M3 Stellaris 器件编写的、但它仍然适用于 Cortex-M4F TM4C129器件。

    如果文档不起作用,您是否可以尝试汇编 step-into entry(),您是否可以看到导致硬件故障异常的指令?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bebe、
    我希望切斯特提供的提示对帮助解决您的问题有所帮助。 我现在要关闭这个线程。 如果您有新问题、您可以打开一个新主题、如果问题未得到解决、您也可以重新打开此主题。