原创 将工程从ADS转至WinARM (原创)

2008-9-18 10:20 5495 10 10 分类: MCU/ 嵌入式
花了一天时间才把工程从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 来编译了。



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /3 下一条