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.
大家好、
我将 TMS570LS0914用于其中一个应用。 在启动代码期间遇到如下问题;
我 尝试将链接器文件中应用程序的起始地址从0x00000000更改为0x00020000。
存储器
{
引导程序(X) :origin=0x00020000 length=0x00000020
FLASH0 (RX):origin=0x00020020 length=0x000DFFE0
堆栈 (RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0001EB00
/*用户代码开始(2)*/
/*用户代码结束*/
}
当我们尝试以调试模式运行应用程序时、代码进入启动代码(ESM 故障(循环无限大)或指向未定义存储器位置的堆栈指针(0x00000004))。
代码使用 Halocogen v4.7.1生成、其中启动代码包含所有自检序列。
但是在测试时、当我们将矢量起始地址保留为0x00000000、并将 FLASH0地址保留在0x00020000、应用程序工作正常。
我是否错过了任何配置?
您好!
问题是矢量表必须位于地址0x00000000处、因为这是 CPU 在启动或获取中断时加载指令的位置。
执行的第一条指令位于地址0x00000000、它是复位中断处理程序的分支指令。
因此、如果您如上所述更改链接器脚本、则会出现未定义的行为。
此致、
Marko
您好、Marko、
我的引导加载程序代码将位于0x00000000至0xXXXXXXXX 之间、然后我的应用程序代码从0x00020000开始。 这里的问题是、如果我尝试调试从地址0x00020000开始的应用程序代码、它在启动代码中出现故障、有时 RAM ECC 不可纠正的错误上升、有时 SP 指向 UNDEF 进入位置。
中断矢量起始地址可以更改。
此致、
Saravanan
您好!
我所做的事情完全相同。
您不需要固件(应用)的矢量表。
我的引导加载程序链接器脚本:
/*------------------ */ /*链接器设置 */ --retain="*(.intvecs)" /*用户代码开始(1)*/ --entry_point=__mutters_int00 -iF021//* 用户代码结束*/ /*-->--- */ /*内存映射 */ //*--------------------------------------------------------------------------------------------------------- */ /*链接器设置 */ --retain="*(.intvecs)" /*用户代码开始(1)*/ --entry_point=__mutters_int00 -iF021//* 用户代码结束*/ /*-->--- */ /*内存映射 */ MEMORY { * USER CODE BEGIN (2)*/ * USER CODE END */ 引导程序(X):origin=0x00000000 length=0x00000020 FLASH0 (RX):origin=0x00000020 length=0x001FFFE0 FLASH1 (RX):origin=0x00200000 length=0x00200000 堆栈(RW):origin=0x08000000 length=0x00001500 RAM (RW):origin=0x08001500 length=0x0007EB00 /* USER CODE BEGIN (3)*/* / * USER CODE END */}/* USER CODE BEGIN (4)*/ /* USER CODE END *//*--- --- */ /*段配置 */ SECTIONS { /* USER CODE BEGIN (5)*/ mut_flash align (32):{ --library= F021_API_CortexR4_be_V3D16.lib (.text) } LOAD > FLASH0 ,运行> RAM ,load_start (__mut_flash_start) ,load_end (__mut_flash_end) ,run_start (__mut_flash_run_start) /*用户代码 end */ .intvecs:{}>向量 .text align (32):{}> FLASH0 | FLASH1 .const align (32):{}> FLASH0 | FLASH1 .cinit align (32):{}> FLASH0| FLASH1 .pinit align (32):{}> FLASH0 | FLASH1 .bss :{}> RAM .data :{}> RAM .sysmem:{}>RAM /*用户代码开始(6)*/* 用户代码结束*/ }/* 用户代码开始(7)*/ /*用户代码结束*/*--- --- */ /*其他 */ /*用户代码开始(8)*/ /*用户代码结束*/ /*-->------------ *
我的固件链接器脚本:
/*------------------ */ /*链接器设置 */ --retain="*(.intvecs)" /*用户代码开始(1)*/ --entry_point=fw_main /*用户代码结束*/ /*-->--- */ /*内存映射 */ MEMORY { * USER CODE BEGIN (2)*/ * USER CODE END */ FLASH0 (RX):origin=0x00010000 length=0x001EFFE0 FLASH1 (RX):origin=0x00200000 length=0x00200000 堆栈(RW):origin=0x08000000 length=0x00001500 RAM (RW):origin=0x08001500 length=0x0007EB00 /* USER CODE BEGIN (3)*/* / * USER CODE END */}/* USER CODE BEGIN (4)*/ /* USER CODE END *//*--- --- */ /*段配置 */ SECTIONS { /* USER CODE BEGIN (5)*/ mutters_init align (32):{}> 0x10000 //用户代码结束*/ .text align (32):{}> FLASH0 .const align (32):{}> FLASH0 .cinit align (32):{}> FLASH0 .pinit align (32):{}> FLASH0 .bss :{}> RAM .data :{}> RAM .sysmem:{}>RAM fee_text_section:{}> FLASH0 fee_const_section:{}> FLASH0 fee_data_section:{}>RAM /*用户代码开始(6)*/* /*用户代码结束*/ }/* 用户代码开始(7)*/ /*用户代码结束*/ /*------ */ /*其他 */ /*用户代码开始(8)*/ /*用户代码结束*/ /*-->------------ *
如您所见、在 FW 链接器脚本.intvecs 部分中删除、并且我不需要针对 FW 代码的中断向量。
引导加载程序负责处理中断、而不是 FW。 您可以实现一些回调机制、其中引导加载程序将调用 FW 处理程序。
此致、
Marko
Marco、
感谢您的帮助!!!
此致、
米罗
您好、Miroslav、
没问题、总是很乐意提供帮助。