尊敬的 TI:
我正在研究 UCD3138A 的大教堂代码。 我对 load.asm 文件感到困惑。汇编指令如下所示:
LDR r0、c_cinit
MOV r7、#1
CMN r0、r7
BEQ _C1_
这意味着初始化变量、将 pflash 中的变量复制到 RAM 中以运行? 要复制的 pflash 中的哪个段?
您能否提供 一些有关 UCD3138A 启动程序的文档?
祝你一切顺利
Lei
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.
尊敬的 TI:
我正在研究 UCD3138A 的大教堂代码。 我对 load.asm 文件感到困惑。汇编指令如下所示:
LDR r0、c_cinit
MOV r7、#1
CMN r0、r7
BEQ _C1_
这意味着初始化变量、将 pflash 中的变量复制到 RAM 中以运行? 要复制的 pflash 中的哪个段?
您能否提供 一些有关 UCD3138A 启动程序的文档?
祝你一切顺利
Lei
尊敬的 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
尊敬的兰先生
我仍然对.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