(toppers-users 4092) Re: TOPPERS/ASP RX62N Configuration

starfieldtrue starfieldtrue @ gmail.com
2013年 5月 30日 (木) 18:33:02 JST


高田先生、ご提案ありがとうございます。
結局config.ldを用意して、以下の変更で対応することになりそうです。

  --cfg1-def-table $(SRCDIR)/kernel/kernel_def.csv $(CFG_TABS)
 CFG_OBJS := kernel_cfg.o $(CFG_OBJS)
 CFG2_OUT := kernel_cfg.c kernel_cfg.h $(CFG2_OUT)
-
+CFG1_OUT_LDSCRIPT = config.ld
 #
 #  共通コンパイルオプションの定義
 #


   LDFLAGS := $(LDFLAGS) -Wl,-Tdata,$(DATA_START_ADDRESS)
 endif
 ifdef LDSCRIPT
-  LDFLAGS := $(LDFLAGS) -T $(LDSCRIPT)
+  T_LDSCRIPT = -T $(LDSCRIPT)
+endif
+ifdef CFG1_OUT_LDSCRIPT
+  T_CFG1_OUT_LDSCRIPT = -T $(CFG1_OUT_LDSCRIPT)
 endif


 kernel_cfg.timestamp: $(START_OBJS) cfg1_out.o $(END_OBJS) $(HIDDEN_OBJS)
 kernel_cfg.timestamp $(CFG2_OUT):
- $(LINK) $(CFLAGS) $(LDFLAGS) $(CFG1_OUT_LDFLAGS) -o $(CFG1_OUT) \
+ $(LINK) $(CFLAGS) $(LDFLAGS) $(T_CFG1_OUT_LDSCRIPT) -o $(CFG1_OUT) \
  $(START_OBJS) cfg1_out.o $(END_OBJS)
  $(NM) -C $(CFG1_OUT) > cfg1_out.syms


 #  全体のリンク
 #
 $(OBJFILE): kernel_cfg.timestamp $(ALL_OBJS) $(filter %.a,$(ALL_LIBS))
- $(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) $(START_OBJS) \
+ $(LINK) $(CFLAGS) $(LDFLAGS) $(T_LDSCRIPT) -o $(OBJFILE) $(START_OBJS) \
  $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) $(ALL_LIBS) $(END_OBJS)
  $(NM) -C $(OBJFILE) > $(OBJNAME).syms
  $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec

