嘿,伙计们正在进行决赛,我不知道如何回答这个问题。我知道答案是否定的,但我不知道为什么!
答案 0 :(得分:1)
因为您的程序被写入闪存(也就是程序存储器),所以您只能在那里定义数据。当然,您可能有一个初始化例程,它将一系列字节从flash复制到sram,您的工具链甚至可能透明地支持这种用法。例如,avr-gcc
工具链使用.data
部分。
鉴于此C代码片段:
static unsigned char foo[] = { 1, 4, 9, 16 };
avr-gcc
将创建以下汇编代码(摘录):
.data
.type foo.1351, @object
.size foo.1351, 4
foo.1351:
.byte 1
.byte 4
.byte 9
.byte 16
当然,最终的程序会将此部分嵌入flash中。工具链创建一个初始化程序例程,将例程复制到sram,代码需要它:
00000000 <__ctors_end>:
0: 10 e0 ldi r17, 0x00
2: a0 e6 ldi r26, 0x60
4: b0 e0 ldi r27, 0x00
6: e2 e2 ldi r30, 0x22
8: f0 e0 ldi r31, 0x00
c: c8 95 lpm
e: 31 96 adiw r30, 0x01
10: 0d 92 st X+, r0
12: a4 36 cpi r26, 0x64
14: b1 07 cpc r27, r17
16: d1 f7 brne .-12
这是一个循环,使用lpm
从flash读取,st X+, r0
写入sram。
答案 1 :(得分:0)
我不知道您正在使用哪个工具集,但是在Microsoft / ARM /和许多其他工具集的情况下结合某种类型的exe2bin实用程序来生成嵌入式软件的rom映像,然后使用db,dw ,dd,dq,对于SRAM中的数据不是问题。生成的代码将包括在启动时将ROM / EPROM / EEPROM / FLASH映像中的数据复制到SRAM中的代码。对于未初始化的内存,您可以使用?对于诸如|的值D b ? |或者dw? |。这些通常进入.BSS(由符号开始的块)段。启动代码将未初始化的内存区域清零是很常见的,因此它也可以在.BSS部分中放置静态变量。