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.

[参考译文] 编译器/AM3359:.DATA部分未初始化

Guru**** 2539500 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/575227/compiler-am3359-data-section-uninitialized

部件号:AM3359

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

您好,

我正在使用6.0 .1.0.004万 和TI v 5.1 .4。 当我正在构建starter ware引导加载程序代码时,在.map文件中,它显示.data部分未初始化。 全局变量未初始化。 它正在使用垃圾值初始化全局变量。 例如,考虑以下全局变量

tOPConfig oppTable[]=

   {MPUPLL_M_275_MHz,PMIC_VOLT_SEL_1100MV}, /* OPP10.0275万Mhz - 1.1V *
   {MPUPLL_M_500_MHz,PMIC_VOLT_SEL_1100MV}, /* OPP10.05万MHz - 1.1V *
   {MPUPLL_M_600_MHz,PMIC_VOLT_SEL_1200MV}, /* OPP12.06万Mhz - 1.2V */
   {MPUPLL_M_720_MHz,PMIC_VOLT_SEL_1260MV}, /* OPP Turbo 720Mhz - 1.26v */
   {MPUPLL_M_300_MHz,PMIC_VOLT_SEL_0950MV}, /* OPP5.03万MHz - 950mv */
   {MPUPLL_M_300_MHz,PMIC_VOLT_SEL_1100MV}, /* OPP10.03万MHz - 1.1V *
   {MPUPLL_M_600_MHz,PMIC_VOLT_SEL_1100MV}, /* OPP10.06万Mhz - 1.1V *
   {MPUPLL_M_720_MHz,PMIC_VOLT_SEL_1200MV}, /* OPP12.072万Mhz - 1.2V */
   {MPUPLL_M_800_MHz,PMIC_VOLT_SEL_1260MV}, /* OPP Turbo 800MHz - 1.26v */
   {MPUPLL_M_1000_MHz,PMIC_VOLT_SEL_1325MV} /* OPP nitro 1000MHz - 1.325v *
};

使用垃圾值初始化整个oppTable[]。

我的链接程序.cmd文件是

-stack 0x0008                            /*软件堆栈大小          */
-堆  0x2000                            /*堆区大小               */
-e条目
/*由于我们使用了'entry'作为入口点符号,因此编译器会发出   */
/*警告(#1.0063万-D:指定了"_c_int00"以外的入口点符号:  */
/*"条目")。 CCS版本(5.1 .0.0.8万)停止从命令     */生成
/*行。 因此,此警告被    */抑制
/*。 */

--diag_suppress=1.0063万

/*指定系统内存映射*/

内存

       iRAM_MEM       :org = 0x402F0400 len = 0x1FBFF           /* RAM */
}

/*指定分配给内存的部分*/

章节

   .init   :{
                BL_init.obj (.text)
              }加载> 0x402F0400

   text   :load > IRAM_MEM             /* code                        */
   数据   :LOAD > IRAM_MEM             /*已初始化全局变量和静态变量。 */
   .bss    : LOAD > IRAM_MEM             /* Uninitialized or zero initialized */
                                           /*全局变量和静态变量。   */
                   运行启动(BSS_START)
                   运行结束(BSS_END)
   .const  : LOAD > IRAM_MEM             /*全局常量            */
   .cinit  :load > IRAM_MEM
   .stack  :load > 0x4030FFF0/*           software system stack       */

}

我的内存映射文件.map文件是

入口点符号:"入口" 地址:402f0400


内存配置

        名称           使用的原点   长度         未使用  的属性   填充
----------------  -----------------  -------------------  -----------------  -----------------  --------  
 iRAM_MEM             402f0400  0001fbff 0000fbe1 0001001e10001001e RWIX


分段分配图

运行源站 负载源站  长度  初始化长度吸引成员
--------  -------- -------- -------- ——— ---------
402f40.0402万   402f0400   0000ef2c  0000ef2c   r-x
 402f40.0402万   402f40万   0000.0088万  00000088   r-x .init
 402f48.8402万   402f0488   0000eea4  0000eea440000eea4   r-x .text
402ff32c   402ff32c   0万c00  000000000万00000   rw-0万 rw-
 402ff32c   402ff32c   0万a1d  0万   rw-.bss
 402ffd4c   402ffd4c   0.0001万e0  00000000000000000   rw-.data