2013年5月29日 19:19 Hiroaki TAKADA <hiro @ ertl.jp>:
> 星野様
>
> この件、返答が遅くなりました。
>
> 確かに、lma2vma を作成するのは1つの解決策だと思います。
>
> 我々の方で検討した結果は、cfg1_out.c をコンパイル&リンクする時には、
> 標準の(つまり、LMA=VMAになっている)リンカスクリプトを用い、asp.exe
> を作る際に、最終的な配置を得るリンカスクリプトを使えば、パス2でのエ
> ラーは回避できます。
>
> 両者のリンカスクリプトを別にするには、Makefile の CFG1_OUT_LDFLAGS
> と LDFLAGS を定義しわけることで実現できます。
>
> この辺り、ユーザマニュアルに注意事項として盛り込みたいと思います。
>
> 高田広章
> 名古屋大学
>
> (13/05/29 17:55), starfieldtrue wrote:
>> 星野です。
>>
>> (3)の問題:
>> make dependのcfg -pass 2でエラーになる。
>>
>> これはリンカスクリプトがLMA!=VMAの条件で発生すると思われますので、
>> 以下のコマンド「lma2vma」を作成することで回避しました。
>>
>> rx-elf-objcopy -O srec -S cfg1_out.elf cfg1_out.lma.srec
>> lma2vma _idata_start _data_start _idata_end cfg1_out.syms
>> cfg1_out.lma.srec cfg1_out.srec
>>
>>
>> 適切に設定すれば、コンフィギュレータで対応できるのでしょうか。
>>
>> 2013年5月22日 17:40 starfieldtrue <starfieldtrue @ gmail.com>:
>>> 星野と申します。
>>>
>>> 現在RX62N+TOPPERS/ASP+TINETで実験しています。
>>> TOPPERS動作中にCPU内蔵FLASHへの書き込みをしたいので
>>> sta_ker以後は全て内蔵RAM上で動作させたいと思っています。
>>> 内蔵FLASH書き込み中には、それ以外の内蔵FLASHへのアクセスは
>>> 許容されないため、割り込みが発生しても
>>> FLASHへのアクセスを避けたいのです。
>>>
>>> そこで、リンカスクリプトの記載を変えて試しているのですが、
>>> 思うようにいきません。もし何かご存知の方がいましたら
>>> アドバイスを頂けると嬉しいです。
>>>
>>> 4タイプの状況を下記に記載します。
>>> (1)はmake depend; makeは通るが、定数セクション(C)が
>>> FLASH上に配置されるので上記の要望を満たせない。
>>> (2)はmake dependは通るがmakeのcfg -pass 3でエラーになる。
>>> (3)はmake dependのcfg -pass 2でエラーになる。
>>> (4)はmake dependでリンクエラーになる。
>>>
>>> 以下リンカスクリプトについて
>>> (1),(2),(3),(4)で差異の部分だけ抜粋してあります。
>>>
>>> (1)
>>> MEMORY {
>>> ram(rwx) : o = 0x00000000, l = 0x00019000
>>> }
>>> SECTIONS {
>>> .text :
>>> {
>>> *(.start1) ... start.Sのコードを配置
>>> *(.start2) ... hardware_init_hookのコードを配置
>>> *(C) ... 定数データを配置(RX特有のセクション?)
>>> } >rom
>>>
>>> (2)
>>> MEMORY {
>>> ram(rwx) : o = 0x00001054, l = 0x00019000
>>> ... RAM開始アドレスがこれ以上ならば同じ状況になる。
>>> }
>>> SECTIONS {
>>> .text :
>>> {
>>> *(.start1)
>>> *(.start2)
>>> } >rom
>>> __idata_start = . ;
>>> .data   :  AT(__idata_start)
>>> {
>>> __data_start = . ;
>>> *(C) ... 定数データをRAMに配置するために
>>> }
>>>
>>> (3)
>>> MEMORY {
>>> ram(rwx) : o = 0x00001050, l = 0x00019000
>>> }
>>> SECTIONS {
>>> .text :
>>> {
>>> *(.start1)
>>> *(.start2)
>>> } >rom
>>> __idata_start = . ;
>>> .data   :  AT(__idata_start)
>>> {
>>> __data_start = . ;
>>> *(C) ... 定数データをRAMに配置するために
>>> }
>>>
>>> (4)
>>> MEMORY {
>>> ram(rwx) : o = 0x00000000, l = 0x00019000
>>> }
>>> SECTIONS {
>>> .text :
>>> {
>>> *(.start1)
>>> *(.start2)
>>> } >rom
>>> __idata_start = . ;
>>> .data   :  AT(__idata_start)
>>> {
>>> __data_start = . ;
>>> *(C) ... 定数データをRAMに配置するために
>>> }
>>>
>>> (2)の結果 make dependは通るがmakeのcfg -pass 3でエラーになる。
>>>
>>> rx-elf-gcc  -falign-functions=2 -Wall -g -O2 -mlittle-endian-data
>>> -mcpu=RX600 -Wall -g -O2  -DROM_BOOT -DTOPPERS_LABEL_ASM
>>> -DTARGET_KERNEL_ASP -DSUPPORT_INET4 -DSUPPORT_ETHER -DSUPPORT_TCP
>>> -DTCP_CFG_LIBRARY -DUDP_CFG_LIBRARY -I. -I../include -I../arch -I..
>>> -I../target/aprx62n_gcc -I../tinet/netdev/if_rxe -I../tinet -nostdlib
>>> -nostdlib  -Wl,-Map=asp.map -Wl,-EL -T ../arch/rx600_gcc/release.ld -o
>>> asp.elf  \
>>>                   echos4.o    kernel_cfg_asm.o  target_serial.o
>>> rx600_uart.o   net_buf.o net_count.o net_subr.o net_timer.o  in_subr.o
>>> tinet_cfg.o route_cfg.o  ip_input.o ip_output.o ip_icmp.o
>>> tinet_target_config.o if.o ethernet.o if_ether.o if_rxe.o phy.o
>>> tcp_input.o tcp_output.o tcp_timer.o  tcp_subr.o tcp_subr_cs.o
>>> tcp_subr_ncs.o  banner.o syslog.o serial.o logtask.o  log_output.o
>>> vasyslog.o t_perror.o strerror.o   kernel_cfg.o    libtinet.a -lc
>>> libkernel.a   -lgcc
>>> rx-elf-nm -C asp.elf > asp.syms
>>> rx-elf-objcopy -O srec -S asp.elf asp.srec
>>> ../cfg/cfg/cfg --pass 3 --kernel asp -I. -I../include -I../arch -I..
>>> -I../target/aprx62n_gcc -I../tinet/netdev/if_rxe -I../tinet \
>>>                          --rom-image asp.srec --symbol-table asp.syms \
>>>                          -T ../target/aprx62n_gcc/target_check.tf
>>> --api-table ../kernel/kernel_api.csv  --cfg1-def-table
>>> ../kernel/kernel_def.csv  --cfg1-def-table
>>> ../arch/rx600_gcc/prc_def.csv echos4.cfg
>>> cfg: S-record data error
>>> Makefile:322: recipe for target `asp.elf' failed
>>> make: *** [asp.elf] Error 1
>>>
>>> (3)の結果 make dependのcfg -pass 2でエラーになる。
>>> rx-elf-gcc  -falign-functions=2 -Wall -g -O2 -mlittle-endian-data
>>> -mcpu=RX600 -Wall -g -O2  -DROM_BOOT -DTOPPERS_LABEL_ASM
>>> -DTARGET_KERNEL_ASP -DSUPPORT_INET4 -DSUPPORT_ETHER -DSUPPORT_TCP
>>> -DTCP_CFG_LIBRARY -DUDP_CFG_LIBRARY -I. -I../include -I../arch -I..
>>> -I../target/aprx62n_gcc -I../tinet/netdev/if_rxe -I../tinet -nostdlib
>>> -nostdlib  -Wl,-Map=asp.map -Wl,-EL -T ../arch/rx600_gcc/release.ld
>>> -o tinet_cfg1_out.elf \
>>>                                           tinet_cfg1_out.o
>>> rx-elf-nm -C tinet_cfg1_out.elf > tinet_cfg1_out.syms
>>> rx-elf-objcopy -O srec -S tinet_cfg1_out.elf tinet_cfg1_out.srec
>>> ../cfg/cfg/cfg --pass 2 --kernel asp --cfg1_out tinet_cfg1_out -I.
>>> -I../include -I../arch -I..  -I../target/aprx62n_gcc
>>> -I../tinet/netdev/if_rxe -I../tinet \
>>>                          -T ../tinet/tinet.tf --api-table
>>> ../tinet/tcpip_api.csv  --cfg1-def-table ../kernel/kernel_def.csv
>>> tinet_echos4.cfg
>>> cfg: error: magic number is not found in `tinet_cfg1_out.srec/.syms'
>>> cfg: fatal error
>>> ../tinet/Makefile.tinet:359: recipe for target `tinet_cfg.c' failed
>>> make: *** [tinet_cfg.c] Error 1
>>>
>>> (4)の結果 make dependでリンクエラーになる。
>>> rx-elf-gcc  -falign-functions=2 -Wall -g -O2 -mlittle-endian-data
>>> -mcpu=RX600 -Wall -g -O2  -DROM_BOOT -DTOPPERS_LABEL_ASM
>>> -DTARGET_KERNEL_ASP -DSUPPORT_INET4 -DSUPPORT_ETHER -DSUPPORT_TCP
>>> -DTCP_CFG_LIBRARY -DUDP_CFG_LIBRARY -I. -I../include -I../arch -I..
>>> -I../target/aprx62n_gcc -I../tinet/netdev/if_rxe -I../tinet -nostdlib
>>> -nostdlib  -Wl,-Map=asp.map -Wl,-EL -T ../arch/rx600_gcc/release.ld
>>> -o tinet_cfg1_out.elf \
>>>                                           tinet_cfg1_out.o
>>> /usr/local/rx-elf/lib/gcc/rx-elf/4.7.1/../../../../rx-elf/bin/ld:
>>> tinet_cfg1_out.elf: Not enough room for program headers, try linking
>>> with -N
>>> /usr/local/rx-elf/lib/gcc/rx-elf/4.7.1/../../../../rx-elf/bin/ld:
>>> final link failed: Bad value
>>> collect2: error: ld returned 1 exit status
>>> ../tinet/Makefile.tinet:359: recipe for target `tinet_cfg.c' failed
>>> make: *** [tinet_cfg.c] Error 1
>>>
>>>
>>> 環境は以下です。
>>> cygwin 1.7.17-1
>>> rx-elf-gcc (GCC) 4.7.1
>>>
>>> PACKAGE asp
>>> VERSION 1.7.0
>>>
>>> PACKAGE cfg
>>> VERSION 1.6.0
>>>
>>> 以上です。