広告

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