402fff2c   402fff2c   0万20  000000202万00020   r--0.002万 r--
 402fff2c   402fff2c   0万20  000000202万00020   r--0.002万 r--.const
402fff5.0402万   402fff5万   0000.009万  00000090   r--
 402fff5.0402万   402fff5万   0000.009万  00000090   r--.cit
4030fff0   4030fff004030fff0   000000080万08  000000000.8万00000   rw-0万 rw-
 4030fff0   4030fff004030fff0   000000080万08  000000000.8万00000   rw-0万 rw-.stack


区段分配图

 输出                                 属性/
书帖  页面   原点     长度      输入书帖
-----------------  --------   --------   --------
init     0402   402f40万   0000.0088万     
                 402f40万   0000.0088万    BL_init.obj (.text)

文本     0402   402f0488   0000eea4     
                 402f0488   00001d10    drivers.lib:UART_IRDA_cir.obj (.text)
                 402f2198   00001c8c                :gpmc.obj (.text)
                 402f3e2400.0019万   f8    utils.lib:uartStdio.obj (.text)
                 402f581c   0.1338万    bl_platform.obj (.text)
                 402f6b5400.0012万   a8    libnand_.lib:nand_gpmc.obj (.text)
                 402f7dfc   0.11万                :nandlib.obj (.text)
                 402f8efc   0万b50    drivers.lib : gpio_v2.obj (.text)
                 402f9a4c   0万ad0                :hsi2c.obj (.text)
                 402fa51c   0.0009万e4    platform.lib : gpio.obj (.text)
                 402faf0.0007万   d4                 :SDS_DPE_Host_Pinmix.obj (.text)
                 402fb6d400.0007万   c0    drivers.lib:elm.obj (.text)
                 402fbe9400.0006万   f0    platform.lib:dmtimer.obj (.text)
                 402fc5.84亿   9c    drivers.lib:dmtimer.obj (.text)
                 402fcc2万   0000.0638万    utils.lib:ascii.obj (.text)
                 402fd25.8万   0000.0448万    platform.lib:hsi2c.obj (.text)
                 402fd6a00000042   c                 :UART.OBJ (.text)
                 402fdacc   0.0003万e4    system.lib : interrupt.obj (.text)
                 402fdeb000000380       BL_nand_.obj (.text)
                 402fe23万   0000.031万    platform.lib:nand.obj (.text)
                 402fe54万   0000.028万    utils.lib:consoleUtils.obj (.text)
                 402fe7c000000220       platform.lib : cpld_obj(.text)
                 402fe9e000000180       rtsv7A8_a_le_eabi.lib:memcpy32.obj (.text)
                 402feb6万   0000.017万    platform.lib : sysdelay.obj (.text)
                 402fecd00000014   c                 :uartConsole.obj (.text)
                 402fee1c   0万f0    rtsv7A8_a_le_eabi.lib : u_div32.obj (.text)
                 402fef0c   0万d4                          :auto_init.obj (.text)
                 402fefe0万   b0                          :memset32.obj (.text)
                 402ff9万   0000.0098万                          :copy_decpress_rle.obj (.text)
                 402ff12.8万   0000.008万                          :cpy_tbl.obj (.text)
                 402ff1a800000060       system.lib:cpu.obj (.text)
                 402ff20.8万   0000.0054万    main.obj (.text)
                 402ff25c   0.0004万c    utils.lib:delay.obj (.text)
                 402ff2a800000038       system.lib:device.obj (.text)
                 402ff2e000000020       rtsv7A8_a_le_eabi.lib:copy_zero_init.obj (.text:decpress:Zi)
                 402ff30万   0000.0014万                          :copy_decpress_none.obj (.text:decpress:none)
                 402ff3.14亿   0c    system.lib : cpu.obj (.text:CPUIntStatus)
                 402ff32万   0000.0008万    rtsv7A8_a_le_eabi.lib:copy_decpress_rle.obj (.text:decpress:rle24)
                 402ff32.8万   0000.0004万                          :I_DIV0.OBJ (.text)

