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.

[参考译文] 编译器/TMS320C6713B:辅助级引导加载器

Guru**** 2394295 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/624868/compiler-tms320c6713b-secondary-stage-bootloader

部件号:TMS320C6713B

工具/软件:TI C/C++编译器

您好,

我正在使用C6713辅助阶段引导加载程序。以下是 来自http://www.ti.com/lit/an/spra999a/spra999a.pdf的代码

;************************************************************************
;复制章节
;******************************************************
mvkl copyTable, A3;加载表指针
mvkh copyTable,A3


COPY_SECT_TOP:
LDW * A3++,b0 ;字节计数
LDW * A3++,b4 ;加载闪存起动(加载)地址
LDW * A3++,A4 ; ram起始地址
不执行部分第2段

[!b0] b copy_done ;我们是否复制了所有章节?
NOP 5

COPY_LOOP:
LDB * b4++,B5
子b0,1,b0 ;递减计数
器[ b0] b copy_loop ;设置分支(如果未完成
)[!b0] b COPY_SECT_TOP
零A1
[!b0]和3,A3,A1
STB B5,*A4++
[!b0]和-4,A3,A5 ;将地址舍入为4
的下一个倍数[ A1]添加4,A5,A3 ;将地址舍入到4的下一个倍数

从逻辑上讲,从加载地址复制到运行地址将在以下循环中发生。

复制循环:
LDB * b4++,B5
子b0,1,b0 ;递减计数
器[ b0] b copy_loop ;设置分支(如果未完成) 

  1.  字节被加载到B5中,计数器递减,循环再次重复(分支指令),直到计数器值变为零。 我的问题是,当从ROM加载字节时,存储从加载地址到存储地址的加载字节的存储指令在哪里? 指令"STB B5,*A4++"完全不循环,那么这种拷贝是如何发生的?
  2. 在同一文档中,修改的链接程序脚本
    1. 部分
      {
      /*当使用十六进制转换器生成复制表时,加载
      地址以及load_start,run_start和Size链接器选项
      无需指定。 只能指定运行地址*/
      .boot_load:load = flash_boot,run = boot_ram
      .text:load = flash_rest,run = IRAM
      load_start(_text_ld_start),
      run_start(_text_rn_start),
      大小(_text_size)
      /*load_start,run_start和size仅在使用链接程序时需要
      用于生成复制表*/的选项
      const > FLASH_REST
      .cinit > FLASH_REST
      .Pinit > FLASH_REST
      .switch > FLASH_REST
      数据 > IRAM
      首席信息官 > IRAM
      BSS > IRAM
      远 > iRAM
      } 

 为什么需要为.text节创建复制表,其他节(.data,.bss ...)如何?谁会将它们复制到IRAM? 我们不能仅仅提到.text > IRAM 和复制其他部分的代码也会将.text复制到IRAM中吗?

此致,

Kowalski

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

    1.“STB”位于“BRANCH”的延迟插槽中。 C6000分支指令有5个延迟插槽,这意味着始终执行分支后的5个指令,即使在执行分支时也是如此。 这也是在"b copy_done"之后出现"NOP 5"的原因:未使用延迟插槽,因此用NOP填充。
    2..data,.bss,..初始化由.cinit部分驱动,并在运行时由代码复制后跳转到的TI启动代码执行(由于链接器选项“运行时自动初始化”)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Alberto,感谢您解释清楚的回复。只有少数几件事。


    1.在哪里可以找到.cinit书帖复制的书帖列表。 我的意思是要复制哪个部分,哪些部分需要由bootloader复制?

    2.运行时自动初始化(-c)加载时初始化(-cr)之间有何区别

    3.同一代码包含EMIF_GCTL,EMIF_GCTL_V,EMIF_ce0,EMIF_ce0_V等符号 它们的定义在哪里?

    提前感谢。

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

    查看编译器和汇编器手册(搜索.cinit或自动初始化)。 通常,.cinit应保存info以初始化链接程序命令文件中未声明"NOINIT"或"NoLoad"的所有部分。 其中包括:
    .rodata

    BSS
    fardata
    .neardata
    具有初始化数据或零初始化数据的任何用户定义节。

    如果查看地图文件,在".cinit"部分的内容中,您将看到所有初始化。

    关于EMIF符号,我不知道。 应该在示例项目中的某个位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Alberto,正如您提到的"一般而言,.cinit应保存info以初始化链接程序命令文件中未声明"NOINIT"或"NoLoad"的所有部分。 "

    1.文本部分太不是在NOINIT或NoLoad时声明的,那么为什么它的信息不在.cinit中,也不是由启动代码加载的?
    2.是否需要加载.rodata,因为通常只读数据存储在ROM中。? 我的意思是,我仍然不知道我可以确定哪些章节/章节列表中的记录将放在.cinit章节中!!!

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

    很抱歉进行了之前的简化。
    根据我的理解:
    -文本部分包含处理cinit部分的代码,因此它不能位于cinit部分
    -可以通过ROM (从ROM运行)的const部分(.text,.const)不能包含在.cinit中
    -rodata包含接近const的对象,因此必须放置在靠近其他“接近寻址”的对象的位置,即放置在RAM中的变量(,neardata,.bss)。 因此,必须初始化,并且需要在cinit表中输入一个条目
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Alberto,你让我度过了美好的一天。除了.text和.const之外,其他所有部分都放在.cinit复制表中!!!!