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.

[参考译文] RM44L520:在 IAR 工作平台中将 F021_API_CortexR4库从闪存复制到 RAM

Guru**** 2482105 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/712937/rm44l520-copy-f021_api_cortexr4-library-from-flash-to-ram-in-iar-workbench

器件型号:RM44L520
主题中讨论的其他器件:HALCOGEN

尊敬的 TI 支持团队:  

我正在使用 IAR Workbench 在 RM44L52上处理引导加载程序。尝试将闪存 API 复制到 RAM、以便使用 API 在引导加载程序中对闪存进行编程。 我们基于 halcogen 项目创建了该项目。

根据 IAR 用户指南、我按如下方式更新了链接器文件:

/*------------------ *
定义大小为4G 的存储器内存内存;

define region vectors = mem:[来自0x00000000大小0x00000020];
定义区闪存=内存:[0x00000020大小0x000BFFE0];
define region stack = mem:[从0x08000000开始、大小为0x00001500];
定义区域 RAM =内存:[从0x08001500到0x0801EA9F];  
定义区域 FLASH_API = mem:[从0x0801EAA0到0x0801FF7F];
定义区域 selftest_region = mem:[从0x0801FF80到0x0801FF9F];
定义区域平台=内存:[从0x0801FFA0到0x0801FFDF];
定义区域引导=内存:[从0x0801FFE0到0x0801FFFFFFF];


/*-大小-*/
define symbol _size_heap_= 0x800;
定义导出的符号_size_selftest_info__= 0x20;
定义导出的符号_SIZE _platform_info__= 0x40;
define symbol _size_boot_info_= 0x20;
定义导出的符号_SIZE ROM_FLASH_API_INFO__= 0x14E0;

定义块堆、对齐= 8、大小=_size_heap__{};
定义块 selftest_info、对齐= 4、大小=_size_selftest_info__{section .no_selftest};
定义块 platform_info、对齐= 4、大小=_size_platform_info__{section .no_platform};
定义块 boot_info,使对齐= 4,大小=_size_boot_info__{};

定义大小= 6K{}的块堆栈;


通过副本{readwrite}进行初始化;
通过复制{readonly 对象 bl_flash.o、readonly 对象*。obj (F021_API_CortexR4_LE.lib)}进行初始化;
不要初始化{readwrite section .noinit、section .no_seltest、section .no_platform};


放入向量{readonly section .intvecs};
置于闪存{readonly}中;
放入 RAM{readwrite};
放入 RAM{block heap};
置于 FLASH_API{readonly 对象 bl_flash.o、readonly 对象*。obj (F021_API_CortexR4_LE.lib)};
放入 flash_API{readwrite object bl_flash.o、readwrite object *。obj (F021_API_CortexR4_LE.lib)};

置于 selftest_region{block selftest_info};
置于平台{block platform_info}中;
放入引导{block boot_info};


置于堆栈{block stacks}的开头;

定义导出的符号 StackModeSVC = START (STACK);
定义导出的符号 StackModeFIQ =(StackModeSVC)+ 1K;
定义导出的符号 StackModeIRQ =(StackModeFIQ)+ 1K;
定义导出的符号 StackModeABT =(StackModeIRQ)+ 1K;
定义导出的符号 StackModeUND =(StackModeABT)+ 1K;
定义导出的符号 StackModeSYS =(StackModeUND)+ 1K;

/*------------------ *

通过这种更改、在.map 文件中、我能够看到与闪存库相关的对象被复制到 RAM、即 FLASH_API。  但是、当我下载调试时、我收到了有关的警告和错误  

"闪存下载警告:4414字节中的4414字节来自数据记录代码:[0X0801ea0、0X0801FBDD]将不会被闪存"

此外、如果我检查 FLASH_API 区域中的存储器、则内容全部为零。

我想知道在调用__cmain()之前,我是否应该在 sys_startup.c 中添加一些内容?

我看到了 TI 引导加载程序示例、有 一个_copyAPI 2RAM_()的汇编调用;但不确定、由于我们正在使用 IAR、IAR 链接器文件配置是否会将所有内容复制到 RAM?

我们是否错过了任何步骤?  

此致、

Tracy

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

    您可以发布映射文件吗? 我不熟悉 IAR Workbench。 通常、cmd 文件不会将代码从加载段复制到运行段。 您需要在软件中手动复制它们、就像我在"_copyAPI 2RAM_"中所做的那样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    问题现已解决。 这是链接器文件中的问题。

    我在 IAR 链接器文件中指定的段名不正确。

    应如下所示:

    通过复制{进行初始化
    段.text 对象 bl_flash.o、
    段.rodata 对象 bl_flash.o};
    通过复制{.text 段:_Fapi_issueFsmCommand 对象*。obj (F021_API_CortexR4_LE.lib)}进行初始化;

    此致、

    Tracy