広告

2016年9月13日火曜日

SIerを退職した元SEの組込マイコン職業訓練体験談(5) SH4マイコンCプログラミング開始です

SIerを退職した元SEが組込マイコンの職業訓練を受講中です。

今回から、いよいよ本訓練のメインの一つといえるSH4マイコンに対するCプログラミングになります。


■開発ターゲット環境について


開発のターゲットは以下の通り。

CPU:SH7750R
CPUボード:MS104-SH4

さらにこのCPUボードにIO基板のEMB-DIO104が接続されていて、さらにこの基板上にLED、LCD、液晶ディスプレイが接続されてます。

訓練では、このLED、LCD、液晶ディスプレイに対してC言語のプログラミングで色々表示したり動かすということになります。



■開発環境、デバッグ環境について


プログラミングは先のアセンブリ実習でも使ったHEWを引き続き使います。

またデバッグではPALMiCEというハードウェアを経由してCSIDEというデバッグ統合環境を使います。

HEW上でコンパイルした実行ファイルやデバッグ用ファイルをPALMiCE経由で開発ターゲットに転送し、CPU上で実行させます。その際、CSIDE上でステップ実行したり、メモリ内容を確認するなどしてデバッグすることになります。

上記は組込みプログラミングのデバッグでは定番のもののようです。個人で買うには値段が高い代物のようなので、訓練で無料で使えるのはありがたいところです。

■LED点灯は簡単


 今のところLEDの点灯方法まで進んでいます。正直LEDの点灯自体は簡単です。

LED点灯/消灯に対応するレジスタが存在しており、8個のLEDの点灯/消灯がそれぞれ1ビットで1バイトのレジスタに対応します。

そのレジスタも特定のメモリアドレスにマップされているので、

#define LED (*(volatile unsigned char *)0x18000003)

のようにプログラムしやすいようにキャストして、

LED |= (1<<2)

のように該当LEDに対応するビットを立てればLEDが点灯し、

LED &= ( ~1<<3)

のようにビットをクリアすればLED消灯です。


■開発環境の準備が難しい


むしろ、上記のようにC言語でプログラミングできる開発環境をどのように作っているかというところが難しいです。今のところ

  • HEWでマイコンで動作する実行ファイルをコンパイルするための必要な設定
  • マイコン上でプログラミングを正常動作させるための前処理の実装方式
  • MMU経由でLED等のアドレスマップを行う考え方

等がよくわかってません。

もちろん設定手順は説明してもらっていて、プログラム自体はマイコン上で動作し、デバッグもできるようになっているのですが、なぜそのような設定をすればいいのかがまだ理解できてません。設定内容についても徐々に理解を深めていきたいと思ってます。



2016年8月13日土曜日

【12ステップで作る組込みOS自作入門】Win10&Cygwin実践記(7) ついにブートローダー部分が完成

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

↓最初の環境構築からご覧になる場合はこちらからどうぞ
Windows系SEの日記: 【12ステップで作る組込みOS自作入門】Windows 10+Cygwinで実装中

今回は6thステップで、いよいよRAM上にOSを読み込むためのブートローダーが完成です。

5thステップまででバッファ内のelfファイルの解析処理までは完了してます。

なので、あと必要な処理は

【ブートローダー】
読み込んだelfファイル内のプログラムヘッダ情報をもとに、適切に実行できるようにRAM内の適切なアドレスにセクションをコピーしていく

読み込まれる側のOSもRAMで実行できるようにメモリマップを変更する必要がありますので、

【OS】
全セクションがRAM側のアドレスに読み込まれるようにリンカスクリプトの修正

となります。


■ram領域に余裕が必要な理由


ちょっとわかりにくかったのが、以下のOS部分のリンカスクリプトのMEMORYコマンド部分。

MEMORY
{
 ramall(rwx) : o = 0xffbf20, l = 0x004000 /* 16KB */
 ram(rwx) : o = 0xffc020, l = 0x003f00
 stack(rw) : o = 0xffff00, l = 0x000000 /* end of RAM */
}



ram部分がRAM上の領域を示しますが、ここはRAM領域の先頭の0xffbf20ではなく、ELFヘッダとプログラムヘッダテーブル分の余裕を見て256バイト空きを作る必要があるという点です。

