リアルタイム組み込みソフトウェア開発の理論と実践(1)
-Cコンパイラ生成アセンブリコードおよびポインタ演算の理解とOSソースコードの読解-
コース番号:348L
日数:3日間
形態:ハンズオン

この研修の対象者

最新のリアルタイム組み込みソフトウェア開発の理論から実践まで一貫して体系的に学ぼうと考えている組み込み機器の設計者、プログラマ、ソフトウェア・エンジニアの方々に最適です。全ての例をC言語のプログラムで示すため、受講にはC言語のプログラムの充分な読解力が必要です。具体的には1~2年以上のC言語によるプログラミングの経験が望まれます。

開催日程
  • 2019/12/11(水)-13(金)開催確定
    (早割適用締切:11/11)
時間 9:30 - 18:00
料金(税抜)
  • (早割) 168,330円
  • (通常) 181,000円
※価格表示は税抜です
会場 弊社 神保町 セミナールーム »

研修コースの概要

IoTの普及にともない、ますます組み込みソフトウェア開発の重要性が高まっています。しかし、そのようなソフトウェアの開発には非常に広範囲な分野にわたる深い知識と技術が必要で、優れた開発者を育てるのは大変難しいことが知られています。このコースは、C言語でリアルタイムの組み込みソフトウェアを設計・実装するのに必要な知識・技術について、理論から実装まで一貫して学ぶことを目的としています。さらにコースを通した演習で、講義で学習した理論・知識・技術を全て駆使し、Lego社Mindstorms EV3®で構築したロボットの制御・駆動系のプログラムを実装します。

本コースは各3日間から成る2つの連続したコースで構成されています。第一部 (コース(1)) は「基礎編」として、組み込みプログラムがOS・プロセッサ上で動作する一貫した流れの中で構築上・実装上でのブラックボックス(不明な部分)を無くすことを目的にしています。第二部 (コース(2))は「応用編」として、ロボットのプログラムを完成させ、コースで学習した理論・知識が実装・実践へと繋がることを確認します。

一般的に組み込み機器のプログラム開発においては、「コンパイラ」および「OS」がブラックボックスとなっており、それらの部分で問題が起こると対処できない状況に陥る場合が多いと思います。コース(1)ではまずその2つの部分に焦点を当て、コンパイラの生成するアセンブリコードおよびOSの実装レベルでの理解を深めます。その学習の必要性、目的、そしてコースのゴールは以下のようにまとめることができます。

  1. C言語が、OS、デバイスドライバ、IoT等のハードウェアとのインターフェース部のプログラミングに今後とも長く使い続けられる理由はC言語の「高級アセンブリ言語」としての役割にあります。従ってC言語のプログラマとしてはC言語を「高級アセンブリ言語」として使いこなせるレベルの知識が必須です。それは ①Cコンパイラの生成アセンブリコードを解読・理解でき、そして ②必要な部分はアセンブリ言語で記述でき、それらを自在にC言語とリンクできる知識・技術を身に付けることです。
  2. C言語でのプログラミングで最も問題になるのはポインタ演算ですが、そのポインタ演算を完全に理解します。これによりどのような複雑なポインタの定義も間違いなくできるようになります。またポインタのバグがあった場合、どの時点でどのようにプログラムがクラッシュするかまで理解でき、またそのデバッグを必ず修正できるようになります。さらに、Cコンパイラがポインタ演算に対して生成するアセンブリコードまで完全に解読できるようになります。
  3. 今後は一般的なアプリケーション、組み込み機器を問わず並行プログラムが標準となります。並行プログラムの開発にはOSの役割およびその動作の深い理解、特に実装のソースコードレベルでの理解は大変役に立ちます。またOSのソースコードはハードウェアとのインターフェース部のプログラミングやCとアセンブリのコードのリンク法などのプログラム例としても最適で、その読解による学習効果は大変大きいです。
  4. IoTのようにネットワークにつながるシステムの場合セキュリティは大変重要になりますが、コンピュータウィルス等は(ソースコードではなく)実行プログラムの改ざんを行うので、高信頼性・安全性システムの開発には上記のアセンブラレベルでのプログラムの動作の理解、およびソースコードレベルでのOSの実装の理解が必須です。

講義では、1つ1つの学習項目の理解のために必要なことを全てボトムアップで説明していきます。また説明にあたり、多くの例を用意していますが、全ての例は「実際に動作するきれいなCのコード」により示します。従って組み込み機器開発についてのバックグラウンドが無くても、Cのコードの読解力があれば内容をしっかり理解できます。

この2部構成のコースを(1)、(2)と順に受講することで、講師の長年にわたる組み込み機器開発の経験に基づく組み込みソフト開発に必要な知識を全て学ぶことができます。従って、この一連のコースで得た知識を基にOJTで経験を積んでいけば、組み込み・IoTの技術者として充分な実力が付くことを確信します。

この研修では次のスキルが習得できます

  • コンピュータの基本構成と動作の概要(レジスターマシン/アキュムレータマシン)
  • コンパイラ生成のアセンブリコードの理解とアセンブリとCのコードのリンク法
    • コンパイラの生成コードの原理(C言語の各変数クラスとメモリへの割り付け法、スタック・フレームの構成等)
    • アキュムレータマシンの例としてx86(32-bit Pentium)のレジスタ構成・アドレス法を学び、VC++_x86 の生成アセンブリコードを理解
  • ポインタ演算の完全な理解
  • リアルタイム組み込み機器開発に必須な知識であるプロセス/スレッドの概念、並行プログラム、同期の基礎を学習
  • brickOSのソースコードの主要な部分を解読し、OSの内部の構造及び動作の詳細を実装レベルで理解
    • brickOS:初代Lego RCX用のオープンソースのH-8用のOSでリアルタイム制御に必要な機能をほぼ全て(完全ではないが)実装してあり、大変きれいに書かれていて、しかも主要部分を一日で読解できる大きさのためOSの実装レベルの学習に最適
    • ここではbrickOSを筆者がLinuxのALARM signal機能を使いLinux上のプロセスに移植したOSを解読(移植にあたり、プラットフォーム依存/非依存コードの完全な分離、アセンブリコードの最小限化〔C言語でできることは全てC言語で記述する〕、コードのさらなる簡潔化を行った)
    • コース(1)ではx86のCygwinに移植したbrickOSを解読する(後半のコース(2)でx64(64-bit Pentium)やARMプロセッサのアーキテクチャーおよびbrickOSのそれらのプロセッサへの移植を学習するが、それぞれのハードウェアに直接brickOSを実装するのは開発環境の点で難しいので、それぞれのプロセッサ上で実装されているLinuxのプロセス上への移植を行った)
    • TCB(スレッド・コントロール・ブロック)、スレッドの状態セーブ/ディスパッチ、レディキューの管理、スケジューラ、同期プリミティブの実装をコードレベルで理解。またCとアセンブリのコードが協調し合う部分を実例で理解

コース内容

  • コンピュータの基本構成
    • レジスタマシン/アキュムレータマシン
  • コンパイラ生成のアセンブリコードの理解
    • VC++_x86(32-bit Pentium)
  • アセンブリコードとCコードのリンク法
  • C言語の配列・ポインタ演算の完全理解(演習)
  • OSの基礎
    • プロセスとスレッド、同期(セマフォとその応用)
  • Cygwin32 x86 gcc生成のアセンブリコード、割り込みメカニズム、そしてPosix Signalの理解
  • brickOS(初代Lego RCXのために開発されたオープンソースのH-8用のOS)をx86に移植したOSのソースコードの解読
    • OSの実装をソースコードのレベルで理解する