本帖最后由 xnwxq 于 2009-8-23 17:29 编辑
花了一天时间才把工程从ADS转换到WinARM下,目前也只是编译通过,运行尚有问题.
代码可以在flash中运行,但初始化变量会出错,得到的data映射地址有问题,
因从windows开始学起得,对make及ld不是特别了解,看了两天书,了解了大部分语法,然后就在winarm带的例程中找了一个2318的工程,将make和ld文件拷贝到我的工程,由于我的芯片为mlc3890,不常见,就将makefile中对应做了更改,这里主要的改动部分是:
DIRARM, DIRARMBIN …等。改为我的winarm安装地址,
SRC,ASRC 源代码目录列表,
SUBMDL 要设为空,对应的 这里也要改动 LDFLAGS +=-TMLC3890-RAM.ld;
ld文件中需要更改的如下:
ENTRY(HandlerReset)
MEMORY
{
ROM (rx) : ORIGIN = 0x00048000, LENGTH = 0x00038000
RAM (rw) : ORIGIN = 0x01000000, LENGTH = 0x00100000
}
section的前边关键部分更改为:
.boot :
{
ASM_Boot.o(.text) /* Startup code */
ASM_Scatter.o(.text)
*(.text) /* remaining code */
*(.rodata) /* read-only data (constants) */
*(.rodata*)
*(.glue_7)
*(.glue_7t)
} > ROM
. = ALIGN(4);
_etext = . ;
PROVIDE (etext = .);
/* 这里这样写,是因为我需要利用scatter把初始化变量,这里还有问题,初始化不正常*/
/* 主要是利用_data, _etext, _datalen*/
.data 0x01000000 : AT (_etext)
{
_data = .;
*(.data)
} > RAM
_datalen = (SIZEOF(.data));
. = ALIGN(4);
_edata = . ;
PROVIDE (edata = .);
/* 这里这样写,是因为我需要利用scatter把未初始化的RAM空间初始化为0,*/
/* 主要是利用__bss_start, __bss_len, _datalen*/
.bss (NOLOAD) :
{
__bss_start = . ;
__bss_start__ = . ;
*(.bss)
*(COMMON)
. = ALIGN(4);
} > RAM
. = ALIGN(4);
__bss_end__ = . ;
PROVIDE (__bss_end = .);
PROVIDE (__bss_len = . - __bss_start);
汇编部分更改,需要将标准的ARM汇编更改为GNU的ARM汇编,
主要对应如下:
MACRO => .macro ENDM => .endm END => .end
AREA => .text CODE32 => .arm
EQU => .equ
注释方法也不同,gnu arm 汇编行注释用 #, 代码尾注意用 @
用PN.exe新建一个工程,把代码及makefile,ld加入,即可通过tool/make all , tool/make clean 来编译了。 |