2.3K Views
June 15, 22
スライド概要
技術書典10(2020年12月)に書いた技術書です。
https://techbookfest.org/product/4581772882870272?productVariantID=5309574368198656
プログラミング言語の学習を始める時、最初の壁が「開発環境構築」と感じた経験はありませんか?
本来、プログラミング言語で実現したいこと・学習したいことがあったけど、
開発環境が構築できずに挫折し、断念した経験はありませんか?
私は何度も挫折した経験があります。
その度に
「自分がやりたかったことは開発環境構築ではなく、xxx 言語を使ってxxx を実現したり、
学習したかっただけなんだけどな。そのスタート地点にも立 てないのか・・・。」
と、虚無感を感じていました。
今回、自身何度目かのチャレンジで GCC で C 言語を機械語に変換できるまで到達できたので情報共有したいと考えました。
既に GCC を使いバリバリ開発している人向けではなく、GCC を使ってこれから開発する人・興味ある人向けの本と考えています。
本書は 2 つの観点で書きました。
前半は GCC 開発環境構築の手順とそこから得た学び。
後半は既存 C 言語ソースコードをGCC 対応するための変更点について書きました。
この本が前述の GCC を使ってこれから開発する人・興味ある人に何かお役にたてば嬉しいです。
組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 CQ EVカートのオーナーで、ハード・ソフトウェアの改造を通じて自身のスキルアップを日々考え中・・・。 LAPRASポートフォリオ: https://lapras.com/public/k-abe GitHub: http://github.com/grace2riku Qiita: https://qiita.com/juraruming Zenn: https://zenn.dev/k_abe よろしくね。
GCC 開発環境構築入門 (EV カート編) k-abe 2020-12-26 版 著 k-abe 発行
前書き GCC とは GNU Compiler Collection(グニューコンパイラコレクショ ン)の略称で、プログラム言語を機械語に変換する際に使用するツール群で す。 プログラミング言語の学習を始める時、最初の壁が「開発環境構築」と感じ た経験はありませんか? 本来、プログラミング言語で実現したいこと・学習したいことがあったけ ど、開発環境が構築できずに挫折し、断念した経験はありませんか? 私は何度も挫折した経験があります。 その度に 「自分がやりたかったことは開発環境構築ではなく、xxx 言語を使って xxx を実現したり、学習したかっただけなんだけどな。そのスタート地点にも立 てないのか・・・。」 と、虚無感を感じていました。 今回、自身何度目かのチャレンジで GCC で C 言語を機械語に変換でき るまで到達できたので情報共有したいと考えました。 既に GCC を使いバリバリ開発している人向けではなく、GCC を使ってこ れから開発する人・興味ある人向けの本と考えています。 本書は 2 つの観点で書きました。 前半は GCC 開発環境構築の手順とそこから得た学び。 後半は既存 C 言語ソースコードを GCC 対応するための変更点について書 iii
きました。 この本が前述の GCC を使ってこれから開発する人・興味ある人に何かお役 にたてば嬉しいです。 免責事項 本書に記載された内容は、情報の提供のみを目的としています。したがっ て、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって 行ってください。これらの情報による開発、製作、運用の結果について、著 者はいかなる責任も負いません。 iv
目次 前書き iii 免責事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第1章 iv はじめに 1 開発対象 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 開発環境概要 3 2.1 GCC と統合開発環境の比較 . . . . . . . . . . . . . . . . . 3 2.2 統合開発環境の例 . . . . . . . . . . . . . . . . . . . . . . 3 2.3 GCC, 統合開発環境のメリット、デメリット . . . . . . . . 4 2.4 本書を書いた背景 5 1.1 第2章 第3章 . . . . . . . . . . . . . . . . . . . . . . GCC 開発環境構築手順 7 3.1 開発環境のバージョン決定 . . . . . . . . . . . . . . . . . . 7 3.2 開発環境ソースコードの取得 . . . . . . . . . . . . . . . . 9 3.3 開発環境ソースコードのコンパイル . . . . . . . . . . . . . 9 3.3.1 トラブル 1: GMP, MPFR ライブラリ必要問題 . . . 11 3.3.2 トラブル 2: 新しいコンパイラでコンパイルした時 のエラー対応 . . . . . . . . . . . . . . . . . . . . . 12 結局、開発環境構築はどうしたか? . . . . . . . . . 13 インストール . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.3.3 3.4 v
目次 動作確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 既存ソースコードの GCC 対応 15 4.1 スタートアップファイルの作成 . . . . . . . . . . . . . . . 15 4.2 割り込みハンドラの定義 . . . . . . . . . . . . . . . . . . . 16 4.3 割り込み発生時のレジスタ退避、復帰 . . . . . . . . . . . . 16 4.4 ペリフェラルレジスタの定義 . . . . . . . . . . . . . . . . 17 4.5 自動生成コード部分をコーディング . . . . . . . . . . . . . 17 4.6 エミュレータ依存コードの作成 . . . . . . . . . . . . . . . 18 4.7 リンカスクリプトの作成 . . . . . . . . . . . . . . . . . . . 19 4.8 Makefile の作成 . . . . . . . . . . . . . . . . . . . . . . . 19 4.8.1 make、make clean . . . . . . . . . . . . . . . . . 19 4.8.2 コンバーター . . . . . . . . . . . . . . . . . . . . . 22 4.9 フラッシュプログラミング環境 . . . . . . . . . . . . . . . 22 4.10 デバッグ環境 . . . . . . . . . . . . . . . . . . . . . . . . . 23 第5章 まとめ 29 第6章 参考書籍 31 3.5 第4章 著者紹介 vi 33
第1章 はじめに 前書きに書きましたが自身何度目かのチャレンジで GCC で C 言語を機 械語に変換できました。とはいえ全てを GCC で開発をしていた訳ではあり ません。既に半導体メーカの統合開発環境で C 言語のソースコードがあり ました。既存の統合開発環境・C 言語のソースコードを GCC に移行してい きました。 1.1 開発対象 開発対象のハードウェア、既存の統合開発環境は次の通りです。 • 開発対象:CQ EV カート • 開発環境:ルネサスエレクトロニクス社製 CS+/ソースコード自動生 成ツール (Applilet2 for V850ES/Fx3) • 対象マイコン:ルネサスエレクトロニクス社製 V850ES/FG3 開発対象の CQ EV カートは CQ 出版社から発売されている購入者自身 で組み立て可能なカートキットです。下記リンクのカート本体とモーター・ インバーターキットを組み合わせることで走行可能な EV カートを製作でき ます。 1
第 1 章 はじめに 1.1 開発対象 • カート本体 - https://shop.cqpub.co.jp/hanbai/books/I/I000255.html • ブラシレス・モーター & インバーター・キットセット - https://shop.cqpub.co.jp/hanbai/books/I/I000055.htm 私が書いた技術書 (参考書籍 No.1) に概要、制御方法を記載していますの でご興味ある方は参照ください。 CQ EV カートの制御マイコン (V850ES/FG3)、統合開発環境 (CS+) と もにルネサスエレクトロニクス社製です。特徴としてマイコンのペリフェ ラルを制御するコードはソースコード自動生成ツールで出力していました。 GCC 移行前は CS+ で開発を進めていました。今回、CS+ から GCC に開 発環境を移行しました。 2
第2章 開発環境概要 GCC と統合開発環境について比較します。 2.1 GCC と統合開発環境の比較 「GCC 開発環境」はグラフィカルな操作ではなく、コンソール画面より操 作することが多いと思います。多くの設定を自身で行う必要があります。 「統合開発環境」はコンパイル、リンク、デバッグまで GUI 操作で行えま す。マイコンのピン設定をグラフィカルに設定する、コードを自動生成する などプログラムを書く・デバッグするだけに留まらず、様々な恩恵を受けら れます。統合開発環境は GCC を呼び出し使っていることもあるから GCC を含んでいるのでは?と思われる方もいると思います。本書では半導体ベン ダのコンパイラを使う、GUI で操作する開発環境を統合開発環境と呼ぶこ とにします。 2.2 統合開発環境の例 統合開発環境の例を調べてみました。 3
第 2 章 開発環境概要 2.3 GCC, 統合開発環境のメリット、デメリット • CS+*1 (無償評価版あり) ルネサスエレクトロニクス • e2 studio*2 (無償) ルネサスエレクトロニクス • STM32 Software Development Tools: *3 (無償) ST マイクロエレク トロニクス • IAR *4 (有償。無償評価版あり) IAR SYSTEMS 2.3 GCC, 統合開発環境のメリット、デメリット GCC と統合開発環境のメリット・デメリットを考えてみました。 図 2.1: GCC と統合開発環境のメリット・デメリット *1 *2 *3 *4 4 https://www.renesas.com/jp/ja/software-tool/cs https://www.renesas.com/jp/ja/software-tool/e-studio https://www.st.com/ja/development-tools/stm32-software-developmenttools.html https://www.iar.com/jp/iar-embedded-workbench/
第 2 章 開発環境概要 2.4 本書を書いた背景 2.4 本書を書いた背景 「なぜ統合開発環境から GCC に移行しようと思ったか?」ですが自己学習 のためです。GCC 移行前だと統合開発環境、ソースコード自動生成ツール を使用し開発していました。私が調べた限り自動生成したソースコードのラ イセンスが不明 (再配布して良いか不明) で、GitHub などにアップロード・ 再配布して外部の方と技術的コミュニケーションしてよいかわかりませんで した。それであれば自己学習を兼ねて統合開発環境から GCC に移行し多く の人が参照できるソースコードにしよう、と考えたのが本書を書くことに なったきっかけです。 ■コラム: ソースコード自動生成ツールのライセンス ご参考までに。 CQ EV カートのマイコン (V850ES/Fx3) ですが現在、新規採用非 推奨品となっています。 https://www.renesas.com/jp/ja/products/ microcontrollers-microprocessors/v850/v850esfx/ v850esfx3.html RL78、RX シリーズの自動生成ツールが出力したソースコードは再 配布して良いとなっています。 http://japan.renesasrulz.com/cafe_rene/f/forum21/4302/ thread 5
第3章 GCC 開発環境構築手順 GCC 開発環境構築は本章で記載する手順で作業しました。 3.1 開発環境のバージョン決定 私は TOPPERS/ASP*1 という RTOS(Real Time Operating System) に 対応させたいと考えていました。そのため、TOPPERS/ASP で使って いる開発環境を構築する方針にしました。具体的には TOPPERS/ASP CQ-V850(CQ 出版) 簡易パッケージ*2 の下記のバージョンです。 • cygwin 1.7.1(0.218/5/3) • GCC 4.3.4 • binutils 2.20 • newlib 1.18.0 • GNU make 3.8.1 上記はかなり古いバージョンです。ただ、動作確認済みのバージョンで環 境構築した方が安心、トラブルが発生しないだろうと思ったので上記バー *1 *2 https://www.toppers.jp/asp-kernel.html https://www.toppers.jp/asp-e-download.html 7
第 3 章 GCC 開発環境構築手順 3.1 開発環境のバージョン決定 ジョンにしました。しかし、この後書いている数々のトラブルがあり最終的 に次のバージョンになりました。 • cygwin 1.7.1(0.218/5/3) GCC 4.3.4 → MSYS2 • binutils 2.20 → 2.24 • newlib 1.18.0 → 2.10 • GNU make 3.8.1 → 4.3 TOPPERS/ASP のドキュメントに書いてある開発環境バージョンと異 なりますが、動作確認の結果、TOPPERS/ASP が動きました。また開発環 境ソースコードからコンパイルした開発環境ではなく、Windows 実行ファ イルで動作確認しました。よって次の章の開発環境構築手順は不要となりま した。 •「3.3 開発環境ソースコードのコンパイル」 •「3.4 インストール」 以降の章で発生したトラブルを紹介します。 ■コラム: TOPPERS/ASP CQ-V850(CQ 出版) 簡易パッ ケージの開発環境バージョンはどこに書いてある??? TOPPERS/ASP CQ-V850(CQ 出版) 簡易パッケージの開発環境 バージョンですが、パッケージを解凍し次のファイルに書いてあり ます。 • asp/target/cq_v850_gcc/target_user.txt 8
第3章 GCC開発環境構築手順 3.2 開発環境ソースコードの取得 3.2 開発環境ソースコードの取得 開発環境 cygwin、GCC、binutils、newlib、make を入手します。GCC、 binutils、newlib は脚注のリンクから入手可能です。 • GCC 4.3.4*3 • binutils 2.20*4 • newlib 1.18.0*5 make は cygwin インストール時に入手します。 3.3 開発環境ソースコードのコンパイル 開発環境をコンパイルして、実行ファイルをつくります。 参考書籍 No.2 のとおり、binutils、gcc、newlib の順に環境構築していき ます。gcc は binutils を使ってコンパイルするため、binutils を先に環境構 築する必要があります。 コンパイルは参考書籍 No.2 とほぼ同じ手順で実施できます。違いとして は次のとおりです。 • ツールのバージョン • ターゲット名称 binutils の環境構築例です。 *3 *4 *5 http://ftp.gnu.org/gnu/gcc/ http://ftp.gnu.org/gnu/binutils/ https://sourceware.org/ftp/newlib/index.html 9
第 3 章 GCC 開発環境構築手順 3.3 開発環境ソースコードのコンパイル $ cd /usr/local/v850/src/binutils-2.20 $ mkdir obj $ cd obj $ ../configure --target=v850-elf --prefix=/usr/local/v850 --disable -nls $ make ツールのバージョンによる違いですが参考書籍 No.2 の場合 binutils-2.16 を使用しているため次になります。 $ cd /usr/local/sh/src/binutils-2.16 今回は binutils-2.20 を使用するので次になります。 $ cd /usr/local/v850/src/binutils-2.20 このようにツールのバージョンによる差分があります。 ターゲット名称による違いについて説明します。今回の対象マイコン は V850 です。参考書籍 No.2 の場合、対象マイコンは SH です。後で TOPPERS/ASP に対応させたい、ということもあり TOPPERS/ASP の Makefile で使っている名称にすることにしました。具体的には v850-elf-xxx という名称です。xxx はツールにより変わります。次のような形です。 • アセンブラの場合:v850-elf-as • リンカの場合:v850-elf-ld • objcopy の場合:v850-elf-objcopy 10
第 3 章 GCC 開発環境構築手順 3.3 開発環境ソースコードのコンパイル 上記の理由により--target オプションを v850-elf にします。 $ ../configure --target=v850-elf --prefix=/usr/local/v850 --disable また、v850 ツールを格納するので/usr/local 配下のディレクトリは v850 という名称にします。 3.3.1 トラブル 1: GMP, MPFR ライブラリ必要問題 GCC のコンパイルをすると次のエラーが出力されました。 configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.0+. 調査すると GCC バージョン 4.xx から GMP, MPFR のライブラリが必 要になったためでした。 • GMP:高精度の数値計算 • MPFR:任意精度の浮動小数点演算 GMP, MPFR のライブラリが必要と言われても具体的にどうすればよい かわかりませんでした。この件は対応方法を調査・対応し、エラーメッセー ジを解消しましたが、本質的なことをやっていないと感じていました。作成 するソフトでは GMP、MPFR の機能を使わないのに何故、開発環境を構築 する際に GMP、MPFR をリンクしないといけないのかと思ったからです。 11
第 3 章 GCC 開発環境構築手順 3.3 開発環境ソースコードのコンパイル 3.3.2 トラブル 2: 新しいコンパイラでコンパイルした時のエ ラー対応 GCC のコンパイルをすると次のエラーが出力されました。 coffgen.c:2010:8: エラー: this statement may fall through [-Werror=implicit-fallthrough=] if (ISFCN (combined->u.syment.n_type)) ^ coffgen.c:2028:3: 備考: here default: 上のメッセージは何がエラー原因かわかりますか? これは GCC7 から追加された「switch 文に break を記載漏れ」の「フォー ルスルー」が原因でエラーになっています。フォールスルーについては次の リンクに詳しい説明があります。 ・https://qiita.com/kzrashi/items/9123dd8c8163ac22aa52 ・https://developers.redhat.com/blog/2017/03/10/wimplicit-fallthrough- in-gcc-7/ GCC4.3.21 をコンパイルするときに GCC7 以上の C++ コンパイラを 使ったためフォールスルーの警告を検出したようです。警告の検出でコ ンパイルエラーになるよう設定されていました (-Werror を指定)。ここで TOPPERS/ASP は何故、エラーが発生する GCC バージョン (4.3.21) を開 発環境として明記していたかという疑問がでてきました。これは GCC7 未 満で GCC4.3.21 をコンパイルしていたため、エラーなくコンパイルできて いたと推測しました。このトラブルから得た学びは、マイコンターゲットの GCC をコンパイルするホスト環境の GCC バージョンにも気をつける必要 がある、ということです。フォールスルーのエラー対応として、次の 2 通り 12
第 3 章 GCC 開発環境構築手順 3.4 インストール の対策が考えられます。 • GCC ソースコードの修正 • コンパイルオプションの修正 (-Werror を削除) 対策はありますが私は対策する気がなくなり*6 ソースコードのコンパイル からの開発構築をあきらめました。GCC をコンパイルして環境構築から開 発環境の実行ファイルだけ入手できないか、という考えに変わっていきま した。 3.3.3 結局、開発環境構築はどうしたか? 前述したトラブルもありソースコードをコンパイルして開発環境構築する ことは諦めました。開発環境の実行ファイルのみを入手できるか調査を進め ていたところ該当するツールが見つかりました。それが次のツールでした。 • Renesas V850 Toolchain v14.01*7 このツールを使った開発環境構築手順については参考までに次のブログに 書きました。 https://k-abe.hatenablog.com/entry/2020/12/07/232927?_ga= 2.47568871.1374746879.1608476392-1635837165.1608278331 3.4 インストール make 実行後に make install を実行することでコンパイルでできた開発環 境が所定の場所にインストール (コピー) できます。 *6 修正量が多い、修正後にもぐらたたきのように同様のトラブルが起きることを想像する とやる気がなくなってしまいました。私のマシン環境ではコンパイルに非常に時間がか かることも要因です。 *7 https://gcc-renesas.com/ja/v850/v850-download-toolchains/ 13
第 3 章 GCC 開発環境構築手順 3.5 動作確認 3.5 動作確認 よく web で見かける開発環境構築の確認ですが、「ツールのバージョン表 示」を確認していることが多いと思います。コンパイルして実行ファイル ができたか?はツール自体の確認です。ツールのバージョン表示ができたら 環境構築は正常に行われた (インストールまでできた) と判断できると思い ます。 14
第4章 既存ソースコードの GCC 対応 GCC 開発環境構築できた後は既存開発環境の CS+ で作ったソースコー ドを修正していきます。具体的には次に示すような開発環境、コンパイル依 存の記述を GCC 向けに修正していきます。GCC 版のソースコードは Git Hub*1 にアップロードしているので適宜参照してください。 4.1 スタートアップファイルの作成 スタートアップファイルはマイコンがリセットしてから C 言語の main 関 数にジャンプするまでの処理が書かれています。CS+ ではプロジェクト作 成時に CS+ デフォルトのスタートアップファイルを使っていました。GCC 版では CS+ のスタートアップファイルを使うこともできそうでしたが次の 理由で TOPPERS/ASP のスタートアップファイルを使うことにしました。 • CS+ スタートアップファイルは初期値付き変数の ROM → RAM コ ピーをコンパイラの組込み関数で実行している。 *1 https://github.com/grace2riku/cq-ev-kart-gcc.git 15
第 4 章 既存ソースコードの GCC 対応 4.2 割り込みハンドラの定義 GCC 版はアセンブラコードで初期値付き変数の ROM → RAM コピー を実行している。 CS+ の組込み関数は GCC にない。 • TOPPERS/ASP で V850 用のスタートアップファイルが既にあっ たため流用する。 GCC 版該当ソースコードは次のファイルです。 • start.S 4.2 割り込みハンドラの定義 CS+ と GCC 版では割り込みハンドラ定義が変わっています。 • CS+ は#pragma interrupt キーワードで割り込みハンドラを定義 • GCC 版は#pragma interrupt キーワードは使わない GCC 版該当ソースコードは次のファイルです。 • interrupt_vector.S 4.3 割り込み発生時のレジスタ退避、復帰 CS+ は割り込み発生時のレジスタ退避、割り込み復帰時のレジスタ退避 などの処理をコーディングしていません (コンパイラでレジスタ退避・復帰 のコードを出力している)。GCC 版は割り込み発生時のレジスタ退避、割り 込み復帰時のレジスタ退避などの処理がコーディングされています。 16
第 4 章 既存ソースコードの GCC 対応 4.4 ペリフェラルレジスタの定義 GCC 版該当ソースコードは次のファイルです。 • interrupt.S interrupt は割り込み入り口の処理でレジスタ退避している。 end_int_handler は割り込み出口の処理でレジスタ復帰している。 4.4 ペリフェラルレジスタの定義 CS+ はペリフェラルレジスタのアドレス定義が不要で、マイコンハード ウェアマニュアルに記載しているレジスタ名を書けば該当レジスタにリー ド・ライトできます (コーディング時にレジスタのアドレスを意識しない)。 GCC 版は CS+ のような支援はないのでレジスタのアドレス定義を書いて います。 GCC 版該当ソースコードは複数ありますが一例を紹介します。 • port.h IO ポートのレジスタアドレスを定義している。 #define PMDLH #define PDLH (*(volatile unsigned char*)0xFFFFF025) (*(volatile unsigned char*)0xFFFFF005) CS+ だと PMDLH と書けば指定アドレスにアクセスできますが、GCC だと上の例のようにマクロでアドレス定義するなどの対応が必要です。 4.5 自動生成コード部分をコーディング CS+ は自動生成コードを利用しペリフェラルレジスタにアクセス・制御 しています。GCC 版は自動生成コードを利用しないです。そのためペリ 17
第 4 章 既存ソースコードの GCC 対応 4.6 エミュレータ依存コードの作成 フェラルレジスタへのアクセス・制御をコーディングしました。 GCC 版該当ソースコードは複数ありますが一例を紹介します。 • clock.c: クロック初期化 clock_init() • ad.c: AD 機能初期化 AD0_init(), AD 変換値取得 get_ad_value() 4.6 エミュレータ依存コードの作成 v850 は E1 エミュレータ*2 でプログラムのダウンロード、書き込み、デ バッグをおこないます。 E1 エミュレータはマイコンの ROM・RAM 領域を使い、オンチップデ バッグします。そのためオンチップデバッグする場合は CS+ で対応してい たのと同様 GCC でも参考書籍 No.3 の次に示す対応が必要になります。 • 3.1 セキュリティ ID の設定 • 3.3 デバッグ用メモリ空間の確保 セキュリティ ID の設定は GCC 版該当ソースコード次になります。 • interrupt_vector.s: security_id でセキュリティ ID 10 バイトを 0xFF にしています。 デバッグ用メモリ空間の確保は GCC 版該当ソースコード次になります。 • e1_debug_memory_alloc.S: ROM・RAM メモリ領域の確保をして います。 • v850fg3.ld: ROM・RAM メモリ領域のアドレス割り付けをしてい ます。 *2 18 https://www.renesas.com/jp/ja/software-tool/e1-emulator-r0e000010kce00discontinued-product
第4章 既存ソースコードのGCC対応 4.7 リンカスクリプトの作成 4.7 リンカスクリプトの作成 CS+ はリンカスクリプトという名称ではなく、リンクディレクティブ ファイルという名称です。CS+ と GCC 版でリンカスクリプトの記述が異 なります。CS+ のリンクディレクティブファイルが GCC でも適用できリ ンクできるか試していませんが、汎用的なリンクスクリプトの書き方にし ます。 GCC 版該当リンカスクリプトは次のファイルです。 • v850fg3.ld 4.8 Makefile の作成 ソースコードを作ったらコンパイルのルールを書きます。CS+ では GUI の直感的操作でコンパイル対象ソースコードを追加していく形だったのでコ ンパイルルールを意識しませんでした。GCC の CUI 環境下ではコンパイ ルのルールも自分で書かなければいけません。Makefile にコンパイルルー ルを書きました。 4.8.1 make、make clean あまり高度なことはしておらず各ソースコードのコンパイルルールを書い ています。 コンパイルルールの一例を引用します。 start.o: start.S $(CC) -c $(CFLAGS) start.S 19
第4章 既存ソースコードのGCC対応 4.8 Makefileの作成 main.o: main.c $(CC) -c $(CFLAGS) main.c オ ブ ジ ェ ク ト フ ァ イ ル (*.o) を ALL_OBJS に 列 挙 し て い ま す 。 ALL_OBJS から OBJFILE(ファイル名でいうと cq-ev-kart) を作るルー ルを書いています。 $(OBJFILE): $(ALL_OBJS) $(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) $(ALL_OBJS) $(NM) -n $(OBJFILE) > $(OBJNAME).syms $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec 結果、make コマンドを実行すると次のファイルが出力されます。 • オブジェクトファイルのリンクで実行ファイル (elf 形式) の作成 • シンボル情報をファイル化 • モトローラ S レコードファイルの作成 次は make コマンド実行の画面表示です。 $ make v850-elf-gcc -c -mv850e main.c v850-elf-gcc -c -mv850e interrupt_vector.S v850-elf-gcc -c -mv850e interrupt.S v850-elf-gcc -c -mv850e nop_interrupt.c v850-elf-gcc -c -mv850e 20 -mdisable-callt -g -Wall -O2 -I. -mdisable-callt -g -Wall -O2 -I. -mdisable-callt -g -Wall -O2 -I. -mdisable-callt -g -Wall -O2 -I. -mdisable-callt -g -Wall -O2 -I.
第4章 既存ソースコードのGCC対応 4.8 Makefileの作成 clock.c v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. system_init.c v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. port.c v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. e1_debug_memory_alloc.S v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. timer.c v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. ad.c v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. motor.c v850-elf-gcc -c -mv850e -mdisable-callt -g -Wall -O2 -I. serial.c v850-elf-gcc -mv850e -mdisable-callt -g -Wall -O2 -I. -nostartfiles -lgcc -lc -msoft-float -T v850fg3.ld -o cq-ev-kart start.o main.o interrupt_vector.o interrupt.o nop_interrupt.o clock.o system_init.o port.o e1_debug_memory_alloc.o timer.o ad.o motor.o serial.o v850-elf-nm -n cq-ev-kart > cq-ev-kart.syms v850-elf-objcopy -O srec -S cq-ev-kart cq-ev-kart.srec make コマンドの他に make clean コマンドを書いています。 clean: rm -f *.o rm -f $(OBJFILE) $(OBJNAME).syms $(OBJNAME).srec make clean コマンドを実行すると make コマンドで作成されたファイル を削除します。次は make clean コマンド実行の画面表示です。 21
第 4 章 既存ソースコードの GCC 対応 4.9 フラッシュプログラミング環境 $ make clean rm -f *.o rm -f cq-ev-kart cq-ev-kart.syms cq-ev-kart.srec 4.8.2 コンバーター マイコンに書き込むファイルはモトローラ S レコード形式にしています。 具体的には Makefile の次の行で実行ファイルを変換しています。 • $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec -O srec オプション指定でモトローラ S レコードファイルになります。 4.9 フラッシュプログラミング環境 作成したモトローラ S レコードファイルをフラッシュプログラミングツー ル*3 でマイコンに書き込みます。とくにフラッシュプログラミングするため に必要なソースコードの修正はありません。CS+ と同じフラッシュプログ ラミングツールで書き込みをおこないます。 図 4.1 がフラッシュプログラミングツールの画面です。 *3 22 https://www.renesas.com/jp/ja/software-tool/renesas-flash-programmerprogramming-gui
第 4 章 既存ソースコードの GCC 対応 4.10 デバッグ環境 図 4.1: Renesas Flash Programmer 4.10 デバッグ環境 デバッグツールとして GDB がありますが、今回は CS+ をデバッグツー ルとして使おうと考えました。 結論を書くとデバッグは確認できていません。実行モジュールをマイコン にダウンロードしている途中で CS+ が強制終了する、という状況です。恐 23
第 4 章 既存ソースコードの GCC 対応 4.10 デバッグ環境 らくデバッグのための設定が間違っている、不足しているのだと思います。 GCC 環境だと GDB でデバッグするのが一般的なのでしょうか。CS+ は elf 形式のファイルをマイコンにダウンロード、デバッグできるそうなので、 デバッグ環境として使います。 コンパイルは GCC 環境、デバッグは CS+ という合わせ技で開発をしよ うとしています。CS+ でデバッグのみをおこなうプロジェクトを作成しま す (コンパイル・リンクはしない)。 図 4.2 が CS+ デバッグプロジェクトの接続用設定画面です。 図 4.2: CS+ 接続用設定 クロック、セキュリティ ID、E1 エミュレータとの接続方式などを設定し ます。 図 4.3 が CS+ デバッグプロジェクトのデバッグ・ツール設定画面です。 24
第 4 章 既存ソースコードの GCC 対応 4.10 デバッグ環境 図 4.3: CS+ デバッグ・ツール設定 実行中のメモリ・アクセスなどを設定します。 図 4.4 が CS+ デバッグプロジェクトのダウンロード・ファイル設定画面 です。 25
第 4 章 既存ソースコードの GCC 対応 4.10 デバッグ環境 図 4.4: CS+ ダウンロード・ファイル設定 ダウンロードファイル、スタートアップファイルの開始シンボルなどを設 定します。 図 4.5 が CS+ デバッグプロジェクトのフック設定画面です。 26
第 4 章 既存ソースコードの GCC 対応 4.10 デバッグ環境 図 4.5: CS+ フック設定 デバッグ開始前後で行う処理などを設定します。今回はとくに設定してい ません。 27
第5章 まとめ 開発環境構築し感じたことです。 • 情報の精査が重要 Web で先人の方が開発環境を構築した事例などを調査し、実際に環境構 築していきました。いつ、どのバージョンを使ったか、各種ツールのバー ジョンの組み合わせを正確に把握することが重要だと感じました。開発環境 構築できるという確信をもったうえで作業することが出戻りなく環境構築で きるポイントかと思いました。私が開発環境構築する際に参考にしたサイ ト・書籍を本書の最後に記載するのでよければ参照ください。良い情報を初 めから入手して皆様が開発環境構築する際のヒントになれば嬉しいです。 • 開発環境構築、一度は試してみることをオススメします。 当初の計画通りに開発環境が構築できれば良かったですができませんでし た。ソースコードからの開発環境構築はうまくいきませんでしたが、一度は 開発環境を構築してみることをおすすめします。うまくいかないこともある かもしれませんがそこで新たな学びがあることも事実です。私の今回の学び は前述のフォールスルーでした。 29
第6章 参考書籍 1. EV カートで始めるモデルベース開発, k-abe https://techbookfest.org/product/6581675934875648?productVariantID= 5815321967460352 第 1 章 EV カートとは何か?に EV カートの概要、制御方法について記載し ている。 2. https://www.bitran.co.jp/ice/develop/compiler.html 開発環境構築全体の流れがわかる。SH マイコン用 gcc の開発環境を構築し ている。ツールバージョン・マイコン依存部分の記述を変更すれば SH マイ コン以外にも流用できる。 3. E1/E20 エミュレータ ユーザーズマニュアル 別冊 Rev.1.00 2012.02, ルネサスエレクトロニクス 4. 組込み技術者向け「初めての C 言語」 開発環境構築、スタートアップから main 関数に辿り着く前までの処理、 リンクスクリプトについて非常に丁寧にわかりやすく書かれている。 http://www.ertl.jp/~takayuki/readings/c/index.html 31
第 6 章 参考書籍 5. 大熱血! アセンブラ入門, 坂井弘亮 著 https://www.shuwasystem.co.jp/book/9784798051543.html 50 種類に及ぶアセンブラが解説されている。 アセンブラ解説の他に開発環境構築についても書かれているので重宝して いる。下記、サポートページと合わせて活用すると良いと思う。 http://kozos.jp/books/asm/index.html 32
著者紹介 k-abe 既刊の技術書: • 技術書典 9 EV カートで始めるモデルベース開発*1 twitter: @juraruming ブログ: https://k-abe.hatenablog.com/ GitHub: https://github.com/grace2riku slideshare: https://www2.slideshare.net/KoujiAbe 1980 年生まれ、2002 年より組込みソフトウェアエンジニアとしてキャリ アをスタート。C 言語、ベアメタルの組込みソフトウェア開発がキャリアの 大半を占める。 EV カートとの出会いは発売時の 2013 年 12 月から。EV カートは機械、 電気、組込みソフト、IT と色々な要素技術で拡張可能と考えており魅力を感 じている。日々、EV カートの機能拡張によるスキルアップを考えている。 技術書典は技術書典 9 から参加。 *1 https://techbookfest.org/product/6581675934875648?productVariantID=5815321967460352 33
GCC 開発環境構築入門 (EV カート編) 2020 年 12 月 26 日 技術書典 10 版 v1.0.0 著 者 k-abe 編 集 k-abe 発行所 k-abe (C) 2020 k-abe