HEW

HEWで出力ファイル(mot,bin)を複数出力するには

かふぇるねにてHEW出力ファイルについて質問に回答しました。

質問の内容は「一度のビルドで複数のオブジェクトファイルを出力したい」と捉えて回答しています。また、マイコンはRXを仮定しています。

オブジェクトファイルを複数出力するには

  1. ビルドフェーズを追加する
  2. makeビルドを行い、makeファイルを編集する

の2通りのやり方があると思います。

ビルドフェーズの追加

一見するとこちらの方法が簡単そうに見ええますが、ビルドフェーズにて対応する場合はコマンドラインにて処理する必要があるため、リンカの取り扱いや環境変数の設定にある程度詳しくないと対応が困難です。

また、プロジェクトの内容(リンク条件など)が変わると当然ながら追加したビルドフェーズのメンテナンスも必要になるため、おすすめできません。

makeファイルでビルド

推奨する方法はこちらです。makeファイルの記述方法を理解されている方はゴリ押しで行けますし、分からない場合は以下の方法で差分を取って記述します。

  1. makeファイルの出力(mot)
  2. 対象となるプロジェクトのリンカ出力設定からモトローラ形式である事を確認します。
    hwo02
    続いてmot出力条件でのmakeファイルを作成します。
    hwo01
    hwo03
    今回はファイル名を「プロジェクト名_コンフィギュレーション名_mot.mak」としました。makeファイルはプロジェクトフォルダの直下に作成されます。

  3. makeファイルの出力(bin)
  4. 続いてリンカ出力設定をバイナリ形式に変更し、もう一度makeファイルを出力します。
    hwo04
    hwo05
    こちらはファイル名を「プロジェクト名_コンフィギュレーション名_bin.mak」としました。

  5. makeファイルの比較
  6. まずはmakeファイルが出力されているか確認します。
    hwo07
    プロジェクト名:make、コンフィギュレーション名:Debugであることから、「make_Debug_mot.mak」「make_Debug_bin.mak」の両ファイルが存在していることが確認できました。

    続いて内容を比較します。
    hwo06
    makeファイル上の相違点はリンカの「出力するファイル名」と「出力フォーマット」のみです。

  7. makeファイルの編集
  8. では実際に編集します。編集ファイルは「make_Debug_mot.mak」をベースとして差分を記述し、「make_Debug.mak」に保存します。

    ################################################
    # Make file generated by HEW
    #
    
    ############################
    # Toolchain directory define
    # If incorrect, change to the location of the RX Standard Toolchain toolchain
    TC_INSTALL_DIR = c:\program files (x86)\renesas\hew_001\tools\renesas\rx\1_2_1
    
    #####################################################
    #
    # Details:
    #   Project: make
    #   Configuration: Debug
    #   Toolchain: Renesas RX Standard Toolchain
    #
    #####################################################
    
    ################
    # Main Defines
    
    # Renesas RX C/C++ Library Generator01 phase
    
    MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXE=lbgrx.exe
    MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR=$(TC_INSTALL_DIR)\bin
    MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_OUTFILESC0="Debug\make.lib"
    MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_DEPFILESC0="$(TC_INSTALL_DIR)\bin\libinc_C89.pak"
    
    # Renesas RX C/C++ Compiler02 phase
    
    MAKE_DEBUG_RX_CC_COMPILER02_EXE=ccrx.exe
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC0="Debug\dbsct.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC0="typedefine.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC1="Debug\lowsrc.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC1="$(TC_INSTALL_DIR)\include\string.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\sys\yvals.h" \
        "$(TC_INSTALL_DIR)\include\stdarg.h" "$(TC_INSTALL_DIR)\include\errno.h" "$(TC_INSTALL_DIR)\include\stdio.h" \
        "$(TC_INSTALL_DIR)\include\stddef.h" "lowsrc.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC2="Debug\sbrk.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC2="$(TC_INSTALL_DIR)\include\stddef.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\sys\yvals.h" \
        "$(TC_INSTALL_DIR)\include\stdarg.h" "$(TC_INSTALL_DIR)\include\errno.h" "$(TC_INSTALL_DIR)\include\stdio.h" \
        "typedefine.h" "sbrk.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC3="Debug\intprg.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC3="$(TC_INSTALL_DIR)\include\machine.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\builtin.h" \
        "vect.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC4="Debug\vecttbl.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC4="vect.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC5="Debug\resetprg.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC5="$(TC_INSTALL_DIR)\include\machine.h" "$(TC_INSTALL_DIR)\include\macro.h" "$(TC_INSTALL_DIR)\include\builtin.h" \
        "$(TC_INSTALL_DIR)\include\_h_c_lib.h" "typedefine.h" "stacksct.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC6="Debug\hwsetup.obj"
    MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC6="iodefine.h"
    MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC7="Debug\make.obj"
    
    # Renesas RX Assembler03 phase
    
    MAKE_DEBUG_RX_ASSEMBLER03_EXE=asrx.exe
    MAKE_DEBUG_RX_ASSEMBLER03_OUTFILESC0="Debug\lowlvl.obj"
    
    # Renesas OptLinker04 phase
    
    MAKE_DEBUG_OPTLINKER04_EXE=LnkSpawn.exe
    MAKE_DEBUG_OPTLINKER04_INFILESC0="Debug\dbsct.obj" "Debug\hwsetup.obj" "Debug\intprg.obj" "Debug\lowlvl.obj" "Debug\lowsrc.obj" \
        "Debug\make.lib" "Debug\make.obj" "Debug\resetprg.obj" "Debug\sbrk.obj" "Debug\vecttbl.obj"
    MAKE_DEBUG_OPTLINKER04_OUTFILESC0="Debug\make.mot" "Debug\make.abs" "Debug\make.map"
    MAKE_DEBUG_OPTLINKER04_OUTFILESC1="Debug\make.bin" "Debug\make.abs"
    
    #######################
    # nmake "all" statement
    
    ALL:    MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_ENVC0 \
        $(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_OUTFILESC0) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC0) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC1) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC2) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC3) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC4) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC5) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC6) \
        $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC7) \
        $(MAKE_DEBUG_RX_ASSEMBLER03_OUTFILESC0) \
        $(MAKE_DEBUG_OPTLINKER04_OUTFILESC0) \
        $(MAKE_DEBUG_OPTLINKER04_OUTFILESC1)
    
    ####################
    # Description blocks
    
    !MESSAGE
    !MESSAGE Executing Renesas RX C/C++ Library Generator01 phase
    !MESSAGE
    
    MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_ENVC0 : 
        set INC_RX=$(TC_INSTALL_DIR)\include
        set PATH=$(TC_INSTALL_DIR)\bin
        set BIN_RX=$(TC_INSTALL_DIR)\bin
        set TMP_RX=C:\Users\kon-n\AppData\Local\Temp
    
    $(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_OUTFILESC0) : $(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_DEPFILESC0)
        "$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR)\$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXE)" -subcommand=<<
    -cpu=rx600
    -endian=big
    -dbl_size=8
    -signed_char
    -bit_order=left
    -int_to_short
    -exception
    -fint_register=1
    -base=rom=R12,ram=R11
    -output="Debug\make.lib"
    -head=runtime,ctype,math,stdarg,stdio,stdlib,string
    <<
    
    !MESSAGE
    !MESSAGE Executing Renesas RX C/C++ Compiler02 phase
    !MESSAGE
    
    $(MAKE_DEBUG_RX_CC_COMPILER02_OUTFILESC0) : "dbsct.c" $(MAKE_DEBUG_RX_CC_COMPILER02_DEPFILESC0)
        "$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR)\$(MAKE_DEBUG_RX_CC_COMPILER02_EXE)" -subcommand=<<
    -cpu=rx600
    -endian=big
    -dbl_size=8
    -signed_char
    -bit_order=left
    -int_to_short
    -fint_register=1
    -base=rom=R12,ram=R11
    -lang=c
    -output=obj="Debug\dbsct.obj"
    -debug
    "dbsct.c"
    -nologo
    <<
    
    ~以降、コンパイラフェーズ略~
    
    !MESSAGE
    !MESSAGE Executing Renesas RX Assembler03 phase
    !MESSAGE
    
    $(MAKE_DEBUG_RX_ASSEMBLER03_OUTFILESC0) : "lowlvl.src"
        "$(MAKE_DEBUG_RX_CC_LIBRARY_GENERATOR01_EXEDIR)\$(MAKE_DEBUG_RX_ASSEMBLER03_EXE)" -subcommand=<<
    "lowlvl.src"
    -cpu=rx600
    -endian=big
    -fint_register=1
    -base=rom=R12,ram=R11
    -debug
    -output="Debug\lowlvl.obj"
    -nologo
    <<
    
    !MESSAGE
    !MESSAGE Executing Renesas OptLinker04 phase
    !MESSAGE
    
    $(MAKE_DEBUG_OPTLINKER04_OUTFILESC0) : $(MAKE_DEBUG_OPTLINKER04_INFILESC0)
        $(MAKE_DEBUG_OPTLINKER04_EXE) -subcommand=<<
    noprelink
    rom D=R,D_1=R_1,D_2=R_2
    nomessage 
    list "Debug\make.map"
    nooptimize
    -start=B_1,R_1,B_2,R_2,B,R,SU,SI/01000,PResetPRG/0FFFF8000,C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FFFF8100,FIXEDVECT/0FFFFFFD0
    nologo
    -input="Debug\dbsct.obj"
    -input="Debug\hwsetup.obj"
    -input="Debug\intprg.obj"
    -input="Debug\lowlvl.obj"
    -input="Debug\lowsrc.obj"
    -input="Debug\make.obj"
    -input="Debug\resetprg.obj"
    -input="Debug\sbrk.obj"
    -input="Debug\vecttbl.obj"
    -library="Debug\make.lib"
    -output="Debug\make.abs"
    end
    -input="Debug\make.abs"
    form stype
    output "Debug\make.mot"
    <<
    
    $(MAKE_DEBUG_OPTLINKER04_OUTFILESC1) : $(MAKE_DEBUG_OPTLINKER04_INFILESC0)
        $(MAKE_DEBUG_OPTLINKER04_EXE) -subcommand=<<
    noprelink
    rom D=R,D_1=R_1,D_2=R_2
    nomessage 
    nooptimize
    -start=B_1,R_1,B_2,R_2,B,R,SU,SI/01000,PResetPRG/0FFFF8000,C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FFFF8100,FIXEDVECT/0FFFFFFD0
    nologo
    -input="Debug\dbsct.obj"
    -input="Debug\hwsetup.obj"
    -input="Debug\intprg.obj"
    -input="Debug\lowlvl.obj"
    -input="Debug\lowsrc.obj"
    -input="Debug\make.obj"
    -input="Debug\resetprg.obj"
    -input="Debug\sbrk.obj"
    -input="Debug\vecttbl.obj"
    -library="Debug\make.lib"
    -output="Debug\make.abs"
    end
    -input="Debug\make.abs"
    form binary
    output "Debug\make.bin"
    -exit
    
    <<
    

    ハイライト箇所が追加、修正したところになります。

    修正コンセプトは「既存リンカ(mot出力)を活かし、同一フェーズ(リンカフェーズ)で複数オブジェクトを出力する」です。
    よって、リンカが参照するINPUTFILEは共通にしています。また、1回目のリンカ処理でmapは出力しているので2回目のリンカ処理では省いています。内容がよく分からない場合は、「ふんふん、そうやるのか」程度でいいと思います。

  9. makeビルドに切り替え
  10. makeファイルができたらHEWビルドからmakeビルドに変更します。以下の手順で行ってください。
    hwo08
    hwo09
    「makeファイルを使ったビルド」にチェックを付け、今回作成したmakeファイルを指示してください。

  11. ビルド結果の確認
  12. 初回は必ず「BUILD ALL」をかけてください。2回目以降は通常BUILDでも構いません。
    hwo10
    ビルドが無事成功しました。Warnningはいくつか出ていますが問題となる内容ではありませんでした。
    ファイルを確認します。
    hwo11
    motとbinの両方が同時(更新日時が同じ)に作成されています。

セクション情報を追加、移動、削除を行った場合や、コンパイル対象の増減があった場合にはmakeファイルをメンテナンスする必要があります。
それでもビルドフェーズを追加する方法よりは手間が少なくて済みますのでお試しください。

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!