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.

[参考译文] MSP430G2755:使用链接器命令文件移动/更改起始地址时出现问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1298932/msp430g2755-issue-when-moving-changing-start-address-using-linker-command-file

器件型号:MSP430G2755

我们的项目有一个客户引导加载程序。

*闪存被分区以支持引导加载程序和应用程序。
 引导加载程序从0xE000开始。 引导加载程序和闪存矢量是固定的、
 --应用程序从0x8000开始

*在 RAM 中创建一个矢量表,闪存矢量表指向 RAM 矢量表。
 --这样,引导加载程序和应用程序可以覆盖 RAM 矢量表,以适应每个可执行文件的要求( ISR 处理程序)。

*当引导加载程序完成加载或验证应用程序后,它将跳至0x8000以运行应用程序
 --应用程序的链接程序命令文件包含此项以将应用程序的开头放在0x8000

   .boot > 0x8000
   {
    -l rts*.lib (.text)
   }

*我遇到的问题是应用矢量表被放置在地址0x8000处。
 这意味着从引导加载程序跳转到0x8000时正在运行 ISR 向量,这是不好的。
 --期望是将应用程序的可执行文件开头放在0x8000。
 这是一个传统的代码,在一些较旧的产品中工作。 这可能是从 CCS7.x/16.9.2LTS 移至 CCS11.2/21.6.0LTS 的赝像。

*我发现链接器命令文件的相关文档很差
 ———我看了底漆@:
   software-dl.ti.com/.../sdto_cgt_Linker-Command-File-Primer.html
 --我也有 SLAU132Y–"MSP430 Optimizing C/C++ Compiler v21.6.0.STS"
 以下是文档中未涉及的一些问题:
   #什么是-l (如上所示)?
   #初级读本页显示了使用--library=Sinewave_lib.lib (.text)的示例。
    +何时使用双破折号?
    +双短划线语法选项列表(例如--libary )在哪里?
    +单字符语法选项(如-l )的列表在哪里?
    + My Example 显示了 rts*。lib<boot_special.obj 初级读本显示了 Sinewave_lib.lib。
     %这里的要求是什么?
     %.lib 格式是否与.obj 相同?
    +其中列出了可安装在 ?
     %我的示例具有 boot_special.obj。 这是内在的东西吗? 如何查找这些内容的列表?
     %我发现了有关 boot_special.obj 的此内容。 无帮助。 这是什么?
      $ e2e.ti.com/.../how-to-force-the-msp430-start-address-in-ccsv6

      $另来自 SLAA685、第30页(这种格式与文档中的格式似乎不同)

       :: rts430x_lc_rd_eabi.lib : boot_special.obj
       ::(.text:_isr:_c_int00_noargs_noexit)
       :::: isr_trap.obj
       ::(.text:_isr:__TI_isr_trap)

*您能否提供所有链接器命令文件选项、标志、语法、缩写等的完整列表和说明?


