您好!
根据 ANSI-C、在调用 main 之前、所有的单向化段都设置为零、但 C2000编译器没有这样做。 我想我必须在引导文件中添加一些汇编指令、使.ebss 段变为零。 请提供实施此操作的步骤。
此致、
Shubham
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.
您好!
根据 ANSI-C、在调用 main 之前、所有的单向化段都设置为零、但 C2000编译器没有这样做。 我想我必须在引导文件中添加一些汇编指令、使.ebss 段变为零。 请提供实施此操作的步骤。
此致、
Shubham
Shubham、
此行为与编译器无关-它涉及器件的引导顺序。 大多数嵌入式系统的行为都是这样的。
在变量的初始值很重要的情况下、用户需要在代码中显式初始化变量。 因此、很少希望以这种方式初始化整个.ebss 段。 但是、如果要在 main 之前强制.ebss 段的内容为零、则需要在调用 c_init00例程之前插入汇编函数。 为此、请确保在链接器命令文件中具有入口地址的位置。 对于引导至 SARAM、如下所示:
存储器
{
第0页:/*程序内存*/
BOOTM0:origin = 0x000000,length = 0x000002
(笑声)
然后、在该位置将符号放置到起始位置或您的汇编例程。 同样、在链接器文件中:
部分
{
cstart:> BOOTM0,PAGE = 0
(笑声)
现在、将符号添加到.bss 和.ebss 段的起始地址和结束地址。 仍在链接器文件的 SECTIONS 部分:
.bss:> RAMM0,PAGE = 1
RUN_START (_BSS_START)、
run_size (_BSS_size)
.ebss:> RAML0,PAGE = 1
run_start (_ebss_start)、
run_size (_ebss_size)
(您的存储器区域可能会有所不同、具体取决于您放置这些段的位置)。 现在添加随附的汇编模块并构建您的代码。 代码将跳转至一个短暂的 assenly 例程、该例程会暂停看门狗、清除这些段中的一个、然后调用 C 环境设置例程_c_init00、该例程继而调用 main()。
此器件上的引导序列允许用户控制 PC 在执行内部引导 ROM 后跳转到的位置。 我在上面写的内容假定您正在引导至 M0 RAM。 如果您有另一个引导入口点、则需要将 cstart 段放在此处。
希望这对您有所帮助。
此致、
Richard