広告

2016年8月10日水曜日

退職SEの組込マイコン職業訓練体験談(4) C言語で一気に初心者向けペースで余裕ができました

SIerを退職したSEが組込マイコンの職業訓練の体験談。今回からC言語です。

私が受講している訓練ではC言語について

  • 通常?のC言語
  • SH4マイコン向けC言語
  • Linux向けC言語

の3パターンを順次学習していくとのこと。

本訓練は基本的にプログラミング未経験者向けですので、当然C言語を一から学習していくことになります。


■アセンブラから一変して初心者にもやさしいペースに


アセンブラではかなりペースが速く、正直初心者にはキツイかなと思ってたのですが、さすがにC言語は本訓練のメインということもあり、かなり進捗ペースもゆっくりになりました。また訓練生に課題を与え実際にソースコードを書かせることを重視しており、初心者にもやさしい内容になってたと思います。

とはいえ簡単な内容にとどまっているわけではありません。

組込み系の実装では欠かせないと思われるポインタやビットフィールド、関数ポインタ等、初心者には多少難しいと思われる部分もしっかりカリキュラムに入ってました。

私の場合、業務で多少C言語にかかわっていたこともありましたし、

以前も紹介したように

Windows系SEの日記: C言語の複雑なポインタ char *(*a[10])(int **p)←こういうのを理解できる書籍を紹介
Windows系SEの日記: C++の定番本ですが「Effective C++」は読んでおくべき
Windows系SEの日記: 「Cプログラミング専門課程」SE向け書籍レビュー C言語をあまり使う機会がない若手のSEにオススメします

過去にC言語関連の書籍を読んだりしてましたので、通常のC言語に関する訓練はかなり余裕をもって対応できました。


■実際にC言語のソースを自分で書くことを重視しました


私の場合、業務でC言語のソースを読むことはたまにありましたが、実際にC言語でコーディングすることはほとんどありませんでしたので、訓練を通じてまとまった量のC言語のコーディングをできたのはありがたかったです。

とはいえ訓練で提示される課題だけだとかなり空き時間ができてしまったので、「Mastering Algorithms With C」あたりの書籍を参考にソートやリスト等の定番アルゴリズムのC言語での実装についても自分でコーディングしたりしてました。

熟練したCプログラマーには当たり前かもしれませんが、関数ポインタやmallocを駆使することで特定のデータ型に依存しないソート等のアルゴリズム実装例が紹介されており、うならされました。




次回からはいよいよ、訓練の本丸組込みプログラミングについて紹介していきたいと思います。


2016年8月8日月曜日

退職SEの組込マイコン職業訓練体験談(3) アセンブラはパズルのようです

SIerを退職したSEが組込マイコンの職業訓練を受講中です。その体験談を記事にしてます。

前回の電子回路に続き、今回からはアセンブラす。

アセンブラ関連の授業を大きく分けると

  • 16進数の考え方
  • SH4マイコンのアーキテクチャ
  • アセンブリ言語によるプログラミング

の3項目でした。順番に振り返っていきます。


■16進数 2の補数の概念について考える


まずは16進数に関する授業です。本訓練は全くのプログラミング未経験者も対象ですので、アセンブラでは当然必要になる16進数の考え方についても授業があります。

一応元SEということで、さすがに16進数は知ってるよ、という感じで油断してましたが、コンピューターでマイナスを表すための「2の補数」の考え方については、わかっているようで理解があいまいな部分もありました。

なぜ2の補数を取って足し算すると、結果引き算の答えになるのか等、結構頭の体操になりましたね。


■SH4マイコンのアーキテクチャ


次に、アセンブラの前にいきなりSH4マイコンのアーキテクチャの説明です。
いきなり、CPU、メモリだけでなく、SH4にはこんなレジスタがあって…、とかメモリマップはこうなって…というように、結構細かい内容まで説明がありました。

わたし個人としては、マイコンのアーキテクチャにも興味があったので面白かったのですが、未経験者にとってはどうだったんでしょう…。人によってはかなり敷居の高い内容と感じたのでは、と少し心配になりました。

アセンブラについてはかなりのスパルタ教育で進める感じでしたね。
まあ、アセンブリ言語については、最悪授業についてこられなくても、実業務でアセンブリ言語を使うケースはあまりないということで、職業訓練側も割り切ってるような気もします。


■アセンブリ言語


で、いよいよアセンブリ言語です。

アセンブリ言語のプログラミングは本訓練ではHEW (High-performance Embedded Workshop)という統合開発環境で行いました。

Hewとはルネサスが提供する統合開発環境です。組込み関連の開発では業務でも広く使われているもののようです。
各マイコンの挙動をエミュレートする機能もあるので、SH4のようなマイコン実機がなくても、HEW上でアセンブリのソースのコンパイル、リンク、実行が可能です。

本訓練でもアセンブリについては特に実機は使わず、HEW上でSH4をエミュレートして訓練を進める形でした。

このHEWというのは体験版でも作成できる実行ファイルの大きさに制限があるだけで、他の機能は商用と同様で使えるようです。なのでダウンロードして家のPCでHEWを使うことも可能です。私もルネサスのアカウントを作って、家のPCにHEWを入れて動作確認したりしました。


■アセンブリ言語でのプログラミングはパズルのよう


実際にアセンブリ言語でプログラムを組んでみると、高級言語に慣れた私にとっては非常に組みづらいです。
普通の言語ならループ処理や条件分岐などはforやifで簡単に書けますが、アセンブリの場合、ループ用のレジスタを用意して、分岐用のラベルを用意して、…というようにかなり生産性が落ちます。
アセンブリで処理を考えていると、何かプログラミングというよりパズルを解くような感覚に陥りました。 この辺の感覚はアセンブリに慣れてくるとまた変わってくるのかもしれません。
 
