Forums

乐橙云app的启动代码

开始了 亚当塞舌尔 2007年6月15日
我一整天都在花一整天尝试学习榜样文件,以及如何
在乐橙云app中执行程序。当人们说在乐橙云app中的执行时,我认为他们
意味着整个程序(.text部分)在乐橙云app中。正确的 ?

在我见过的每个汇编程序启动文件中,我似乎无法找到它的位置
将代码复制到乐橙云app中。他们所有的都是.data输出部分
对于乐橙云app,但作为我预期的链接器脚本,将组分组所有部分
(包括.text)进入乐橙云app区域,或在地址0x200000处。

这是汇编程序启动的通常代码

/ *复制.data部分(从ROM复制到乐橙云app)* /
ldr R1, =_etext
ldr R2, =_data
ldr R3, =_edata
1:CMP R2,R3
ldrlo R0, [R1], #4
strlo R0, [R2], #4
blo 1b

...
...
_etext,_data和_edata是链接器中定义的符号
脚本。为乐橙云app程序编写的链接器脚本似乎定义
_etext在.text输出部分末尾,因此只有数据
根据上述代码复制后,文本部分。这是查找
非常混乱。如何以及在哪里.Text部分复制到乐橙云app?
亚当
亚当塞舌尔施莱布:
>我一整天都在花一整天试图学习榜样 启动文件,以及如何
>在乐橙云app中执行程序。当人们说在乐橙云app中的执行时,我认为他们
>意味着整个程序(.text部分)在乐橙云app中。正确的 ?

让我揭示一些光明:

主要是Linker-Scripts(至少针对嵌入式小工具)的位置代码(.text)
闪存中的只读数据(.rodata)。他们也给了一份副本
将数据(.data)初始化为闪存以由CStartup复制
代码到乐橙云app中。
一些代码的一些代码还原为乐橙云app,以便更快地求助。

现在,要拥有乐橙云app中的一切,你只需改变
“ROM”的基地地址,例如(GCC):
记忆 {
ROM(RX):ORG = 0,长度= 64K
乐橙云app(RW):ORG = 0x200000,长度= 64K
}

=>使用一半的乐橙云app作为“ROM”

记忆 {
ROM(RX):ORG = 0x200000,长度= 32K
乐橙云app(RW):ORG = 0x200000 + 32K,长度= 64K-32K
}

使用这种方法,您可以简单地在乐橙云app和ROM之间切换
更改ROM内存区域的开始。

缺点是,您在乐橙云app中有两次初始化的数据
可能与有限的公羊有太多。

数据是如此如此:

.data : AT(_etext)
{
*(.data)
} > ram

现在只是写道
.data :
{
*(.data)
} > ram

没有额外的副本。但现在,您的调试器必须是
智能足以正确放置部分。

如果你想一个接一个地将所有部分放在另一个部分,这是一个简单的
C /汇编程序的脚本:

记忆 {
乐橙云app(RWX):ORG = 0x200000,LEN = 64K
}

部分{
.text : {
*(.text)
*(.rodata)
*(.glue*)
} > ram
.data : {
*(.data)
} > ram
.bss : {
. = ALIGN(4);
_sbss = .;
*(.bss)
*(COMMON)
} > ram
_size_bss = sizeof(.bss);
}
-
42Bastian.
- -在......,亚当塞舌尔写道:
>
>我一整天都在花一整天尝试学习示例的启动文件,以及
如何
>在乐橙云app中执行程序。当人们说执行时 乐橙云app I assume they
>意味着整个程序(.text部分)在乐橙云app中。正确的 ?

右,亚当。
您可能想读到这一点:

http://www.atmel.com/dyn/general/tech_doc.asp?doc_id762

答案在那里;它位于链接器设置,第167页和ON。
>非常混乱。如何以及在哪里.text部分复制 to 乐橙云app ?
>
> Adam
>

如果我说闪存= 乐橙云app,那就不够了吗?
那样,为JTAG加上一些宏......所以Flashloader获取了
道路...

希望这有助于一种明智的方式。

罗杰
42bastian schick写道:
>
>主要是Linker-Scripts(至少针对嵌入式小工具)的位置代码(.text)
>闪存中的只读数据(.rodata)。他们也给了一份副本
>将数据(.data)初始化为闪存以由CStartup复制
> code into ram.

