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.

[参考译文] UCD3138A:load.asm

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/609016/ucd3138a-load-asm

器件型号:UCD3138A

尊敬的 TI:

我正在研究 UCD3138A 的大教堂代码。  我对 load.asm 文件感到困惑。汇编指令如下所示:

LDR r0、c_cinit
MOV r7、#1
CMN r0、r7
BEQ _C1_

这意味着初始化变量、将 pflash 中的变量复制到 RAM 中以运行?  要复制的 pflash 中的哪个段?

您能否提供  一些有关 UCD3138A 启动程序的文档?

祝你一切顺利

Lei

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    cinit 表由 C 编译器为自动初始化变量生成。 应在 load.asm 的注释中描述表的格式。

    自动初始化变量是一个静态变量、其值在声明中定义、如下所示:

    int32 grumple_index = 43;

    如果您查看具有自动初始化变量的工程的映射文件、则应该会看到一个 cinit 区域。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ian Bower 先生:

    非常感谢您的回复。 我还有3个问题要咨询。

    Q1 μ A:  

      在 load.asm 中、 以下汇编语句 意味着将  c_cinit 与 -1进行比较 、如果 相等则执行主代码?  为什么要与-1进行比较?  如果变量不相等,则执行初始化?

    LDR r0、c_cinit
     MOV r7、#1
     CMN r0、r7
     BEQ _C1_

     

    Q2 : 我查看 映射文件、因为以下映射文件显示 了.cinit 段和.bss 段。

       .cinit    0   000065d0   0000004c     
                     000065d0   00000018    UART_AUTO_Baud.obj (.cinit)
                     000065e8   00000018    fault_handler.obj (.cinit)
                     00006600   00000018    standard_interrupt.obj (.cinit)
                     00006618   00000004    -孔-[填充= 0]

     .bss      0   0001901c   000006cc    未初始化
                     0001901c   0000020b    main.obj (.bss)
                     00019227   00000001    UART.obj (.bss)
                     00019228   00000100    main.obj (.bss:_xn_bins)
                     00019328   00000080    main.obj (.bss:_program_area)
                     000193a8   00000058    main.obj (.bss:_PMBus_DCDC_CONFIG)
                     00019400   00000058    main.obj (.bss:_PMBus_DCDC_CONFIG_translated)
                     00019458   0000004c    main.obj (.bss:_filter0_CP_PMBus_regs)
                     000194a4   0000004c    main.obj (.bss:_filter0_PMBus_regs)
                     000194f0   0000004c    main.obj (.bss:_filter0_start_up_PMBus_regs)
                     0001953c   0000004c    main.obj (.bss:_filter1_PMBus_regs)
                     00019588   00000034    main.obj (.bss:_adc_values)
                     000195bc   00000034    main.obj (.bss:_adc_values_avg)
                     000195f0   00000034    main.obj (.bss:_fiq_data)
                     00019624   00000034    main.obj (.bss:_PMBus_buffer)
                     00019658   00000030    main.obj (.bss:_PMBus_DCDC_CONFIG_NONPGED)
                     00019688   00000030    main.obj (.bss:_PMBus_DCDC_CONFIG_Nonpged_translated)
                     000196b8   00000020    UART_AUTO_Baud.obj (.bss)
                     000196d8   00000008    FAULT_handler.obj (.bss)
                     000196e0   00000008    standard_interrupt.obj (.bss)

     cinit 段中的初始化记录的格式 : 以字节为单位的大小、 指向 .bss 区域的指针、初始化日期。  映射文件只提供.obj 文件。

    那么,我如何在 .cinit 中获取详细信息 ,就像指针一样,在.bss 中的哪个区域?    初始 化日期是什么?   日期的大小?  

     

    Q3: 为什么堆栈 在 load.asm 和映射文件中具有不同的地址? (fiq_stack_top .equ 0x19e00)   (00019f94 _StackFIQ_)

    加载.asm 中

    SUP_STACK_TOP  .equ 0x19ffc;监控器模式(SWI 堆栈)从存储器顶部开始
    fiq_stack_top .equ 0x19e00;为监控器堆栈分配256个字节、然后执行 FIQ 堆栈
    IRQ_STACK_TOP .equ 0x19d00;为 FIQ 堆栈分配256个字节、然后启动 IRQ 堆栈
    USER_STACK_TOP .equ 0x19b00;

    在映射文件中

    00019fec _StackABORT_                            
    00019f94 _StackFIQ_                              
    00019fe8 _StackIRQ_                              
    00019ffc _StackSUPER                            
    00019ff0 _StackUND_                              
    00019f24 _StackUSER_  

     

    祝你一切顺利

    Lei

     

     

     

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

    您的第一个问题应在 load.asm 中的注释中回答。

    ;*--------------------------------------------------

    ;*执行自动初始化。 如果 CINIT 为-1、则

    ;*没有。

    ;*--------------------------------------------------

    因此、如果没有 CINIT 表、则 c 编译器会将_cinit 的值设置为-1。

    cinit 的大小和位置在.map 文件中给出:

                      位置       大小

    .cinit    0   000065d0   0000004c     
                     000065d0   00000018    UART_AUTO_Baud.obj (.cinit)
                     000065e8   00000018    fault_handler.obj (.cinit)
                     00006600   00000018    standard_interrupt.obj (.cinit)
                     00006618   00000004    -孔-[填充= 0]

    要查看文件中的实际数据、我建议查看.xo 文件。  .x0文件是一种非常直接的目标文件格式。  如果您需要有关此方面的帮助、它上面有一个 Wikipedia 页面。  

    我从未需要查看.cinit 文件。  我从未听说过它有任何问题。  

    堆栈位置完全由 load.asm 文件定义。  将忽略.cmd 文件中的值。  cmd 文件中的一个重要事项是在一个低于堆栈所期望的最低地址的地址处结束 RAM 部分。  这样、如果变量扩展到用于堆栈的空间、链接器会向您发出警告。  否则、您不必处理.cmd 文件中的栈值。  

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

    尊敬的 Ian Bower 先生:

    非常感谢您的友好和明确答复。   我今天读了 CMD 文件, 但仍然想知道以下两点。

    Q1:cmd 文件中的部分显示:

    .text:{}>(pflash align(16))
    .const:{}>(pflash align (16))  
    .cinit:{}>(pflash align (16))

    .config:{}>(DFLASH align(32)
    CONFIG_B:{}>(DFLASH align (32))
    .passw:{}>(DFLASH align(32 ))

    test.test 段 在 pflash 范围内的16字节边界上对齐。  为什么 .test 段 shoud 在 16字节边界上对齐、而不是32字节边界或 else?

    config 段在 DFLASH 范围内的32字节边界上对齐。   为什么.config 段 shoud 在 32字节边界上对齐 

    Q2: 关于   cmd 文件中的 UNIOIN 语句:

    union:run = RAM_for_program_area

    .ram_for_program_area
    .zero_out_integration_word:load = pflash、start (_zero_out_integration_word_start) {zero_out_integration_word.obj}

     Unioning 段会使链接器 将它们分配到相同的运行地址。

    来自.zero_out_integration_word .ram_for_program_area 的段 被分配在  RAM_for_program_area (0x00019000)中的同一地址上。

    我在 .ram_for_program_arean‘t 下是否来自?  在映射中、我找到 .ram_for_program_area 、该位置与  运行地址相同、位于0x00019000。

    只需将.zero_out_integration_word 加载到 RAM_for_program_area (0x00019000)、 Why Use UNION 语句?  

    #pragma DATA_SECTION (program_area、".ram_for_program_area")

    uint32 program_area[32];

    祝你一切顺利

    Lei



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

    我不知道为什么前三个字节在16字节边界上对齐。  我想我们只是因为担心,如果我们改变它,它可能会中断。  

    也许有人可以为我添加这个信息。

    配置常量按这种方式对齐、因为 DFLASH 具有32字节页、我们希望配置在新页面上启动、因此我们可以擦除页面并仅擦除配置结构、而不会执行其他操作。

    使用 UNION 时、我们只有一个 RAM 区域、并且我们仅在需要时将每个程序写入该区域。  我们不希望占用更多的 RAM。

    联合体的设置使得在 RAM 中执行的所有程序都被编译、就像它们从 RAM 地址中执行一样、但是它们被存储在程序闪存中。

    这就是联合体的设计目标。  

    复制到 RAM 中的程序都涉及到程序闪存中无法完成的操作、例如擦除或写入程序闪存。  当擦除或写入操作进行时、程序闪存将返回 FFs、因此无法在该时间内执行。  因此、要执行它的程序必须在其他地方执行。  

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

    尊敬的 Ian Bower 先生:

    非常感谢您的友好和明确答复。   我现在清楚地谈到这一点。

    今天、我还有一个问题: 在 load.asm 文件中

    LDR R13,c_sup_stack_top;初始化监控器堆栈指针
    LDR R4、c_mfbalr1_hal0;将 R4指向程序闪存基地址寄存器
    MOV r0、#0x62;使块大小为32K、地址0、只读
    STRH r0、[R4];将其存储在此处
    LDR r0、c_mfbalr2_hal0_load;设置数据闪存仅用于写入
    STRH r0、[R4、#8];将其放入 mfbalr2中

    c_mfbalr1_half0 .long 0xFFFFFF0E;低16位内存细分组地址低
    c_mfbalr2_hal0_load .long 0x8822;数据闪存基址8800、块大小2K、只读

    这些汇编器意味着将 0x62写入 地址 0xFFFFFE0E,下面是 技术参考手册 的说明:

    "MFBALR1–BLOCK_SIZE 字段加载一个6。 这意味着程序闪存为 0x10000、长度为32KB。  RONLY 位。 如果置位,则表示“只读”。

    地址 FFFFFE0C–存储器精细基址低寄存器1"

    问题1: 根据手册, MFBALR1的地址  是 FFFFFE0C 而不  是0xFFFFFF0E,为什么 在     asm 文件中将0x62写入地址0xFFFFFE0E NOT FFFFFE0C?

     

     然后、这些汇编器 将 0x8822写入 地址 0xFFFFFE16

    手册中说: "MFBALR2–BLOCK_SIZE = 2、地址= 0x22–数据闪存= 2KB、位于0x18800

    地址 FFFFFE14–存储器精细基址低寄存器2"

    Q2: 为什么 在    asm 文件中将日期0x8822写入地址0xFFFFFF16而不是 FFFFFE14 (MFBALR2)?

    根据手动"address[15:10] AW [9]  block_size[7:4]  RONLY [1]  PRIV[0]"中的 MFBALR2定义

    Q3:我认为 您应该将  0x2222 (而不  是0x8822 )写入  寄存器 MFBALR2、这意味着数据闪存基址18800、块大小2K、只读?  为什么写入 0x8822?

     

     

    祝你一切顺利

    Lei

     

     

     

     

     

     

     

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你真的要用细齿梳来解决这个问题、对吧。

    在地址问题上、请注意指令是 STRH、STH 半存储、而不是 STR。 因此、我们只存储寄存器的下半部分、16位、而不是32位。 因此、我们使用32位寄存器的下半部分的地址、实际上它只是一个16位寄存器。

    对于8822与2222、您错了、8822是正确的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能告诉我、这里哪个代码被称为"UCD3138A 演示"吗?
    此致、
    Adam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ian Bower 先生:

    感谢    您的快速 回复和 详细解释。 再次感谢。

    周末愉快!

    祝你一切顺利

    Lei

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

     尊敬的兰先生

    我仍然对.cinit 段感到困惑

    .cinit 定义:显式初始化全局变量和静态变量的表。

     .cinit    0   000065d0   0000004c      
                     000065d0   00000018    UART_AUTO_Baud.obj (.cinit)
                     000065e8   00000018    fault_handler.obj (.cinit)
                     00006600   00000018    standard_interrupt.obj (.cinit)
                     00006618   00000004    -孔-[填充= 0]

     .bss      0   0001901c   000006cc    未初始化
                     0001901c   0000020b    main.obj (.bss)
                     00019227   00000001    UART.obj (.bss)
                     00019228   00000100    main.obj (.bss:_xn_bins)
                     00019328   00000080    main.obj (.bss:_program_area)
                     000193a8   00000058    main.obj (.bss:_PMBus_DCDC_CONFIG)
                     00019400   00000058    main.obj (.bss:_PMBus_DCDC_CONFIG_translated)
                     00019458   0000004c    main.obj (.bss:_filter0_CP_PMBus_regs)
                     000194a4   0000004c    main.obj (.bss:_filter0_PMBus_regs)
                     000194f0   0000004c    main.obj (.bss:_filter0_start_up_PMBus_regs)
                     0001953c   0000004c    main.obj (.bss:_filter1_PMBus_regs)
                     00019588   00000034    main.obj (.bss:_adc_values)
                     000195bc   00000034    main.obj (.bss:_adc_values_avg)
                     000195f0   00000034    main.obj (.bss:_fiq_data)
                     00019624   00000034    main.obj (.bss:_PMBus_buffer)
                     00019658   00000030    main.obj (.bss:_PMBus_DCDC_CONFIG_NONPGED)
                     00019688   00000030    main.obj (.bss:_PMBus_DCDC_CONFIG_Nonpged_translated)
                     000196b8   00000020    UART_AUTO_Baud.obj (.bss)
                     000196d8   00000008    FAULT_handler.obj (.bss)
                     000196e0   00000008    standard_interrupt.obj (.bss)

     cinit 段中的自动初始化变量是 UART_AUTO_Baud.obj 、FAULT_handler.obj 和 standard_interrupt.obj 中的变量。

     许多.C 文件中有许多全局变量和静态变量、 为什么  从上述三个 C 文件中选择自动初始化变量?  它们是否有任何特殊用途?

    我们是否必须将此 自动初始化变量复制 到 RAM?   为什么?

    祝你一切顺利

    Lei