広告

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で行こうと思います。