谢谢巴斯蒂安。我已经理解了你上面的说法。我可以遵循如何
链接器脚本组合了输入部分.text .rodata(加一些
其他人)进入Ram地区。
>一些代码的一些代码副本更快地复制了 excecution.
>
>
>“ROM”的基地地址,例如(GCC):
>
> MEMORY {
>ROM(RX):ORG = 0,长度= 64K
>乐橙云app(RW):ORG = 0x200000,长度= 64K
> }
>
> =>使用一半的乐橙云app作为“ROM”
>
> MEMORY {
>ROM(RX):ORG = 0x200000,长度= 32K
>乐橙云app(RW):ORG = 0x200000 + 32K,长度= 64K-32K
> }

>使用这种方法,您可以简单地在乐橙云app之间切换 and ROM by
>更改ROM内存区域的开始。
这将改变地址,因此所有生成的代码和数据都如此
将在地址0x200000开始的存储区域中。 Bwlow是A.
从地图文件'main.map'中编译的片段编译
地区。
.text 0x00200000 0x41b4.
*(.vectorg)
.vectorg 0x00200000 0x68 common / cstartup.o
0x00200068。 =对齐(0x4)
*(.init)
.init 0x00200068 0x128常见/ cstartup.o
0x00200110 IRQ_HANDLER_ENTRY.
0x00200158 at91f_default_fiq_handler.
0x00200068 _startup.
0x0020015c at91f_default_irq_handler.
0x00200160 at91f_spurious_handler.
0x0020010c退出
.init 0x00200190 0x104常见/ swi_handler.o
0x00200190 SoftwareItruptasm.
*(.text .text.*)
.text.dump_interrupt_state.
0x00200294 0x44 main.o.
.text.dump_mem
0x002002d8 0x34 main.o.
.text.main 0x0020030c 0x274 main.o
0x0020030c主要
.text.at91f_dbu_init.

现在,二进制闪存图像当然只能存在于AT91SAM中
闪存它首次启动时。闪光灯映射到0x0和0x100000。
因此,启动代码必须明确复制整个闪存
在执行主程序之前,内容到乐橙云app中。
如果程序在闪存中执行,则所有绝对地址都将是
0x200000不正确地偏移。跳到位置0x0020030c
在Main.map计划之上,不会跳到主要,因为这是乐橙云app
空间,没有代码存在。

我看过的初始文件都不是复制.text和.rodata
进入乐橙云app的部分,但它们都将这些部分定位为乐橙云app
MAP文件中报告的内存区域。

亚当
亚当

>这将改变地址所以所有生成的 code and data so it
>将在地址0x200000开始的存储区域中。 Bwlow是A.
>从地图文件'main.map'中编译的片段编译
> region.

对你必须用手复制一切_before_你
跳转到CStartup代码。

提供脚本旨在使用调试器加载。

如果您打算闪存,但在乐橙云app中运行所有,则要么使用更多
复杂的脚本并将复制到CSTARTUP或
复制自己,但那么脚本看起来像这样:

部分{
/ * init放置在0 * /
.init 0 : {
*(.init)
_eoi = .;
}

.text : AT (_eoi)
{
*(.text) *(.rodata)
} > ram

.data:在(_eoi + sizeof(.text))
{
*(.data)
} > ram
_sizeof_image = sizeof(.text)+ sizeof(.data);
.bss :
{
*(.bss) *(COMMON)
} > ram
}

一些汇编程序:
。“.init”,“斧头”
.code 32
.extern _eoi
.extern _sizeof_Image.

ldr r0,=_eoi
ldrr1,= _ sizeof_image
mov r1,r1,lsr #4
mov r2,#0x200000
1:
ldmia r0!,{r3-r6}
stmia r2!,,{r3-r6}
subs r1,r1,#1
bpl 1b
bl 0x200000
/ *永远不会返回* /
.ltorg

-
42Bastian.
42bastian schick写道:
>吧,你必须用手复制一切 _before_ you
>跳转到CStartup代码。
>
>提供脚本旨在使用调试器加载。

啊,这开始有意义。我自动假设
脚本是为最后的闪烁编写的。如果可能的是JTAG
将main.bin文件直接下载到乐橙云app,然后不需要
要为任何.Init代码进行手动副本。

>如果您打算闪烁,但在乐橙云app中运行全部,您 either use a more
>复杂的脚本并将复制到CSTARTUP或
>复制自己,但那么脚本看起来像这样:
>

是的,理解。我也刚刚学会了如何放置个人功能
使用分布式示例链接器脚本和cstartup进入乐橙云app空间
文件。 gcc关键字__attribute__((部分(“.fastrun”))))可以是
用于在.fastrun部分施加特定的函数。我观察到
CStartup将.fastrun部分(与.data)复制到乐橙云app中。

亚当