最初、空きを作る意味がよくわからなかったので試しに

ram(rwx)    : o = 0xffbf20, l = 0x003f00

に変更して、readelfで確認してみたところ

セクションヘッダ:
  [番] 名前              タイプ          アドレス Off    サイズ ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00ffbf20 000074 000498 00  AX  0   0  2
  [ 2] .rodata           PROGBITS        00ffc3b8 00050c 000038 01 AMS  0   0  1
  [ 3] .data             PROGBITS        00ffc3f0 000544 00000c 00  WA  0   0  4
  [ 4] .bss              NOBITS          00ffc3fc 000550 000020 00  WA  0   0  1
  [ 5] .shstrtab         STRTAB          00000000 000550 000034 00      0   0  1
  [ 6] .symtab           SYMTAB          00000000 0006c4 000570 10      7  57  4
  [ 7] .strtab           STRTAB          00000000 000c34 000232 00      0   0  1

プログラムヘッダ:
  タイプ       オフセット 仮想Addr   物理Addr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00ffbeac 0x00ffbeac 0x00544 0x00544 R E 0x1
  LOAD           0x000544 0x00ffc3f0 0x00ffc3f0 0x0000c 0x0002c RW  0x1


となり、.textセクションの先頭アドレスが0xffbf20となります。

ただ.textセクションのさらに前方にELFヘッダ部分などもコピーされるようで、プログラムヘッダの物理Addrが0x00ffbeacと、RAMの先頭アドレス0xffbf20より手前になってしまってます。

セクションのコピーはこの物理Addrが示すアドレスを先頭に行うため、このまま実行するとRAM領域外にデータを書き込むことになりNGです。ちなみに試しに実行してみるとリセットされました。


ram(rwx) : o = 0xffc020

に戻すと、こんな感じでファイルを実行できるようになります。


 試しにffbfac番地以降をダンプする処理を実行してみましたが、ELFヘッダのマジックナンバーがメモリ上に記録されており、ELFヘッダもメモリに読み込まれていることがわかります。

 とりあえずプログラムのブートローダーが完成し、色々なプログラムを手軽に動作確認できるようになりました。



2016年8月11日木曜日

【12ステップで作る組込みOS自作入門】Win10&Cygwin実践記(6) 実行形式ファイルの解析を実装

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

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

5thの概要は以下の通り。
  • 実行形式ファイルのフォーマット解析
  • 論理回路の説明

■実行形式ファイルの解析


前回の4thステップでファイル受信を実装しましたが、いよいよ受信したファイルをRAMに展開し、実行できる仕組みを作っていくことになります。

5thステップでは受信した実行形式(ELF)ファイルを解析するところまで行います。
解析といってもバイナリのフォーマットに従って構造体を定義し、その内容を構造体経由で読みだすだけですので、内容的には全然難しくないです。

こんな感じであっさりできました。
実行ファイルをRAMに展開する際にはプログラムヘッダの内容を使うので、その情報のみを表示してます。


上がマイコンでの実行結果です。改行コードを入れ忘れたのでみにくくなってますが、下のreadelfコマンドでのプログラムヘッダの内容と一致しているので、問題なく動作しているようです。



■論理回路

 本書では、5thステップでおまけ?で論理回路の説明が入ってました。

論理回路とCPUやメモリとの関係は本ブログで何度も紹介してますが「CPUの創りかた」を読むのをお勧めしておきます。



 次の6thステップでいよいよブートローダーが出来上がるようです。ソースコードの修正ごとにディップスイッチの変更、マイコンのシャットダウンは面倒なので、気兼ねなくソースコード修正ができるようになるのはありがたいですね。

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ステップ完了です。

2016年8月6日土曜日

【12ステップで作る組込みOS自作入門】Win10&Cygwin実践記(4) 3rdステップ編

書籍「12ステップで作る組込みOS自作入門」実践記。今回は3rdステップです。

Windows 10+Cygwin環境でやってます。
Windows系SEの日記: 【12ステップで作る組込みOS自作入門】Windows 10+Cygwinで実装中


3rdステップでは、H8/3069Fのメモリ構成と静的変数の書き換え対応が主な内容です。

組込み環境でのC言語プログラミングの場合、初期値を持つ静的変数がROMに展開されます。そのままだとその値を書き換えることができません。

