某SIerのSEが、おすすめ書籍や仕事の話題を色々語ります。今はWindows系がメインです。→某SIerを退職しました。10&Cygwin環境で実践中です。今回は6thステップで、いよいよRAM上にOSを読み込むためのブートローダーが完成です。5thステップまででバッファ内のelfファイルの解析処理までは完了してます。全セクションがRAM側のアドレスに読み込まれるようにリンカスクリプトの修正となります。■ram領域に余裕が必要な理由ちょっとわかりにくかったのが、以下のOS部分のリンカスクリプトのMEMORYコマンド部分。*/}ram部分がRAM上の領域を示しますが、ここはRAM領域の先頭の0xffbf20ではなく、ELFヘッダとプログラムヘッダテーブル分の余裕を見て256バイト空きを作る必要があるという点です。0x1となり、.textセクションの先頭アドレスが0xffbf20となります。.textセクションのさらに前方にELFヘッダ部分などもコピーされるようで、プログラムヘッダの物理Addrが0x00ffbeacと、RAMの先頭アドレス0xffbf20より手前になってしまってます。セクションのコピーはこの物理Addrが示すアドレスを先頭に行うため、このまま実行するとRAM領域外にデータを書き込むことになりNGです。ちなみに試しに実行してみるとリセットされました。0xffc020に戻すと、こんな感じでファイルを実行できるようになります。試しにffbfac番地以降をダンプする処理を実行してみましたが、ELFヘッダのマジックナンバーがメモリ上に記録されており、ELFヘッダもメモリに読み込まれていることがわかります。プログラムのブートローダーが完成し、色々なプログラムを手軽に動作確認できるようになりました。10&Cygwin環境で実践中です。今回は5thステップになります。5thの概要は以下の通り。前回の4thステップでファイル受信を実装しましたが、いよいよ受信したファイルをRAMに展開し、実行できる仕組みを作っていくことになります。5thステップでは受信した実行形式(ELF)ファイルを解析するところまで行います。解析といってもバイナリのフォーマットに従って構造体を定義し、その内容を構造体経由で読みだすだけですので、内容的には全然難しくないです。こんな感じであっさりできました。実行ファイルをRAMに展開する際にはプログラムヘッダの内容を使うので、その情報のみを表示してます。上がマイコンでの実行結果です。5thステップでおまけ?で論理回路の説明が入ってました。論理回路とCPUやメモリとの関係は本ブログで何度も紹介してますが「CPUの創りかた」を読むのをお勧めしておきます。2003-10-01AmazonKindle楽天ブックス次の6thステップでいよいよブートローダーが出来上がるようです。ソースコードの修正ごとにディップスイッチの変更、マイコンのシャットダウンは面倒なので、気兼ねなくソースコード修正ができるようになるのはありがたいですね。C言語で一気に初心者向けペースで余裕ができましたSIerを退職したSEが組込マイコンの職業訓練の体験談。私が受講している訓練ではC言語について通常?のC言語SH4マイコン向けC言語Linux向けC言語の3パターンを順次学習していくとのこと。本訓練は基本的にプログラミング未経験者向けですので、当然C言語を一から学習していくことになります。■アセンブラから一変して初心者にもやさしいペースにアセンブラではかなりペースが速く、正直初心者にはキツイかなと思ってたのですが、さすがにC言語は本訓練のメインということもあり、かなり進捗ペースもゆっくりになりました。訓練生に課題を与え実際にソースコードを書かせることを重視しており、初心者にもやさしい内容になってたと思います。いえ簡単な内容にとどまっているわけではありません。組込み系の実装では欠かせないと思われるポインタやビットフィールド、関数ポインタ等、初心者には多少難しいと思われる部分もしっかりカリキュラムに入ってました。C言語をあまり使う機会がない若手のSEにオススメします過去にC言語関連の書籍を読んだりしてましたので、通常のC言語に関する訓練はかなり余裕をもって対応できました。■実際にC言語のソースを自分で書くことを重視しました私の場合、業務でC言語のソースを読むことはたまにありましたが、実際にC言語でコーディングすることはほとんどありませんでしたので、訓練を通じてまとまった量のC言語のコーディングをできたのはありがたかったです。C」あたりの書籍を参考にソートやリスト等の定番アルゴリズムのC言語での実装についても自分でコーディングしたりしてました。熟練したCプログラマーには当たり前かもしれませんが、関数ポインタやmallocを駆使することで特定のデータ型に依存しないソート等のアルゴリズム実装例が紹介されており、うならされました。1999-08-05Amazon楽天市場Yahooショッピング次回からはいよいよ、訓練の本丸組込みプログラミングについて紹介していきたいと思います。アセンブラはパズルのようですSIerを退職したSEが組込マイコンの職業訓練を受講中です。その体験談を記事にしてます。前回の電子回路に続き、今回からはアセンブラす。アセンブラ関連の授業を大きく分けると16進数の考え方SH4マイコンのアーキテクチャアセンブリ言語によるプログラミングの3項目でした。順番に振り返っていきます。2の補数の概念について考えるまずは16進数に関する授業です。本訓練は全くのプログラミング未経験者も対象ですので、アセンブラでは当然必要になる16進数の考え方についても授業があります。一応元SEということで、さすがに16進数は知ってるよ、という感じで油断してましたが、コンピューターでマイナスを表すための「2の補数」の考え方については、わかっているようで理解があいまいな部分もありました。2の補数を取って足し算すると、結果引き算の答えになるのか等、結構頭の体操になりましたね。■SH4マイコンのアーキテクチャ次に、アセンブラの前にいきなりSH4マイコンのアーキテクチャの説明です。CPU、メモリだけでなく、SH4にはこんなレジスタがあって...、とかメモリマップはこうなって...というように、結構細かい内容まで説明がありました。わたし個人としては、マイコンのアーキテクチャにも興味があったので面白かったのですが、未経験者にとってはどうだったんでしょう...。人によってはかなり敷居の高い内容と感じたのでは、と少し心配になりました。アセンブラについてはかなりのスパルタ教育で進める感じでしたね。アセンブリ言語については、最悪授業についてこられなくても、実業務でアセンブリ言語を使うケースはあまりないということで、職業訓練側も割り切ってるような気もします。■アセンブリ言語で、いよいよアセンブリ言語です。Workshop)という統合開発環境で行いました。Hewとはルネサスが提供する統合開発環境です。組込み関連の開発では業務でも広く使われているもののようです。各マイコンの挙動をエミュレートする機能もあるので、SH4のようなマイコン実機がなくても、HEW上でアセンブリのソースのコンパイル、リンク、実行が可能です。本訓練でもアセンブリについては特に実機は使わず、HEW上でSH4をエミュレートして訓練を進める形でした。このHEWというのは体験版でも作成できる実行ファイルの大きさに制限があるだけで、他の機能は商用と同様で使えるようです。ダウンロードして家のPCでHEWを使うことも可能です。私もルネサスのアカウントを作って、家のPCにHEWを入れて動作確認したりしました。■アセンブリ言語でのプログラミングはパズルのよう実際にアセンブリ言語でプログラムを組んでみると、高級言語に慣れた私にとっては非常に組みづらいです。普通の言語ならループ処理や条件分岐などはforやifで簡単に書けますが、アセンブリの場合、ループ用のレジスタを用意して、分岐用のラベルを用意して、...というようにかなり生産性が落ちます。アセンブリで処理を考えていると、何かプログラミングというよりパズルを解くような感覚に陥りました。この辺の感覚はアセンブリに慣れてくるとまた変わってくるのかもしれません。CPUの創りかたがおすすめ本だということです。2003-10-01AmazonKindle楽天ブックスこの本を読めば、なぜこんな処理の書きにくいアセンブリ言語なるものが存在するかもわかるようになってるんですよね。■アセンブリで競馬ソフトを作った人もいますあとは余談になります。昔のMS-DOSの有名な競馬ソフトにTARGETというのがあるのですが、このTARGETはほぼアセンブリ言語で作られているそうです。当時からこの話は、ある意味伝説的に言われてましたが、実際に自分でアセンブリ言語によるプログラムを経験してみると、あの複雑な競馬ソフトをアセンブリで作ったということに驚かされます。ちなみにそのTARGETは今はWindows版として競馬関係者も使うデファクトスタンダード的なソフトウェアになってます。■アセンブリ言語プログラミング、面白い経験ができました普通にSEをやっていると、アセンブリ言語を見るのはせいぜいダンプ解析をする時くらいで、がっつりアセンブリでプログラムを書くというような経験はなかなかできません。ある意味貴重で、面白い経験をさせてもらいました。学んだアセンブリ言語が実業務でどれだけ役立つかは?ですが...。次回からはいよいよC言語に入ります。10&Cygwin環境で実践中です。今回は4thステップになります。4thステップの概要は以下の通り。■なぜOS作成にファイル転送が必要かそもそも、OSを作るのになんでファイル転送が必要なのかと思う人もいると思いますが、これはのちのステップでのブートローダー作成につながるようです。現在はプログラムを入れ替えるために毎回フラッシュROMへの書き込みを行ってますが、ROMへの書き込みはディップスイッチの切り替え再起動が毎回必要で面倒です。H8/3069F内蔵フラッシュROMの書き換え自体に回数制限(1000回くらいの模様?)もあります。ブートローダーでOSを毎回RAMにダウンロードする仕組みを作ることで、開発の効率化とフラッシュROMの保護を狙うことになります。ファイル転送機能はその第一歩ということです。ファイル転送機能は本書ではXMODEMという昔から存在するプロトコルをマイコン上に実装します。マイコン側からファイルを転送することはないので、受信機能のみを実装し、ファイル送信は既存のソフトを使います。Termの機能でXMODEM送信を行いました。■XMODEMデバッグ時に少しハマりました最初XMODEM実装がうまく動かなかったので、デバッグ用に別途作成済みのputs関数でデバッグ用メッセージをコンソールに表示しようとしたのですが、ますます動作しなくなってしまいました。最初、なぜデバッグ文を追加するだけで動きが変わるのか?と思ったのですが、考えてみると当たり前でした。puts関数自体がシリアルを通じてコンソール上にメッセージを表示する関数です。シリアル通信上でファイル転送をしているのに、その間に別のシリアル通信を使ってしまってはまともに動くはずがありません。いうことで、現状シリアル通信を複雑に使う機能のデバッグは机上で行うしかないようです。LCDでもつなげばそこにデバッグ用のメッセージを出せるのかもしれませんが。本章より、コマンドプロンプトっぽい機能も実装され(まだファイル転送とダンプだけですが)、ちょっとOSっぽくなりました。以下、転送したファイルをマイコン上でダンプした結果です。PC上のダンプとも一致してます。末尾に1aが並んでいるのはXMODEMの仕様です。本章でメモリダンプの関数も実装するのですが、私の場合、オリジナルで既に作ってましたので、そのまま使ってます。*/}が表示されてましたので、ちゃんと動いているようです。■アセンブラのスタートアップルーチン後半はアセンブラで記述されたスタートアップルーチンの説明です。一部C言語では実装できない処理をアセンブラで記述してます。いっても、スタックポインタを特定のレジスタに格納して、すぐC言語側のmainに飛んでいるだけなので、OSの処理としては単純です。本書はアセンブリ言語そのものの説明にある程度ページが割かれているので、アセンブラの興味のある人にもいいんじゃないですかね。いうことで、4thステップ完了です。10+Cygwin環境でやってます。10+Cygwinで実装中3rdステップでは、H8/3069Fのメモリ構成と静的変数の書き換え対応が主な内容です。組込み環境でのC言語プログラミングの場合、初期値を持つ静的変数がROMに展開されます。そのままだとその値を書き換えることができません。静的変数を書き換える処理が存在する場合、静的変数をRAMにあらかじめコピーする処理を自力で作りこむ必要があります。この辺の処理は、C言語での組込みプログラミングでは定番の処理のようですが、3rdステップではその実装について説明されてます。(long)&data_start);の箇所です。メモリのコピー元(ROMの静的変数格納場所の開始アドレス)がなぜ&erodataでOKなのかが最初わからなかったのですが(同じアドレスを指すんじゃないかと最初思いました)、本書のセクションとセグメントの違いに関する記載を再読することで、&erodataがROM側、&data_startがRAM側を指すことが理解できました。実行結果はこんな感じです。静的変数も書き換わってます。一応、前回作成したダンプ関数で静的変数のアドレスも確認してみました。2);puts("\n\n");本書の記載と同様のアドレスになってますね。Online紹介(定額でコンピュータ関連技術書読み放題サイト)などの記事でたびたび紹介してますが、何と新プラン切り替えで年会費が生涯半額になるというキャンペーンのお知らせが来ました。既存契約者向けのキャンペーンっぽいです。今までのプランでは、毎年472.89ドルでSAFARI内の全書籍が読み放題だったのですが、新プランでは399ドルになり、さらにこの2日間限定キャンペーンの間に新プランに切り替えると永久に199ドルで読み放題になるようです。私の場合、ぼちぼちエンジニアとしての活動を再開しようということで月ごとの読み放題プラン(毎月42.99ドル)で様子を見ていましたが、年199ドルで従来通りの読み放題なら切り替えるメリットは大です。英語なので細かい条件に見落としがあるかもしれませんが、とりあえず人柱として新プランに切り替えてみます。新プランで使ってみて、気づいた点などあれば別途記事にしたいと思います。独自の16進ダンプ関数も動きました書籍「12ステップで作る組込みOS自作入門」に従ってOS実装にチャレンジ中ですが、2ndステップまで動作確認しました。2ndステップの内容としてはシリアル通信ライブラリ関数の追加となります。Worldを表示する際にシリアル通信を経由していて既に実装済みです。2ndステップで改めて、そのソースコードの内容を説明してます。内容的にはハードウェアの初期化のルールに従って、ひたすらレジスタを操作するだけなので難しいものではないです。scmr;};のようにシリアル通信を制御するためのレジスタにマップされたメモリのアドレスを構造体等でキャストして、あとは手順通りに操作していくようなコーディング方法になります。やって実装後のソースコードを見てしまうと難しくはないのですが、ハードウェアの仕様のみで1から実装するのは面倒そうです。■ライブラリ関数の追加あとはライブラリ関数の追加です。C言語の標準ライブラリに存在するmemcpyやstrcpyなどのよく使う関数ですが、当然本環境には存在しないので、改めて実装する必要があります。column);も追加して、2ndステップは完了です。■独自の16進ダンプ関数を作ってみたあと少しは自分でも改造を加えようということで、先のputxval関数を利用して指定ポインタから16進ダンプする関数も作ってみました。ソースコードは以下の通り。24);puts("\n");以下のようにポインタのアドレスとメモリ内容がダンプされます。32);puts("\n");のように直接アドレス指定(0番地)しても大丈夫です。World表示までできた環境を紹介フラッシュROMへのプログラム書き込みはルネサスのFDTをとりあえず使ってたのですが、h8writeを試してみたところ、こっちのほうが簡単ですね。writeだけでフラッシュROMに書き込み完了です。WARNINGが出てるのが気になりますが、今のところ特に問題になってません。当面はh8writeで行こうと思います。電子回路からスタートですSIerでWindows系のSEをやってた人の組込マイコン職業訓練体験談2回目です。組込みマイコン向けC言語Linuxを紹介しましたが、本記事より実際の訓練について振り返っていきます。■なぜ電子回路からなのかそもそも組込マイコン職業訓練の主目的は、マイコンやLinuxをターゲットにC言語でプログラムが書けるようになることです。電子回路と関係あるの?と思う人もいるかもしれませんが、CPUも突き詰めると巨大なデジタル回路です。電子回路→アセンブリ言語→C言語の順番で学ぶというのは理に適っていると言えます。コードから見たコンピュータのからくりを読むまでは、特に電子回路に興味はなかったです。上記書籍を読んだことが本訓練を受講しようと思った理由の一つになってますね。■とはいえ訓練では電子回路は深く踏み込まず電子回路自体には本訓練ではそう深く踏み込むわけではなかったです。アナログ回路では、懐かしのオームの法則から始まり、ダイオードやトランジスタあたりの軽い説明まで。デジタル回路では2進数やブール代数の説明から始まり、一般的なICや全加算器、フリップフロップの説明をもとに、ブレッドボード上に実際に回路を組むところまで経験できました。↑スイッチをカチカチやると7セグメントがカウントアップしていく回路です。写真で見ると、配線図が汚いです...。それでも電子回路を実際に組むというのは経験したことがなく、なかなか面白かったです。■「CPUの創りかた」を読み返したくなりましたまた電子回路の訓練終了後、改めてCPUの創りかたを読みたくなり、読み返してみたんですが、さらに理解が深まった気がします。CPUの創りかたを読んでみてください。