*那么,我如何使应用程序在0x8000正确启动?

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

    应用程序的链接器脚本应该告诉链接器在哪里放置.text 段。 脚本片段会告诉它在哪里放置.boot 段。 不在存储器位置、而是在其他一些已命名的段中。 不确定这是否起作用。

    应用程序段的名称为奇数、但对引导加载程序来说并不糟糕。

    我对 GCC 链接器的经验 、但从我可以看到、链接器脚本如果不相同、也非常相似。 "info ld"是我首先查找相关信息的地方。

    为了找到应用程序/引导加载程序、我将更改 ROM 的大小/位置。 然后、链接器将处理在那里定位.text (和其他只读)段的工作。

    使用 C 代码时、至少 ROM 映像的开头并不总是如此、甚至频繁地指开始执行的位置。 大多数情况下、变量初始化程序的只读数据如此处所示。 您必须检查复位矢量(在其自身的2字节段中)的内容才能发现这一点。 这使得写入引导加载程序变得更加棘手。

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

    我无法找到将文件附加到论坛的方法、该方法比将过多文本粘贴到帖子中更简洁。

    我认为 TI 过去允许向论坛附加文件了吗?

    无论如何、我想我需要将文本粘贴到此处。

    这是我的链接器命令文件。

    内存
    {
    SFR:origin = 0x0000、length = 0x0010
    peripherals_8bit:origin = 0x0010、length = 0x00F0
    peripherals_16BIT:origin = 0x0100、length = 0x0100
    RAM_VECTORS:origin = 0x1100、length = 0x0080
    RAM:origin = 0x1180、length = 0x0F78
    INFOA:origin = 0x10C0、length = 0x0040
    INFOB:origin = 0x1080、length = 0x0040
    INFOC:origin = 0x1040、length = 0x0040
    INFOD:origin = 0x1000、length = 0x0040
    Flash:origin = 0x8000、length = 0x5FE0
    FLASH_APPSWVER:origin = 0xDFE0、length = 0x0010
    FLASH_APPXSUM:origin = 0xDFF0、length = 0x0010
    FLASH_bootloader:origin = 0xE000、length = 0x1FE0
    Flash_vectors:origin = 0xFFE0、length = 0x001E
    复位:origin = 0xFFFE、length = 0x0002

    /*------------------
    强制除复位之外的向量指向 RAM
    使用 FLASH_VECTORS 和 FLASHVECT_SEG 的地址。 未使用
    到函数的默认动态链接。 原始
    此处保存以供参考。

    int00:origin = 0xFFE0、length = 0x0002
    INT01:origin = 0xFFE2、length = 0x0002
    INT02:origin = 0xFFE4、length = 0x0002
    INT03:origin = 0xFFE6、length = 0x0002
    INT04:origin = 0xFFE8、length = 0x0002
    INT05:origin = 0xFFEA、length = 0x0002
    INT06:origin = 0xFFEC、length = 0x0002
    INT07:origin = 0xFFEE、length = 0x0002
    INT08:origin = 0xFFF0、length = 0x0002
    INT09:origin = 0xFFF2、length = 0x0002
    INT10:origin = 0xFFF4、length = 0x0002
    INT11:origin = 0xFFF6、length = 0x0002
    INT12:origin = 0xFFF8、length = 0x0002
    INT13:origin = 0xFFFA、length = 0x0002
    INT14:origin = 0xFFFC、length = 0x0002
    ------------------------------------------------------- */

    */李启明 /
    /*指定段分配到存储器中*/
    */李启明 /

    部分
    {
    .bss :{}> RAM /*全局和静态 VARS */
    .data :{}> RAM /*全局和静态 VARS */
    .sysmem:{}> RAM /*动态内存分配区*/
    .stack:{}> RAM (高)/*软件系统堆栈*/

    .boot > 0x8000
    {
    -l rts*.lib (.text)


    {
    .text :{}/*代码*/
    .cinit :{}/*初始化表*/
    .const :{}/*常量数据*/

    .pinit :{}/* C++构造函数表*/
    init_array:{}/* C++构造函数表*/
    .mspabi.exidx:{}/* C++构造函数表*/
    .mspabi.extab :{}/* C++构造函数表*/
    }LOAD =闪存

    /*--[从 RAM 运行]------------------ */
    RAMVECT_SEG:load = flash、run = RAM_vectors、table (_ramvector)
    .ovly :{}>闪存

    /*------------------ */
    .infoA:{}> INFOA /* MSP430 info flash memory segments */
    .infoB :{}> INFOB
    .infoC :{}> INFOC
    .infod :{}> INFOD

    .cio:{}> RAM /* C I/O 缓冲器*/
    .reset:{}> reset
    FLASHVECT_SEG:{}> flash_vectors
    APPSWVER_SEG :{}> FLASH_APPSWVER

    /**** MSP430中断向量****
    /*------------------
    强制除复位之外的向量指向 RAM
    使用 FLASH_VECTORS 和 FLASHVECT_SEG 的地址。 未使用
    到函数的默认动态链接。 原始
    此处保存以供参考。

    Timer1_A1:{*(.int00 )}>INT00 type = VECT_init
    Timer1_A0:{*(.int01 )}> int01 type = VECT_init
    Port1 :{*(.int02 )}> INT02 type = VECT_init
    port2 :{*(.int03 )}> INT03 type = VECT_init
    TRAPINT :{*(.int04 )}> INT04 TYPE = VECT_INIT
    ADC10 :{*(.int05 )}> INT05 TYPE = VECT_INIT
    USCIAB0TX :{*(.int06 )}> INT06 TYPE = VECT_INIT
    USCIAB0RX :{*(.int07 )}> INT07 TYPE = VECT_INIT
    TIMER0_A1:{*(.int08 )}> INT08 type = VECT_init
    TIMER0_A0:{*(.int09 )}> INT09 type = VECT_init
    WDT :{*(.int10 )}> INT10 type = VECT_init
    COMPARATORA :{*(.INT11 )}> INT11 TYPE = VECT_INIT
    TIMERB1 :{*(.INT12 )}> INT12 type = VECT_init
    TIMERB0 :{*(.INT13 )}> INT13 type = VECT_INIT
    NMI :{*(.int14 )}> INT14 type = VECT_init
    ------------------------------------------------------- */

    */李启明 /
    /*包含外设内存映射*/
    */李启明 /

    -l msp430g2755.cmd

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

    使用"插入"按钮并选择"代码"。 这会为长代码位创建可滚动窗口。 或链接器脚本。

    并不是因为完整的脚本照亮了任何东西。

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

    我注意到有一条链接器警告:


    "../lnk_msp430g2755.cmd"、第108行:警告#10068-D: 无匹配部分
    警告#10229-D:输出段".data"指加载符号"$C$SL1"、因此无法压缩;压缩"lzss"已忽略
    完成构建目标:"abc.out"

    第108行是这一行

    -l rts*.lib (.text)

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

    boot_special.com 位于此处:

    C:\ti\ccs1120\ccs\tools\compiler\ti-CGT-MSP430_16.9.2.sts\lib\boot_special.c src

    我看到的 C 文件中没有段声明。 C 文件确实具有 #pragma 链接(xxxxx)。

    我搜索"SLAU132Y–MSP430优化 C/C++编译器 v21.6.0.LTS " 、未找到关于"Clink"的信息。 真的吗?!!?

    好的、下面是 几个问题:

    *什么是#pragma Clink?

      ---它在哪里记录?

    *如果没有.boot 的段名、如何将"boot_special"强制为0x8000?

      ---完成这一任务的正确语法是什么?

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

    这不能解决你原来的问题,但可能它提供了一个有用的线索。 它看起来与 boot_special.c 文件所基于的编译器版本不同、是您的参考文档。 您列出的路径表明该文件是 v16.9.2.LTS 编译器的一部分、但您参考的是 v21.6.0.LTS 编译器的用户指南。   

    我还看到 CLINK pragma 与 COFF 目标文件格式相关、并且已从最新的 MSP430 coden 工具中弃用此格式。 您参考的 MSP430编译器用户指南的修订历史记录中有一条注意事项: SLAU132Y

    您可以 在与 v16.9.2.LTS 对应的较旧文档版本中阅读 Clink pragma: SLAU132M

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

    感谢您提供有关 CLINK 的信息。 出于好奇心、我会查看一些较旧的文档。

    对于编译器(阅读全文)、我提到过我从16.9.2.LTS 迁移到了21.6.0LTS、是的、我同意。 我想这与此相关。

    我一直在四处寻找、发现

    *编译器21.6.0.LTS 声明_c_int00... 位于 boot.c 中

    *编译器16.9.2.LTS 声明_c_int00... 位于 boot_special.c 中

    *参见附加的文本文件...

    我在.map 文件中搜索术语"boot"、得到了以下结果:

    26 9:FLASH_bootloader 0000e000 00001fe0 00000000 00001fe0 Rwix
    64 62:00002030 00000002 rts430_eabi.lib:boot.c.obj (.stack)
    101 60:00009604 00000040 main.obj (.text:BootDelay)
    136 62:00009c0c 0000001c rts430_eabi.lib:boot.c.obj (.text:_c_int00_noargs)
    216 62:0000fffe 00000002 rts430_eabi.lib:boot.c.obj (.reset)
    258 8:boot.c.obj 28 2 0
    找到的总数:6

    我尝试了不同的化身,仍然总是得到一个"部分未找到"警告

    "../lnk_msp430g2755.cmd"、第108行:警告#10068-D:没有匹配的部分
    rts*。lib (.text:_c_int00_noargs)

    我讨厌这么做、但我必须回到旧版编译器。 我相信这可以通过较新的编译器来实现、但链接器命令文件语法难以捉摸。

    e2e.ti.com/.../MSP430-_5F00_c_5F00_int00-search-results.txt

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

    好的。 我让它工作了!!!

    这是链接器命令文件条目:

    .boot > 0x8000
    {
      rts*。lib (.text:_c_int00_noargs)

    这也适用于

    .boot > 0x8000
    {
      -l rts*.lib (.text:_c_int00_noargs)

    在较旧的编译器16.9.2LTS 中、

    .boot > 0x8000
       {
        -l rts*.lib (.text)
       }

    上周五我尝试了几次迭代来使它能够正常工作、但还是失败了。 今天早上,我注意到一个小细节,我错过了。 我通过搜索.map 文件发现了这一点。

    在较旧的编译器16.9.2LTS 中:

    编译为 boot_special.c boot_special.obj

    但是、在新编译器中、21.6.0.LTS

    boot.c 编译为 boot.c.obj 

    --不是 boot.obj (这是我在链接器命令文件中使用的)

    请注意".c".obj!! 较旧的编译器没有在.obj 名称中保留".c"扩展名

    请参阅我上一篇文章中.map 文件的摘录。