なので、静的変数を書き換える処理が存在する場合、静的変数をRAMにあらかじめコピーする処理を自力で作りこむ必要があります。

この辺の処理は、C言語での組込みプログラミングでは定番の処理のようですが、3rdステップではその実装について説明されてます。



理解するうえで、最初悩んだ部分は


ROMの静的変数をRAMにメモリコピーする処理

    memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);

の箇所です。

メモリのコピー元(ROMの静的変数格納場所の開始アドレス)がなぜ

&erodata

でOKなのかが最初わからなかったのですが(同じアドレスを指すんじゃないかと最初思いました)、本書のセクションとセグメントの違いに関する記載を再読することで、&erodataがROM側、&data_startがRAM側を指すことが理解できました。

実行結果はこんな感じです。


ちゃんと静的変数も書き換わってます。

一応、前回作成したダンプ関数で静的変数のアドレスも確認してみました。

    puts("global_data = ");
    putxval(global_data, 0);
    puts("\n");
    dumphex(&global_data, 2);
    puts("\n\n");
   
    puts("global_bss = ");
    putxval(global_bss, 0);
    puts("\n");
    dumphex(&global_bss, 2);
    puts("\n\n");
   
    puts("static_data = ");
    putxval(static_data, 0);
    puts("\n");
    dumphex(&static_data, 2);
    puts("\n\n");
   
    puts("static_bss = ");
    putxval(static_bss, 0);
    puts("\n");
    dumphex(&static_bss, 2);
    puts("\n\n");

本書の記載と同様のアドレスになってますね。

2016年8月3日水曜日

Safari Books Online新プランで生涯半額のお知らせ【2日間限定キャンペーン】

IT関連の多数の洋書が定額で読み放題のサイトSafari Books Online

Windows系SEの日記: Safari Books Online紹介(定額でコンピュータ関連技術書読み放題サイト)

などの記事でたびたび紹介してますが、何と新プラン切り替えで年会費が生涯半額になるというキャンペーンのお知らせが来ました。


どうも既存契約者向けのキャンペーンっぽいです。



今までのプランでは、毎年472.89ドルでSAFARI内の全書籍が読み放題だったのですが、新プランでは399ドルになり、さらにこの2日間限定キャンペーンの間に新プランに切り替えると永久に199ドルで読み放題になるようです。



私の場合、ぼちぼちエンジニアとしての活動を再開しようということで月ごとの読み放題プラン(毎月42.99ドル)で様子を見ていましたが、年199ドルで従来通りの読み放題なら切り替えるメリットは大です。

英語なので細かい条件に見落としがあるかもしれませんが、とりあえず人柱として新プランに切り替えてみます。

新プランで使ってみて、気づいた点などあれば別途記事にしたいと思います。


2016年8月2日火曜日

【12ステップで作る組込みOS自作入門】実践記(3) 独自の16進ダンプ関数も動きました

書籍「12ステップで作る組込みOS自作入門」に従ってOS実装にチャレンジ中ですが、2ndステップまで動作確認しました。

2ndステップの内容としては

  • シリアル通信
  • ライブラリ関数の追加

となります。



■シリアル通信は難しくはないが実装は大変


シリアル通信自体は、1stステップでターミナルでHello Worldを表示する際にシリアル通信を経由していて既に実装済みです。

2ndステップで改めて、そのソースコードの内容を説明してます。内容的にはハードウェアの初期化のルールに従って、ひたすらレジスタを操作するだけなので難しいものではないです。

#define H8_3069F_SCI0 ((volatile struct h8_3069f_sci *)0xffffb0)
#define H8_3069F_SCI1 ((volatile struct h8_3069f_sci *)0xffffb8)
#define H8_3069F_SCI2 ((volatile struct h8_3069f_sci *)0xffffc0)

struct h8_3069f_sci {
  volatile uint8 smr;
  volatile uint8 brr;
  volatile uint8 scr;
  volatile uint8 tdr;
  volatile uint8 ssr;
  volatile uint8 rdr;
  volatile uint8 scmr;
};

のようにシリアル通信を制御するためのレジスタにマップされたメモリのアドレスを構造体等でキャストして、あとは手順通りに操作していくようなコーディング方法になります。

