【オンラインライブ研修-Zoom-】
リアルタイム組み込みソフトウェア開発の理論と実践(コース(1))
-Cコンパイラ生成アセンブリコードおよびポインタ演算の理解とOSソースコードの読解-
コース番号:348L
日数:3日間
形態:オンライン
この研修の対象者
最新のリアルタイム組み込みソフトウェア開発の理論から実践まで一貫して体系的に学ぼうと考えている組み込み機器の設計者、プログラマ、ソフトウェア・エンジニアの方々に最適です。全ての例をCのプログラムで示すため、受講にはC言語のプログラムの充分な読解力が必要です。具体的には1~2年以上のC言語によるプログラミングの経験が望まれます。
開催日程 |
|
---|---|
時間 | 9:00 - 19:00 |
料金 |
|
受講形態 | オンライン
|
研修コースの概要
IoTの普及にともない、ますます組み込みソフトウェア開発の重要性が高まっています。しかし、そのようなソフトウェアの開発には非常に広範囲な分野にわたる深い知識と技術が必要で、優れた開発者を育てるのは大変難しいことが知られています。このコースは、C言語でリアルタイムの組み込みソフトウェアを設計・実装するのに必要な知識・技術について、理論から実装まで一貫して学ぶことを目的としています。さらにコースを通した演習で、講義で学習した理論・知識・技術を全て駆使し、Lego社Mindstorms EV3®で構築したロボットの制御・駆動系のプログラムを実装します。
本コースは各3日間から成る2つの連続したコースで構成されています。第一部 (コース(1)) は「基礎編」として、組み込みプログラムがOS・プロセッサ上で動作する一貫した流れの中で構築上・実装上でのブラックボックス(不明な部分)を無くすことを目的にしています。第二部 (コース(2))は「応用編」として、ロボットのプログラムを完成させ、コースで学習した理論・知識が実装・実践へと繋がることを確認します。
一般的に組み込み機器のプログラム開発においては、「コンパイラ」及び「OS」がブラックボックスとなっており、それらの部分で問題が起こると対処できない状況に陥る場合が多いと思います。コース(1)ではその2つの部分に焦点を当て、コンパイラの生成するアセンブリコード及びOSの実装レベルでの理解を深めます。その学習の必要性、目的、そしてコースのゴールは以下のようにまとめることができます。
- C言語が、OS、デバイスドライバ―、IoT等のハードウェアとのインターフェース部のプログラミングに今後とも長く使い続けられる理由はC言語の「高級アセンブリ言語」としての役割にあります。従ってC言語のプログラマとしてはC言語を「高級アセンブリ言語」として使いこなせるレベルの知識が必須です。それは ①Cコンパイラの生成アセンブリコードを解読・理解でき、そして ②必要な部分はアセンブリ言語で記述でき、それらを自在にC言語とリンクできる知識・技術を身に付けることです。
- C言語でのプログラミングで最も問題になるのはポインター演算ですが、そのポインター演算の完全な理解をします。これによりどのような複雑なポインタの定義も間違いなくできるようになります。またポインター定義・演算にバグがあった場合、どの時点でどのようにプログラムがクラッシュするかまで理解でき、またそのバグを必ず修正できるようになります。さらに、Cコンパイラーがポインター演算に対して生成するアセンブリコードまで完全に解読できるようになります。
- 今後は一般的なアプリケーション、組み込み機器を問わず並行プログラムが標準となります。並行プログラムの開発にはOSの役割及びその動作の深い理解、特に実装のソースコードレベルでの理解は大変役に立ちます。またOSのソースコードはハードウェアとのインターフェース部のプログラミングやCとアセンブリのコードのリンク法等のプログラム例としても最適で、その読解による学習効果は大変大きいです。
- IoTのようにネットワークにつながるシステムの場合、セキュリティは大変重要になりますが、コンピュータウィルス等は(ソースコードではなく)実行プログラムの改ざんを行うので、高信頼性・安全性システムの開発には上記のアセンブラレベルでのプログラムの動作の理解、及びソースコードレベルでのOSの実装の理解が必須です。
講義では、1つ1つの学習項目の理解のために必要なことを全てボトムアップで説明していきます。また説明にあたり、多くの例を用意していますが、全ての例は「実際に動作するきれいなCのコード」により示します。従って組み込み機器開発についてのバックグラウンドが無くても、Cのコードの読解力があれば内容をしっかり理解できます。
このコースは2部構成であり、コース(1)、コース(2)と順に受講することで、講師の長年にわたる組み込み機器開発の経験に基づく組み込みソフト開発に必要な知識を全て学ぶことができます。従って、この一連のコースで得た知識を基にOJTで経験を積んでいけば、組み込み・IoTの技術者として充分な実力が付くことを確信します。
事前確認セッションについて
- 研修当日にスムーズに演習を行うため、研修で使用する仮想環境へのアクセス・プログラム実行などについて事前に動作確認を行う「事前確認セッション」へのご参加をお願いします。
この研修(コース(1))では次のスキルが習得できます
- コンピュータの基本構成と動作の概要(レジスターマシン/アキュムレータマシン)
- コンパイラ生成のアセンブリコードの理解とアセンブリとCのコードのリンク法
- コンパイラの生成コードの原理(C言語の各変数クラスとメモリへの割り付け法、スタック・フレームの構成等)
- アキュムレータマシンの例としてx86(32-bit Pentium)のレジスタ構成・アドレス法を学び、VC++_x86 の生成アセンブリコードを理解
- 注意:レジスターマシンの例としてARMのレジスター構成・アドレス法、gccコンパイラーの生成アセンブリコードについての学習はコース(2)で行う
- リアルタイム組み込み機器開発に必須な知識であるプロセス/スレッドの概念、並行プログラム、同期の基礎を学習
- リアルタイム組み込み機器開発に必須な知識であるプロセス/スレッドの概念、並行プログラム、同期の基礎を学習
- 改訂brickOS注1,注2のソースコードの主要な部分を解読し、OSの内部の構造及び動作の詳細を実装レベルで理解
- brickOS:初代Lego RCX用のオープンソースのH-8用のOSでリアルタイム制御に必要な機能をほぼ全て(完全ではないが)実装してあり、大変きれいに書かれていて、しかも主要部分を一日で読解できる大きさのためOSの実装レベルの学習に最適
- 改訂brickOS:brickOSを他のプロセッサに移植するために講師が以下の改訂を行ったプログラム
- プロセッサ依存/非依存コードの分離、アセンブリコードの最小限化(C言語でできることは全てC言語で記述する)、コードのさらなる簡潔化
- 改訂brickOSをx86・gccによるCygwin32のプロセス上に移植したプログラム注3の【1】TCB(スレッド・コントロール・ブロック)、【2】スレッドの状態セーブ/ディスパッチ、【3】レディーキューの管理、【4】スケジューラ、【5】同期プリミティブの実装をコードレベルで理解。またCとアセンブリのコードが協調し合う部分を実例で理解
- 改訂brickOSを複数のプロセッサに直接移植するのは開発・講義環境の点で難しいので、それぞれのプロセッサ上で実装されているLinux(あるいはCygwin)のプロセスへの移植を行った。
- コース(2)で改訂brickOSのx_64(64-bit Pentium)及びARMのLinuxプロセスへの移植を学習する。
コース内容
午前 | 午後 | |
---|---|---|
1日目 | コンピュータの基本構成 レジスターマシン/アキュムレータマシン |
コンパイラ生成のアセンブリコードの理解 VC++_x86(32-bit Pentium) アセンブリコードとCコードのリンク法 |
2日目 | C言語ポインター演算の完全理解 | OSの基礎 プロセスとスレッド、同期(セマフォとその応用) |
3日目 | brickOS(初代Lego RCXのために開発されたオープンソースのH-8用のOS)をx86に移植したOSのソースコードの解読 OSの実装をソースコードのレベルで理解する |