また、改めて思うのが、以前も紹介した書籍 CPUの創りかたがおすすめ本だということです。


この本を読めば、なぜこんな処理の書きにくいアセンブリ言語なるものが存在するかもわかるようになってるんですよね。

■アセンブリで競馬ソフトを作った人もいます


あとは余談になります。昔のMS-DOSの有名な競馬ソフトにTARGETというのがあるのですが、このTARGETはほぼアセンブリ言語で作られているそうです。
当時からこの話は、ある意味伝説的に言われてましたが、実際に自分でアセンブリ言語によるプログラムを経験してみると、あの複雑な競馬ソフトをアセンブリで作ったということに驚かされます。

ちなみにそのTARGETは今はWindows版として競馬関係者も使うデファクトスタンダード的なソフトウェアになってます。

(参考)
Target Frontier JV: コンピューター競馬活用術



■アセンブリ言語プログラミング、面白い経験ができました


普通にSEをやっていると、アセンブリ言語を見るのはせいぜいダンプ解析をする時くらいで、がっつりアセンブリでプログラムを書くというような経験はなかなかできません。
ある意味貴重で、面白い経験をさせてもらいました。
ただ学んだアセンブリ言語が実業務でどれだけ役立つかは?ですが…。

次回からはいよいよC言語に入ります。


2016年8月7日日曜日

【12ステップで作る組込みOS自作入門】Win10&Cygwin実践記(5) ファイル転送機能デバッグでハマりました

書籍「12ステップで作る組込みOS自作入門」をWindows 10&Cygwin環境で実践中です。

今回は4thステップになります。

4thステップの概要は以下の通り。

ファイル転送のためXMODEMプロトコルの実装
アセンブラによるスタートアップルーチンの説明


■なぜOS作成にファイル転送が必要か


そもそも、OSを作るのになんでファイル転送が必要なのかと思う人もいると思いますが、これはのちのステップでのブートローダー作成につながるようです。

現在はプログラムを入れ替えるために毎回フラッシュROMへの書き込みを行ってますが、ROMへの書き込みはディップスイッチの切り替え再起動が毎回必要で面倒です。

さらにH8/3069F内蔵フラッシュROMの書き換え自体に回数制限(1000回くらいの模様?)もあります。なので、ブートローダーでOSを毎回RAMにダウンロードする仕組みを作ることで、開発の効率化とフラッシュROMの保護を狙うことになります。

ファイル転送機能はその第一歩ということです。

ファイル転送機能は本書ではXMODEMという昔から存在するプロトコルをマイコン上に実装します。マイコン側からファイルを転送することはないので、受信機能のみを実装し、ファイル送信は既存のソフトを使います。

私の環境では、H8/3069Fとのシリアル通信にTera Termを使ってますので、Tera Termの機能でXMODEM送信を行いました。




■XMODEMデバッグ時に少しハマりました


最初XMODEM実装がうまく動かなかったので、デバッグ用に別途作成済みのputs関数でデバッグ用メッセージをコンソールに表示しようとしたのですが、ますます動作しなくなってしまいました。

最初、なぜデバッグ文を追加するだけで動きが変わるのか?と思ったのですが、考えてみると当たり前でした。

puts関数自体がシリアルを通じてコンソール上にメッセージを表示する関数です。シリアル通信上でファイル転送をしているのに、その間に別のシリアル通信を使ってしまってはまともに動くはずがありません。

ということで、現状シリアル通信を複雑に使う機能のデバッグは机上で行うしかないようです。LCDでもつなげばそこにデバッグ用のメッセージを出せるのかもしれませんが。


■ファイル転送実行結果


本章より、コマンドプロンプトっぽい機能も実装され(まだファイル転送とダンプだけですが)、ちょっとOSっぽくなりました。

以下、転送したファイルをマイコン上でダンプした結果です。
PC上のダンプとも一致してます。
末尾に1aが並んでいるのはXMODEMの仕様です。


なお、本章でメモリダンプの関数も実装するのですが、私の場合、オリジナルで既に作ってましたので、そのまま使ってます。

私が作ったダンプ関数ではメモリのアドレスも表示されるのですが、ちゃんとリンカ・スクリプトで設定したアドレス

MEMORY
{
    romall(rx)    : o = 0x000000, l = 0x080000 /* 512KB */
    vectors(r)    : o = 0x000000, l = 0x000100 /* top of ROM */
    rom(rx)        : o = 0x000100, l = 0x07ff00

    ramall(rwx)    : o = 0xffbf20, l = 0x004000 /* 16KB */
    buffer(rwx)    : o = 0xffdf20, l = 0x001d00 /*  8KB */
    data(rwx)    : o = 0xfffc20, l = 0x000300
    stack(rw)    : o = 0xffff00, l = 0x000000 /* end of RAM */
}

が表示されてましたので、ちゃんと動いているようです。




■アセンブラのスタートアップルーチン


後半はアセンブラで記述されたスタートアップルーチンの説明です。
一部C言語では実装できない処理をアセンブラで記述してます。

とはいっても、スタックポインタを特定のレジスタに格納して、すぐC言語側のmainに飛んでいるだけなので、OSの処理としては単純です。

ただ本書はアセンブリ言語そのものの説明にある程度ページが割かれているので、アセンブラの興味のある人にもいいんじゃないですかね。


ということで、4thステップ完了です。