こうやって実装後のソースコードを見てしまうと難しくはないのですが、ハードウェアの仕様のみで1から実装するのは面倒そうです。


■ライブラリ関数の追加


あとはライブラリ関数の追加です。

C言語の標準ライブラリに存在するmemcpyやstrcpyなどのよく使う関数ですが、当然本環境には存在しないので、改めて実装する必要があります。

あと現状数値を画面出力する関数もないので(当然printfのような便利な関数もありません)、16進で表示する関数putxval

int putxval(unsigned long value, int column);

も追加して、2ndステップは完了です。


■独自の16進ダンプ関数を作ってみた


あと少しは自分でも改造を加えようということで、先のputxval関数を利用して指定ポインタから16進ダンプする関数も作ってみました。

ソースコードは以下の通り。

/* 16進ダンプ */
void dumphex(void *b, int size)
{
    int i;
    char *p = b;
    for(i = 0; i < size; i++){
        if(i % 8 == 0){
            putxval((unsigned long)(p + i), 8);
            puts(":");
        }
       
        putxval(*(p + i), 2);
        puts(" ");
       
        if(i % 8 == 7){
            puts("\n");
        }
    }
}



以下のように

    char *c = "0123456789ABCDEF";
    char b[] = "0123456789abcdef";

適当にポインタ変数を定義し、dumphex関数に渡すと

    puts(c);puts("\n");
    dumphex(c, 24);
    puts("\n");
    puts(b);puts("\n");
    dumphex(b, 24);
    puts("\n");



以下のようにポインタのアドレスとメモリ内容がダンプされます。


    dumphex((char *)0, 32);
    puts("\n");

のように直接アドレス指定(0番地)しても大丈夫です。



■フラッシュROMへのプログラム書き込みはh8writeがお手軽です



前回の記事では

Windows系SEの日記: 【12ステップで作る組込みOS自作入門】実践記(2)とりあえずHello World表示までできた環境を紹介

フラッシュROMへのプログラム書き込みはルネサスのFDTをとりあえず使ってたのですが、h8writeを試してみたところ、こっちのほうが簡単ですね。

Windows環境用のh8write実行ファイルを著者サイト経由でダウンロードし、Makefileの指定箇所に置いておけば、あとは

make write

だけでフラッシュROMに書き込み完了です。


WARNINGが出てるのが気になりますが、今のところ特に問題になってません。
当面はh8writeで行こうと思います。



2016年8月1日月曜日

SIerを退職した元SEの組込マイコン職業訓練体験談(2) まずは電子回路からスタートです

SIerでWindows系のSEをやってた人の組込マイコン職業訓練体験談2回目です。

前回の記事
Windows系SEの日記: SIerを退職した元SEの組込マイコン職業訓練体験談(1) まずは面接選考突破

でカリキュラム概要


  • 電子回路
  • アセンブリ言語
  • C言語
  • 組込みマイコン向けC言語
  • Linux

を紹介しましたが、本記事より実際の訓練について振り返っていきます。今回は電子回路です。


■なぜ電子回路からなのか


そもそも組込マイコン職業訓練の主目的は、マイコンやLinuxをターゲットにC言語でプログラムが書けるようになることです。電子回路と関係あるの?と思う人もいるかもしれませんが、CPUも突き詰めると巨大なデジタル回路です。

組込みマイコンというハードウェアよりのプログラミングを学ぶということで、

電子回路→アセンブリ言語→C言語

の順番で学ぶというのは理に適っていると言えます。

(参考記事)
Windows系SEの日記: CPUってどんな仕組みで動いてるの?という人にオススメの2冊

実は私も上記記事で紹介した書籍、CPUの創りかたCODE コードから見たコンピュータのからくりを読むまでは、特に電子回路に興味はなかったです。
上記書籍を読んだことが本訓練を受講しようと思った理由の一つになってますね。



■とはいえ訓練では電子回路は深く踏み込まず


電子回路自体には本訓練ではそう深く踏み込むわけではなかったです。

アナログ回路では、懐かしのオームの法則から始まり、ダイオードやトランジスタあたりの軽い説明まで。