.bss      0402   ff32c   0万a1d    未初始化
                 402ff32c   0.08万    BL_nand_.obj (.bss:rxData)
                 402ffb2c   0.02万    system.lib:interrupt.obj (.bss:fnRAMVectors)
                 402ffd2c   0.0004万    (.common:dataFromSlave)
                 402ffd3万   0000.0004万    (.common:dataToSlave)
                 402ffd3.4万   0000.0004万    (.common:deviceVersion)
                 402ffd3.8万   0000.0004万    (.common:freqMultDDR)
                 402ffd3c   0.0004万    (.common:oppMaxIdx)
                 402ffd4万   0000.0004万    (.common:rCount)
                 402ffd4.4万   0000.0004万    (.common:tCount)
                 402ffd4.8万   0000.0001万    (.common:ConsoleType)

数据     0402   ffd4c   0.0001万e0    未初始化
                 402ffd4c   0.0108万    BL_nand_.obj (.data)
                 402ffe5400万   cc    BL_platform.obj (.data)
                 402fff2万   0000.0008万    main.obj (.data)
                 402fff2.8万   0000.0004万    platform.lib : sysdelay.obj (.data)

const    0402   fff2c   0.002万     
                 402fff2c   0.0014万    utils.lib : uartStdio.obj (.const:.string)
                 402fff4万   0000.0008万    BL_platform.obj (.const:.string)
                 402fff4.8万   0000.0004万    utils.lib:uartStdio.obj (.const)

.cinit    0402   402fff5万   0000.009万     
                 402fff500000006   a    (.cinit.data.load)[加载图像,压缩= RLE]
                 402fffba   0.0002万    --孔--[填充=0]
                 402fffbc   0万c    (__TI_handler_table)
                 402fffc800000008       (.cinit.bss.load)[加载映像,压缩= zero_init]
                 402fffd000000010       (__TI_cinit_table)

堆栈    04030   4030fff000000008       未初始化
                 4030fff0   00000008000000008    --孔--


链接程序生成的复制表

__TI_cinit_table @ 402fffd0记录:2,大小/记录:8,表大小:16
   数据:load addr=402fff50,load size=0.0006万a bytes,run addr=402ffd4c,run size=0.0001万e0 bytes,compression=rLE
   bss:load addr=402fffc8,load size=0.0008万 bytes,run addr=402ff32c,run size=0万a1d bytes,compression=zero_init


链接程序生成的处理程序表

__TI_handler_table @ 402fffbc记录:3,大小/记录:4,表大小:12
   索引:0,处理程序:__TI_decpress_rle24
   索引:1,处理程序:__TI_decpress_none
   索引:2,处理程序:__TI_ZERO_INIT

请帮助我们解决问题。

谢谢,此致

