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.

[参考译文] CCS/TMS320F2.8069万:从引导加载程序到应用程序代码的分支

Guru**** 2558250 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/633150/ccs-tms320f28069-branch-from-bootloader-to-application-code

部件号:TMS320F2.8069万

工具/软件:Code Composer Studio

我的情况涉及从引导加载程序过渡到应用程序代码。 我使用的是TMS320F2.8068万 MCU。  我的引导加载程序驻留在闪存的扇区A中。 如果它没有检测到需要将代码下载到闪存中,它应该转换到B到H区中的应用程序代码。我正在使用链接程序命令文件来确保代码按此方式分隔。 我的引导加载程序和应用程序代码都驻留在一个CCS项目中。  

我注意到,当我更改应用程序代码时,它可以使用我的引导加载程序正常加载 (这意味着应用程序代码已正确加载),但在重置后不会从引导加载程序中过渡。 使用Code Composer和JTAG端口,我检查了拆卸。 我对我的代码的一个版本和另一个版本执行了此操作。 在每个版本中,我从未修改过引导加载程序代码。 相反, 我只修改了应用程序代码。 下面是拆卸的两个屏幕截图(每个屏幕截图来自不同的版本)。





我的"main()"函数位于A区。这调用我的bootloader。 "MAIN_APL()"是应用程序代码开头的函数(也位于B到H的扇区中)。 如您所见,在地址0x3F4268,该地址的内容会发生变化,即使它们都是对"main_apL"的调用。 在 第一个中,0x3F4268的内容是767E2C61,另一个是767E2C3D。  这是一个问题,因为bootloader只将扇区B写入H。因此,代码 可能会正确加载,但从扇区A到应用程序的调用不同。 这将阻止bootloader和应用程序代码之间的成功转换。

我的问题是:如何从bootloader部分转到"main_apl",同时在不同的编译之间保持扇区的内容不变? 我当时在考虑将"main_apL():"替换为"ASM("LCR 0x3D8000)",但如何从链接程序命令文件中确保该函数始终保持在0x3D8000?

谢谢。
Syed

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在做了一些实验之后,我似乎必须找出一种方法将"main_apl"修复为0x3D8000。

    在我的项目中,“main_apl”当前位于0x3E23CD。 每当我更改"main_apL"时,0x3F4269的内容都没有更改。 但是,当我在地址0x3D8269处更改函数时,0x3F4269的内容发生了变化。

    这似乎表明在上述反汇编中,地址0x3F4268到0x3F4269必须包含指向"main_APL"的指针。 因此,如果我需要在编译项目时修复和保持不变,则必须将"main_apL"固定为0x3D8000。 这是扇区H (最顶部扇区)的起始地址。 这意味着对其他函数的任何更改都不会影响"MAIN_APL"的位置。

    问题是如何将"main_apl()"分配给0x3D8000,这样无论应用程序代码发生什么其他更改,它都始终存在。 是否有人知道如何做到这一点? 我猜这必须在链接程序命令文件中完成,但我不知道具体要做什么。 如有任何帮助,我们将不胜感激。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现我可以这样做:我可以在链接程序命令文件中指定扇区H的一小部分,然后强制在该区域中包含函数的目标文件。

    因此,在链接程序命令文件的“内存”部分中,指定以下内容:
    FLASH_H_APL (R):Origin=0x3D8000,长度=0x0004FF

    然后,在“部分”部分中,指定与该地址范围相关联的标记:
    mainAplStart:> flash_H_APL,page=0

    最后,在相关的c文件中添加一个“code_section”,将“main_apl”函数分配给该标签。

    完成所有这些操作后,我指向"main_apL"的指针看起来在编译之间是一致的。 因此,它始终正确地输入bootloader部分的应用程序代码。

    唯一的收获是:如果向该c文件添加了更多函数,则"main_apl"可能不再位于0x3D8000。 如果我在c文件中的"main_apL"定义之后找到其他函数,那么我认为这不是问题。 这对我来说真的不是问题,因为我的c文件中有"main_apl",永远不会有其他功能。 相反,它们应位于项目的其他地方。 但是,我只是想指出这一点,以防有人考虑做我所做的事情。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Syed,

    很高兴听到您解决了问题。 感谢您分享您的解决方案,这可能会在未来对其他人有所帮助。

    此致,