デジタル回路では2進数やブール代数の説明から始まり、一般的なICや全加算器、フリップフロップの説明をもとに、ブレッドボード上に実際に回路を組むところまで経験できました。



 ↑スイッチをカチカチやると7セグメントがカウントアップしていく回路です。
 あらためて写真で見ると、配線図が汚いです…。

 それでも電子回路を実際に組むというのは経験したことがなく、なかなか面白かったです。


■「CPUの創りかた」を読み返したくなりました


また電子回路の訓練終了後、改めてCPUの創りかたを読みたくなり、読み返してみたんですが、さらに理解が深まった気がします。

電子回路がなぜアセンブリ言語につながるのかがピンとこない人は、ぜひ CPUの創りかたを読んでみてください。






2016年7月27日水曜日

16円で月刊C MAGAZINEを2冊購入。Sony Reader Storeの期間限定ポイント有効活用です

電子書籍ストアのSony Reader Storeでは時々200円分くらいの期間限定ポイントがもらえます。





高々200円引きで特にほしくもない本を買うのも本末転倒なので、この手の期間限定ポイントは意外と使い道に困って結局期限切れにしてしまう場合が多いのではないでしょうか。


何かいい使い道がないかと思っていたところ月刊C MAGAZINEが1冊108円で電子書籍化していることを最近知りました。SEやプログラマーの人なら、期間限定ポイント消費にいいんじゃないですかね。



私も今までC MAGAZINEはあまり読んでなかったこともあり、先のReader Storeの200ポイントでC MAGAZINE2冊を購入してみました。


16円でC MAGAZINE2冊です。

楽天Koboでも200円引きクーポンが定期的にもらえますので同様の手が使えそうです。




この手の200円引きクーポンの使い道に困っているSE/プログラマーの人はC MAGAZINE購入で消費してみてはいかがでしょうか。


 ちなみにAmazon kindleでも同様に1冊108円です。


2016年7月24日日曜日

【12ステップで作る組込みOS自作入門】実践記(2)とりあえずHello World表示までできた環境を紹介

書籍「12ステップで作る組込みOS自作入門」で組込みOS実装にチャレンジ中です。

Windows系SEの日記: 【12ステップで作る組込みOS自作入門】Windows 10+Cygwinで実装中

前回で、とりあえずWindows 10+Cygwin上にクロス開発環境を構築し、コンパイルできるところまで確認できました。


■秋月電子からH8/3069Fを購入


秋月電子から

AKI-H8/3069FフラッシュマイコンLANボード: 組立キット 秋月電子通商 電子部品 ネット通販







を購入しました。

12ステップで作る組込みOS自作入門」の内容を試すだけなら、CPUボード [K-01271]単体のほうで問題ないようでしたが、なんとなく単体販売のないマザーボード等色々付属しているほうを購入してみました。

 CPUボード


に加えて、

マザーボード



LCDモジュール


ACアダプタ


その他パーツ一式

が付属してました。

CPUボードはすでに完成品ですが、マザーボードやLCDを使う場合ははんだ付けが必要になるようです。



■Windows 10で使えるUSBシリアル変換ケーブル


開発PCのLAVIE Hybrid ZEROには当然シリアルポートはついてませんので、マイコンと接続するためのUSBシリアル変換ケーブルが必要になります。

Windows 10で使えるUSBシリアル変換ケーブルは複数あるようですが、秋月電子では品切れだったのでとりあえずAmazonからこちらのケーブルを購入しました。

上記ケーブルをUSB接続してみたところ、別途ドライバーをインストールすることなく自動でWindows 10に認識されたようで、COM3をシリアルポートとして使えるようになりました。


H8/3069Fのシリアルポートにも問題なく接続できました。



コンパイルした実行ファイルの転送にはルネサスのツールFDTを使いました。




あとは、書籍の手順通りでHello World!のメッセージをシリアル経由で表示できるところまでは確認できました。


これで「12ステップで作る組込みOS自作入門」の1stステップまで確認できたことになります。

12ステップで作る組込みOS自作入門」では、開発用にシリアルポート付きの古いPCを推奨されてますが、最近のWindows 10ノート+Cygwinでやってみようと思っている人は、上記環境を参考にしてもらえればと思います。






2016年7月18日月曜日

【12ステップで作る組込みOS自作入門】Windows 10+Cygwinで実装中

先日記事にした通り、組込みマイコンに関する職業訓練を受講中です。