Raja

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

    我不知道什么错了。  我不知道如何根据此处显示的内容来解决错误。  我猜是您遇到了一些硬件配置错误。  为了帮助您找到这一点,我认为更好地了解C代码如何开始运行非常有用。

    在ARM编译器手册中,请参阅系统初始化一节。  请特别注意标题为 “运行时自动初始化变量”的子部分。  使用选项--rom_model可以很清楚地链接。  以下是在这种情况下工作原理的摘要。  data部分是单个目标文件中的一个初始化部分。  链接程序将所有这些.data输入部分收集到一个也名为.data的输出部分中,并将其压缩,然后将其放入名为.cinit的部分中。  然后,.data输出部分更改为未初始化的部分。  链接程序命令文件中显示的所有内容都与此说明一致。  我希望在更好地了解这些初始化步骤的设计之后,您可以找到问题的根本原因。

    谢谢,此致,

    -George

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

    主席先生,

    感谢您解决我的问题。
    在ARM链接程序中,将标志从--rom_model更改为--ram_model可以解决问题。
    请解释--rom_model和--ram_model之间的区别。 根据ARM编译器手册,它说明了这一点

    --rom_model在运行时初始化变量。

    --ram_model,它已预初始化。

    因此两者都应该起作用。

    在“What does the精确的硬件配置错误意味着什么? 如何找出该错误?

    谢谢,此致

    Raja

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

    先生,

    我尝试了一种解决方案,它工作正常。

    在BL_init.asm文件中,它包含以下代码。

           全局条目
           全局启动启动
           .global __TI_auto_init

           .ref __stack
           .ref bss_start
           .ref bss_end
           .ref start_boot
           .ref主要

    ;**************** 内部定义******************************

    ;定义不同模式的堆栈大小。 用户/系统模式将使用
    ;其余的堆栈总大小


    und_stack_size .set 0x8
    abt_stack_size .set 0x8
    fiq_stack_size .set 0x8
    irq_stack_size .set 0x100
    svc_stack_size .set 0x8


    ;可为不同模式设置CPSR中的模式位


    mode_usr .set 0x10
    MODE_FIQ .SET 0x11
    MODE_IRQ .SET 0x12
    MODE_SVC .SET 0x13
    MODE_ABT .SET 0x17
    MODE_UND .SET 0x1B
    MODE_SYS .SET 0x1F

    I_F_bit .set 0xC0

    ;********************** 代码段*******************************************
           文本


    ;此代码是为ARM指令组装的

           州32.

    ;************************************************************************

    ;************************************************************************

    ;重置处理程序为所有模式设置堆栈指针。 FIQ和
    ;在此期间应禁用IRQ。 然后,清除BSS部分,切换到
    ; main()函数。

    条目:

    ;将堆栈设置为“未定义”模式

            ldr  r0,_stackptr                    ;读取堆栈地址
            MSR  CPSR_c,#MODE_UND|I_F_bit      ;切换到UNDEF 模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#und_stack_size        ;提供堆栈空间

    ;将堆栈设置为中止模式

            MSR  CPSR_c,#MODE_ABT|I_F_bit      ;更改为中止模式
            MOV  sp,r0                         ;写入堆栈指针
            sub0  ,r0,#ABT_STACK_SIZE         ;提供堆栈空间

    ;为FIQ模式设置堆栈

            MSR  CPSR_c,#MODE_FIQ|I_F_bit      ;更改为FIQ模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#fic_stack_size         ;提供堆栈空间

    ;设置IRQ模式的堆栈

            MSR  CPSR_c,#MODE_IRQ|I_F_bit      ;更改为IRQ模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#irq_stack_size         ;提供堆栈空间

    ;为SVC模式设置堆栈

            MSR  CPSR_c,#MODE_SVC|I_F_bit      ;更改为SVC模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#svc_stack_size         ;提供堆栈空间

    ;为用户/系统模式设置堆栈

            MSR  CPSR_c,#MODE_SYS|I_F_bit      ;更改为系统模式
            MOV  sp,r0                          ;写入堆栈指针

    ;清除此处的BSS部分

    Clear_BSS_Section (清除BSS_部分):

            LDR  r0,_BSS_START                ;BSS的起始地址
            LDR  R1,_BSS_END                  ;BSS的结束地址
            子  R1,R1,#4
            MOV  R2,#0
    循环:
            str  r2,[r0],#4;                   清除BSS中的一个单词
            CMP  r0,R1
            BLE  循环                           ;清除到BSS结束

    ;输入start_boot函数。 在系统模式下仍执行

            LDR  R10,_main                ;获取main的地址
            MOV  LR,PC                          ;虚拟返回至main
            BX   R10                            ;从Branch到main
            子  PC,PC,#0x08                  ;循环

    ;        MSR  CPSR_c,#MODE_SVC|I_F_bit      ;更改为SVC模式
    ;        BX  LR

    ;文件结尾


    stackptr (_stackptr):
       word __stack
    _BSS_START:
       Word BSS_START
    _BSS_结束:
       Word BSS_END
    主页(_M):
       Word主页
    _data_auto_init:
       .word __TI_auto_init
            结束

    在该代码中,在初始化stack并清除.bss部分后,我们直接调用main。 但TI ARM编译器对--rom.model说了这一点。 堆栈初始化后,它应调用__TI_auto_init函数,然后调用main。 因此,我在“清除BSS”部分之后添加了以下代码。

           全局条目
           全局启动启动
           .global __TI_auto_init

           .ref __stack
           .ref bss_start
           .ref bss_end
           .ref start_boot
           .ref主要

    ;**************** 内部定义******************************

    ;定义不同模式的堆栈大小。 用户/系统模式将使用
    ;其余的堆栈总大小


    und_stack_size .set 0x8
    abt_stack_size .set 0x8
    fiq_stack_size .set 0x8
    irq_stack_size .set 0x100
    svc_stack_size .set 0x8


    ;可为不同模式设置CPSR中的模式位


    mode_usr .set 0x10
    MODE_FIQ .SET 0x11
    MODE_IRQ .SET 0x12
    MODE_SVC .SET 0x13
    MODE_ABT .SET 0x17
    MODE_UND .SET 0x1B
    MODE_SYS .SET 0x1F

    I_F_bit .set 0xC0

    ;********************** 代码段*******************************************
           文本


    ;此代码是为ARM指令组装的

           州32.

    ;************************************************************************

    ;************************************************************************

    ;重置处理程序为所有模式设置堆栈指针。 FIQ和
    ;在此期间应禁用IRQ。 然后,清除BSS部分,切换到
    ; main()函数。

    条目:

    ;将堆栈设置为“未定义”模式

            ldr  r0,_stackptr                    ;读取堆栈地址
            MSR  CPSR_c,#MODE_UND|I_F_bit      ;切换到UNDEF 模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#und_stack_size        ;提供堆栈空间

    ;将堆栈设置为中止模式

            MSR  CPSR_c,#MODE_ABT|I_F_bit      ;更改为中止模式
            MOV  sp,r0                         ;写入堆栈指针
            sub0  ,r0,#ABT_STACK_SIZE         ;提供堆栈空间

    ;为FIQ模式设置堆栈

            MSR  CPSR_c,#MODE_FIQ|I_F_bit      ;更改为FIQ模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#fic_stack_size         ;提供堆栈空间

    ;设置IRQ模式的堆栈

            MSR  CPSR_c,#MODE_IRQ|I_F_bit      ;更改为IRQ模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#irq_stack_size         ;提供堆栈空间

    ;为SVC模式设置堆栈

            MSR  CPSR_c,#MODE_SVC|I_F_bit      ;更改为SVC模式
            MOV  sp,r0                          ;写入堆栈指针
            sub0  ,r0,#svc_stack_size         ;提供堆栈空间

    ;为用户/系统模式设置堆栈

            MSR  CPSR_c,#MODE_SYS|I_F_bit      ;更改为系统模式
            MOV  sp,r0                          ;写入堆栈指针

    ;清除此处的BSS部分

    Clear_BSS_Section (清除BSS_部分):

            LDR  r0,_BSS_START                ;BSS的起始地址
            LDR  R1,_BSS_END                  ;BSS的结束地址
            子  R1,R1,#4
            MOV  R2,#0
    循环:
            str  r2,[r0],#4;                   清除BSS中的一个单词
            CMP  r0,R1
            BLE  循环                           ;清除到BSS结束

          LDR  R10,_data_auto_init               ;获取ti_auto_init的地址
            MOV  LR,PC                          ;虚拟返回ti_auto_init
            BX   R10                         ;分支到ti_auto_init

    ;输入start_boot函数。 在系统模式下仍执行

            LDR  R10,_main                ;获取main的地址
            MOV  LR,PC                          ;虚拟返回至main
            BX   R10                            ;从Branch到main
            子  PC,PC,#0x08                  ;循环

    ;        MSR  CPSR_c,#MODE_SVC|I_F_bit      ;更改为SVC模式
    ;        BX  LR

    ;文件结尾


    stackptr (_stackptr):
       word __stack
    _BSS_START:
       Word BSS_START
    _BSS_结束:
       Word BSS_END
    主页(_M):
       Word主页
    _data_auto_init:
       .word __TI_auto_init
            结束

    以上代码正在初始化全局变量,并且对--rom_model工作正常。

    请您确认这是正确的方式吗?或者我们是否做错了什么?

    您能否大致说明哪种型号最适合? --rom_model或--ram型号,以及对于引导装载程序,哪种型号最适合?

    请您说明--rom和--ram模式的优点和缺点吗?

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

    您使用的启动代码不是来自编译器RTS库。  我不熟悉您的启动代码,它包含在名为BL_init.asm的文件中。  这还可以,除了一件事。  BL_init.asm中的代码假定您与--ram_model链接。  您更改了它,因此假定您与--rom_model链接。

    如果设备必须从开机状态中自行引导,并且系统其它部件不提供帮助,请使用--rom_model。  一种典型的情况是,所有内容都驻留在闪存中,当通电时,设备通过执行某些特定中断启动,此中断导致启动代码开始运行。  当某些外部机制可以将代码和数据复制到系统内存中,然后开始执行时,请使用--ram_model。  在这种情况下,将.data视作另一个已初始化的部分复制到内存中。

    谢谢,此致,

    -George

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

    我们将AM335xstarter ware启动加载程序代码用于主板的启动用途。 文件BL_init.asm包含在starter ware引导加载程序代码中,我们正在使用相同的代码。

    谢谢,此致

    Raja