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.

[参考译文] TMS320F2812:微控制器的启动过程...

Guru**** 2536600 points
Other Parts Discussed in Thread: TMS320F2812

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601667/tms320f2812-boot-process-of-microcontroller

器件型号:TMS320F2812

您好!

我有一个非常通用的问题、主要针对任何通用的微控制器、具体针对 TMS320F2812。 查询如下:


1) 1)假设编译器输出为 COFF 格式。 现在、为了将其刻录到闪存中、需要将其转换为一些合适的格式、如 ASCII 十六进制/Intel-Hex。 众所周知、COFF 包含段和段。 现在、OS 可以从.data/.bss 段加载数据、并从.text 段加载代码。 现在、在 ASCII 十六进制/ Intel 十六进制格式中、我们没有任何段、因此微控制器/处理器(如 C671x)如何将数据加载到 RAM 中并从闪存(NOR)执行指令。


2) 2)微控制器如何知道在跳转到主函数之前需要将程序的哪个部分(变量等)加载到 RAM 中??? 它如何区分数据和指令??? 简而言之、微控制器如何从闪存加载变量(也不使用 intell-hex 烧录)、谁告诉微控制器在 RAM 中加载什么以及从闪存执行什么。

此致、

Amimal

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

    Amimal、

    1) 1)当 COFF 转换为某个十六进制格式(例如 inter-hex)时、通常会有加载地址、数据和长度。  您可以阅读 Intel-hex 文档以了解确切的格式。  加载程序应具有解析器以正确解码该格式、以便加载程序可以获取目标地址(无论是 RAM 还是闪存)和要加载的数据。  如果目标加载地址是闪存、则加载程序应使用闪存 API 将数据编程到闪存中。

    2) 2)应用程序的链接器命令文件确定每个段必须映射到的位置(RAM 或闪存)。  编译器、汇编器和链接器将根据 cmd 文件中的输入生成代码和映射。  C-startup RTS 库负责根据应用程序的需要初始化全局初始化数据,然后再到达 main()。  除此之外、如果在运行时有段需要从闪存复制到 RAM、则应用程序的链接器命令文件可以使用不同的加载和运行地址。  在这种情况下,应用程序应该在执行这些内容之前将它们从闪存复制到 RAM 中(应用程序可以为此使用 memcpy()函数)。

    希望这对您有所帮助。

    谢谢、此致、
    Vamsi

      

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

    Gudivada 提供了非常丰富的回复。 只有几个问题。

    那么、您意味着启动代码基本上会实现这一点???
    1) 1)根据启动代码、您的意思是 crt0?
    2) 2)编译器是否添加了我们在复位矢量处提供的 crt0和启动代码?
    3) 3) crt0和_c_int00之间有何差异?
    4) 4) RTS 库是否包含这些 startup/crt0/_c_init00代码?

    我相信您所讨论的启动代码和代码(初始化 全局变量等)是不同的。 我已经从 ARM、Atmel 等地经历了很多启动代码。我从未看到过任何将不同代码段复制到内存中的内容。 因此启动代码和 CRT0 (或您要讨论的代码)是不同的。 或者、除了复制和初始化.data 和.bss 段的启动代码之外、至少编译器/链接器会添加其他内容。

    如果我错了、请纠正我的问题。