Windows系SEの日記: SIerを退職した元SEの組込マイコン職業訓練体験談(1) まずは面接選考突破

せっかくの機会なので、訓練に加えて自分でも組込みプログラミングについて勉強しようということで、組込みに関する書籍「12ステップで作る組込みOS自作入門」を購入してみました。



本書は、H8/3069Fというマイコン上で動作するOSをアセンブリやC言語を使って自分で実装しようという本で、組込みマイコンの勉強用書籍としては有名な本のようです。


■マイコン購入前にまずはクロス開発環境の動作確認から


マイコン上で動作するプログラムを開発する場合、通常はマイコン上で直接開発は行わず、PC上でのクロス開発環境を構築する必要があります。

本書でもクロス環境構築から開設されているのですが、どうもこのクロス開発環境構築でうまくいかない人が多いようです。

H8/3069Fマイコンボード自体は秋月電子で数千円で入手できるので、いきなり購入してしまってもいいのですが、とりあえずクロス環境の構築に成功して最低限のコンパイルができることを確認してからH8/3069Fマイコンボードを購入することにしました。


■まずはCygwinのインストール


クロス開発環境はWindows 10+Cygwin上に構築することにしました。ちなみにWindows 10は以前購入したLAVIE Hybrid ZEROを

(参考)
knakaガジェット情報: LAVIE Hybrid ZERO PC-HZ750BABをビックカメラで注文してみた。今なら33,000円以上のポイント還元の見込です

Windows 10に無償アップデートしたものです。

12ステップで作る組込みOS自作入門」の1stステップの内容に従い、まずはCygwinのインストールから実施しました。

Cygwinのインストール自体は

https://www.cygwin.com/

から64bit版のインストーラをダウンロードして行いました。



なお、デフォルトでは開発用に必要となるbinutils、gcc、makeがインストールされないようなので、以下のようにチェックしてインストールしました。





Cygwinのインストール自体は特に問題なく完了しました。


■gcc コンパイルエラー時の対処方法


上記でインストールしたgccは組込みOSのコンパイルには使わず、あくまでクロス開発に使うbinutilsやgccを別途コンパイルするために使用するとのこと。著者のサイト

http://kozos.jp/books/makeos/

よりソースコードをダウンロードして展開、コンパイルを実施。
binutilsのコンパイルは本書の通りでうまくいったのですが、gccの./configure実施時にこんなエラーが出ました。

$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c
creating cache ./config.cache
checking host system type... ./config.guess: unable to guess system type

This script, last modified 2004-02-16, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from

    ftp://ftp.gnu.org/pub/gnu/config/

If the version you run (./config.guess) is already up to date, please
send the following data and any information you think might be
pertinent to <config-patches@gnu.org> in order to provide the needed
information to handle your system.

何かscriptの内容が古いので上記URLから新しいスクリプトをとってこいということのようで、


ftp://ftp.gnu.org/pub/gnu/config/

から config.guessをダウンロードし差し替えるとコンパイルが通りました。


さらにgcc make時もエラーとなりました。

 ./libgcc2.c: In function `__muldi3':
./libgcc2.c:537: error: unrecognizable insn:
(insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3)
        (const_int 4294967222 [0xffffffb6])) -1 (nil)
    (nil))
./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] エラー 1
make[2]: ディレクトリ '/home/knaka/temp/gcc-3.4.6.tar/gcc-3.4.6/gcc' から出ます
make[1]: *** [Makefile:1261: stmp-multilib] エラー 2
make[1]: ディレクトリ '/home/knaka/temp/gcc-3.4.6.tar/gcc-3.4.6/gcc' から出ます
make: *** [Makefile:23379: all-gcc] エラー 2

こちらは64bit環境での既知のエラーのようで上記著者のサイトに修正パッチがでてました。


■12ステップで作る組込みOS自作入門読み進めていきます


私の環境で発生したエラーは上記程度で、あとは著者のサイトからダウンロードしたHello Worldのソースコードを構築したクロス開発環境で試しにコンパイルしたところあっさりコンパイルできたので、 クロス開発環境はうまく構築できたようです。




なので、 H8/3069Fマイコンボードを購入することにしました。今後「12ステップで作る組込みOS自作入門」を読み進めつつ、組込みOSの実装の様子を記事にしていく予定です。