課題セット
課題 1:レジスタ初期化+加算
目的:即値をロードし、加算して結果を格納する。
.section .text
.global _start
_start:
# x5 に 10 を、x6 に 20 をロード
li x5, 10
li x6, 20
# x7 = x5 + x6
add x7, x5, x6
# 無限ループで終了
loop: j loop
※ li は擬似命令展開されます。
提出内容:このアセンブリファイル(task1.s)、および生成された機械語(バイナリ/オブジェクト)を含める。
確認ポイント:
-
リンク・実行後に x7 に 30 が入るか確認。
-
.objdump -dなどでadd x7, x5, x6命令に展開されているか。
課題 2:ループカウンタ
目的:レジスタを使ったループ処理を実装し、ループ終了後の値をレジスタに保持。
.section .text
.global _start
_start:
li x8, 0 # カウンタ i = 0
li x9, 5 # 上限 N = 5
loop2: beq x8, x9, end2 # if i == N then goto end2
addi x8, x8, 1 # i++
j loop2
end2: mv x10, x8 # x10 = i
j end2
提出内容:アセンブリ task2.s、機械語表示、実行結果として x10 = 5 を確認。
確認ポイント:分岐命令 beq/即値加算 addi の理解。
課題 3:メモリアクセス(ロード/ストア)
目的:データセクションに変数を定義し、ロード・格納操作を行う。
.section .data
var1: .word 7
var2: .word 3
result: .word 0
.section .text
.global _start
_start:
la x11, var1
lw x12, 0(x11) # x12 = var1
la x13, var2
lw x14, 0(x13) # x14 = var2
add x15, x12, x14 # result = var1 + var2
la x16, result
sw x15, 0(x16)
j $
提出内容:task3.s、データセクションの表示、結果変数 result に10が格納されているか確認。
確認ポイント:ロード・ストア命令の理解、アドレス取得。
課題 4:サブルーチン呼び出し
目的:関数(ラベル)を定義して呼び出し、戻り値を使う。
.section .text
.global _start
_start:
li a0, 4
li a1, 9
jal ra, add_two # call add_two(a0, a1)
mv x17, a0 # x17 = return value
j $
add_two:
add a0, a0, a1
ret
提出内容:task4.s、機械語表示、実行後に x17=13 を確認。
確認ポイント:jal/ret(jalr x0, ra, 0に展開)と引数・戻り値規約の理解。
課題 5(発展):条件分岐+比較
目的:2つの即値を比較し、条件に応じて異なるレジスタ値をセット。
.section .text
.global _start
_start:
li x18, 15
li x19, 10
blt x19, x18, smaller
li x20, 100 # x20 = 100 if x19 >= x18
j done
smaller:
li x20, 200 # x20 = 200 if x19 < x18
done:
j done
提出内容:task5.s、機械語表示、実行結果で x20=200 を確認。
確認ポイント:blt/分岐ラベル処理/即値ロード。
? 採点基準
-
正確性(70%):命令が正しく書かれており、目的の動作(レジスタ値/メモリ値)が合っている。
-
機械語/バイナリ確認(15%):アセンブル後のオブジェクト/バイナリ変換と機械語表示(
objdump等)を提出し、命令語の展開を確認。 -
コメント/可読性(10%):コードに適切なコメントが付されていること。
-
拡張説明(5%):各課題で使った命令・即値・ラベルの意味を短く説明した補足があること。
? 解答例(簡略版)
例:課題 1 の一部抜粋
.section .text
.global _start
_start:
addi x5, x0, 10 # x5 = 10
addi x6, x0, 20 # x6 = 20
add x7, x5, x6 # x7 = x5 + x6 = 30
loop: j loop # infinite loop
機械語(例):
0x00000000: 0x00a00293 addi x5, x0, 10
0x00000004: 0x01400313 addi x6, x0, 20
0x00000008: 0x0062b293 add x7, x5, x6
0x0000000c: 0xffdff06f j loop (or equivalent)
(実際のバイナリは環境・リンカスクリプトにより異なります)
補足説明:x0 は常に 0 を保持するレジスタ、addi x5, x0, 10 によって x5 に即値 10 がロードされる。
良いですね。以下は、RISC‑V FPGA(例:Tang Nano 9K + PicoRV32など)セミナーに組み込む形で、「C と C++ の違いを学ぶモジュール構成案(カリキュラム案 + 演習案)」です。
C vs C++ モジュール設計(講習カリキュラム案)
目的とゴール
-
受講者に C と C++ の基本的な違いを経験させ、使い分けの判断力をつける。
-
組み込み/SoC 環境(RISC‑V + FPGA)における 現実的な使いどころを理解させる。
-
小さなプロジェクトを通じて、C の手続き型設計と C++ のオブジェクト指向(またはモジュール化)の利点・トレードオフを体験させる。
カリキュラム構成(1~2日モジュール想定)
以下は、1~2日のセッションに組み込めるモジュール案。
| セッション | 内容 | 方法/演習 | 時間目安* |
|---|---|---|---|
| 導入 (座学) | C と C++ の基本特徴・設計思想の比較 | 講師によるスライド説明 | 30 分 |
| C 基礎復習 | C の手続き型、メモリ管理、関数、構造体 | コード例を使ってレビュー | 30分 |
| C++ 基礎 | クラス、メンバ関数、継承(必要に応じて)、名前空間 | スライド+簡単なクラス例 | 30分 |
| 演習 1:C での設計 | 小さなモジュール(例:UART を使ったメッセージ送信、LED制御、簡易データ構造)を C で実装 | ハンズオン:受講者が C コードを書く | 45分 |
| 演習 2:同じモジュールを C++ で設計 | 演習 1 と同じ機能を C++ クラス + オブジェクト指向で実装 | ハンズオン:C++ コードを書く | 45分 |
| 比較とディスカッション | 実装した C と C++ のコードを比較。コード量、可読性、設計の強み・弱みを議論 | グループディスカッション + レビュー | 30分 |
| 発展/応用演習 | より高度なテーマ(例:スタティックメモリ vs 動的メモリ、スマートポインタまたはメモリ安全性、軽量 C++ 機能) | 演習または講師デモ | 45分〜1時間 |
| まとめと振り返り | C vs C++ の使いどころ、組み込みでの選択基準 | 講師まとめ + Q&A | 15分 |
*時間は目安。講習の長さや受講者スキルによって調整。
演習/課題案
具体的な演習タスク例:
-
UART メッセージ送信モジュール
-
C 実装:
uart_init(),uart_send(char),uart_send_string(const char *)などの関数を C で実装。 -
C++ 実装:
class UART { public: void init(); void send(char); void send(const std::string &s); }のようなクラスを作成。 -
目的:関数 vs メソッド、データのカプセル化(オブジェクト設計)、可読性の比較。
-
-
LED 制御モジュール
-
C でグローバル関数+構造体を使って LED 点滅制御。
-
C++ では
LEDクラスを作成し、その中にメンバ関数on(),off(),toggle()を定義。
-
-
簡易データ構造
-
C:静的配列または構造体を使った “キュー(リングバッファ)”。
-
C++:テンプレート(
template<typename T>)を使ったクラスキュー。必要に応じてメモリ管理を説明。
-
-
メモリ管理/安全性(発展)
-
C:
malloc/freeを使ったリソース確保と解放。 -
C++:スマートポインタ (
std::unique_ptr) を使った同等の操作。または、例外を抑制したスタティックオブジェクト設計。
-
評価・振り返り
-
コードレビュー:受講者同士または講師が、C 実装と C++ 実装を比較。可読性、拡張性、モジュール性などを評価。
-
ディスカッション:
-
「組み込み・FPGA 環境で、C と C++ のどちらを使いたいか?その理由は?」
-
「メモリ制約が厳しい環境では C++ のどの機能を避けるべきか?」
-
-
小レポート:受講者に「C と C++ の利点・欠点」「今後の使用方針(どっちを使うか)」を短くまとめてもらう。
補足ポイント/注意点
-
C++ 標準機能の制限:講習で扱う C++ の機能を限定する(例:例外、RTTI、動的メモリは制限または使用禁止にする)。特に組み込み系ではメモリ・実行コストを考える必要がある。
-
Embedded C++(EC++) の紹介:リソース制約環境で使われる C++ のサブセットについて説明するのも有意義。組み込み用途向けの C++ の現実を理解させられる。 ([Wikipedia より] ウィキペディア)
-
SystemC の触りを少し紹介(オプション):かなり発展的だが、C++ ベースでハードウェア設計/モデリングをする手法として有名。 ウィキペディア
-
言語互換性:C と C++ の互換性・違い(たとえばリテラルの型、
constの扱いなど)を軽くカバー。 ウィキペディア -
実務との関連:C++ を組み込みで使う現場、またそのメリット/注意点を紹介。組み込みエンジニア視点の業界常識を伝える。
このモジュールを組み込むことで、受講者は C の伝統的な組み込みスタイルと C++ のモジュール化/設計性の両方を体験でき、それぞれの強み・使いどころを実践的に理解することができます。
もしよければ、**PicoRV32 + Tang Nano 9K セミナーに特化したサンプルコード(C と C++ 両方)**も設計できます。やりましょうか?
スライド/講義テンプレート案:C と C++ の違い
| スライド | タイトル | キーメッセージと説明ポイント |
|---|---|---|
| スライド 1 | タイトル | 「C と C++ の違い — 組み込み (RISC‑V / FPGA) 視点」:このモジュールで扱うテーマを提示。 |
| スライド 2 | 導入:なぜ両方を学ぶか | – 組み込み/SoC 開発では C がよく使われるが、C++ も有効な場面がある。 – 演習 (UART、LED、ループ など) を通じて、設計思想の違いを体験。 – 両言語を使い分ける力を育てる。 |
| スライド 3 | C 言語の特徴(組み込み向け) | – 手続き型でシンプル、ハードウェアへの低レイヤーアクセスが容易。 – ポインタ操作、アドレス指定が強力。 – メモリ管理は明示的 (malloc / free)。 – 実行時のオーバーヘッドが小さく、リソース制約のある環境に適する。 – 組み込みの現場でも長く使われてきた。 kumikomist.com+1 |
| スライド 4 | C++ の特徴(組み込み視点) | – クラス/オブジェクト指向により、データと振る舞いをまとめられる (カプセル化)。 – テンプレート (template) による抽象化・再利用性。 – スマートポインタ、RAII によるメモリ管理。 – ただし、例外処理や RTTI などは組み込み用途で制限されることがある。 qt.io+1 |
| スライド 5 | トレードオフ比較 | |
| スライド 6 | 組み込みで使うときの注意点 (C++) | – 動的メモリ (new/delete) は慎重に使う。 – 例外 (exceptions) やランタイム型情報 (RTTI) はメモリ/コードサイズへの影響が大きいため制限する設計が多い。 – スマートポインタを使う場合、所有権の設計を明確に。 – 過度な抽象化 (多重継承、仮想関数など) は避け、性能とメモリのバランスを取る。 – 必要に応じて Embedded C++ (EC++) のようなサブセットを使う。 ウィキペディア+1 |
| スライド 7 | 演習課題とのリンク | – 演習で「まず C で実装 → 次に同じ機能を C++ で実装」する。 – 比較ポイントとして、コードの長さ、モジュール構造 (関数 vs クラス)、メモリ管理、実行効率などを見る。 – 実装後、設計選択 (C vs C++) に関するディスカッションを行う。 |
| スライド 8 | 発展テーマ | – EC++ (Embedded C++) の紹介:C++ の便利な機能を残しつつ、小さなランタイムや低オーバーヘッドを実現するサブセット。 ウィキペディア – C++20 のコルーチン (coroutines) など、組み込み向けの最新機能。 arXiv – 組み込み設計パターン (Singleton, Strategy など) の紹介。 – 実務での使われ方:C と C++ をどう使い分けているか。 |
| スライド 9 | まとめ & Q&A | – まとめポイント: 1. C は低レベル制御、予測性、軽量性に優れる 2. C++ は設計の柔軟性、再利用性、安全性 (所有権管理等) に強み 3. 組み込みでは両方を目的に応じて選ぶ力が重要 – Q&A: 質問・意見交換タイム。受講者から実務や設計選択に関する質問を受ける。 |
このテンプレートを使って実際にスライドを作る際の Tips:
-
各スライドに入れる図/図解例:
-
トレードオフ比較のスライドでは、表やアイコン (メモリ、速度、安全性) を使って視覚的に示すとわかりやすい。
-
クラス vs 関数の違いを図 (クラスの構造、メンバ関数) で表現。
-
-
コード例をスライドに載せる:演習で使う C / C++ のサンプルコードをスライドに小さく載せて、「これを実装して比較します」と示す。
-
実務例引用:現場 (組み込み業界) で C と C++ をどう使っているかの事例を入れると、受講者にとって現実味が増す。
もしよければ、PicoRV32 + Tang Nano 9K セミナー向けに、このスライド案をそのまま適用できる PowerPoint (.pptx) ファイル構成(スライドごとのノート、発表者向けコメント付き) を作る想定構成をご提案できます。やりましょうか?
あなた:
ChatGPT:
はい、具体的な PowerPoint (.pptx) 想定のスライド構成+発表者ノート(講師向けコメント付き)案 を以下に示します。
PowerPoint 想定構成案(スライド × 発表者ノート)
以下は 9 枚想定のスライド構成+各スライドに対する講師の発表コメント案です。
| スライド | タイトル | 内容(スライド表示用) | 発表者ノート(講師コメント) |
|---|---|---|---|
| 1 | C vs C++:組み込み / SoC 視点 | タイトルスライド | 「本日は C と C++ の違いを、組み込み/RISC‑V FPGA の観点から考えてみます。」 |
| 2 | なぜ両方を学ぶのか | ・設計思想の違いを知る ・実践演習で使い分けを体験 ・現場で使われる言語の妥当性を判断 |
「組み込み設計において、C は古典的・強力ですが、C++ をうまく使うと設計が整理しやすくなります。今日の演習を通じてその違いを体験してもらいます。」 |
| 3 | C の特徴 (組み込み向け) | ・手続き型設計 ・明示的メモリ管理 (malloc / free) ・低オーバーヘッド ・予測性が高い |
「C は非常にシンプルで、メモリ/処理を明示的に制御できます。特にリソース制約が厳しい組み込み環境で強みを発揮します。」 |
| 4 | C++ の特徴 (組み込み視点) | ・クラス/オブジェクト指向 ・テンプレートによる抽象化 ・スマートポインタ、RAII ・注意すべき機能 (例外、RTTI) |
「C++ の強みは抽象化と再利用性です。ただし、組み込みではすべての機能を使うわけにはいかないことが多いため、使う機能を厳選する必要があります。」 |
| 5 | トレードオフ比較 | —表形式で比較— メモリ制御 / 設計 / 実行コスト / 保守性 |
「ここでは、C と C++ のそれぞれの利点とトレードオフを整理します。組み込み設計での選択は、このトレードオフを理解したうえで行われます。」 |
| 6 | C++ を組み込みで使うときの注意点 | ・ヒープ使用 (new / delete) のリスク ・例外 や RTTI のコスト ・スマートポインタ所有権設計 ・必要に応じて Embedded C++ (EC++) |
「C++ を使うと便利ですが、組み込みではコスト (メモリ・サイズ) に敏感です。例外や RTTI をオフにするなどの設計ルールを設けるのが一般的です。」 |
| 7 | 実習 (演習課題) とのリンク | ・まず C で実装 → 次に C++ で実装 ・比較ポイント:コード量、設計、メモリ、効率 ・ディスカッションテーマ |
「演習では同じ機能を C と C++ で作ってもらい、両者の違いと利点・課題を体験してもらいます。」 |
| 8 | 発展テーマ | ・Embedded C++ (EC++) の紹介 電気電子工学科+1 ・C++20 コルーチン (resource‑constrained 向け) arXiv ・設計パターン (Singleton、Strategy など) ・実務事例 |
「より高度な話として、EC++ やコルーチン、設計パターンの話もできます。これらは組み込み開発で使われる先進的な技術です。」 |
| 9 | まとめ & Q&A | ・C:低レイヤー、明示的制御、予測性 ・C++:設計の柔軟性、安全性 (所有権) など ・両方を使い分ける力が重要 |
「まとめると、C と C++ はそれぞれ強みがあります。設計要件によって使い分けるスキルが重要です。何か質問はありますか?」 |
スライド作成時のデザイン/補足ヒント
-
アイコン・図
-
スライド 5(トレードオフ比較):メモリ、速度、安全性などをアイコン化して視覚に訴える。
-
スライド 4(C++ の特徴):クラス構造の簡単な図やスマートポインタのライフサイクル図を入れると理解しやすい。
-
-
コード例
-
スライド 7 付近で、演習で使う簡単なコード (C の関数 vs C++ クラス) を短く表示し、参加者に演習の全体像を見せる。
-
-
補助資料
-
スピーカーノートに、参考文献 URL(上に挙げた記事など)を載せておくと、質問が来た時に参照可能。
-
必要(または強く推奨される)設計ツール
-
RISC‑V ソフトウェアツールチェイン
-
GNU Toolchain for RISC‑V(GCC, binutils, assembler)
→riscv-gnu-toolchainリポジトリなどを使ってクロスコンパイル環境を整える。 GitHub -
ISA シミュレータ:Spike
→ RISC‑V 命令をシミュレーションして動作確認。riscv-toolsリポジトリに含まれる。 GitHub -
Proxy Kernel (PK)
→ Spike 上でシステムコールをエミュレートするための簡易カーネル。riscv-toolsに含まれる。 GitHub -
テスト・ベンチ用 ISA テスト
→riscv-testsやriscv-opcodesなど、命令の正当性確認に使える。 GitHub
-
-
HDL / FPGA 合成・シミュレーションツール
-
Yosys
→ オープンソース Verilog 合成ツール。FPGA 向け RTL 合成に必須。 GitHub+1 -
nextpnr
→ place-and-route ツール。ベンダー中立 (open-source) でタイミング駆動。 yosyshq.com+1 -
シミュレータ / 検証
-
Verilator:高速 Verilog シミュレーション。Debian パッケージでも提供。 blends.debian.org
-
GHDL (必要であれば VHDL を使う場合):VHDL のシミュレーション。 ウィキペディア
-
-
-
SoC / CPU コア設計フレームワーク(オプション)
-
LiteX
→ Python ベースで RISC‑V ソC を構成するフレームワーク。IP コア(CPU、UART など)を統合しやすい。 arXiv -
Formal/検証ツール (任意)
→riscv-formalなどを使えば、命令セットの正しさや CPU コアの設計検証が可能。 yosyshq.com
-
-
FPGA ベンダー/ツール
-
Gowin IDE(または Gowin EDA ツール)
→ Tang Nano 9K のような Gowin FPGA を使う場合には、Gowin 純正の IDE(合成・配置・書き込みツール)が必要。 IAR の資料でも Gowin Designer を使った方法が紹介されている。 iar.com -
プログラミング / JTAG ツール
→ FPGA にビットストリームを書き込むためのツール。Gowin IDE に付属または併用。
-
-
デバッグ / 波形可視化ツール
-
GTKWave
→ シミュレーション波形 (VCD, FST など) を可視化・分析するためのツール。 -
GDB / デバッグツール
→ RISC-V クロスコンパイラ + Spike を用いたリモートデバッグ (例えばriscv‑gnu‑toolchain+ GDB) を使える。
-
-
補助ツール
-
Python / スクリプト言語
→ スクリプト (ビルド、テスト、シミュレーション制御) を自動化するのに有用。 -
Make / CMake
→ ソフトウェア (C コード) やハード (RTL) のビルド管理。
-
推奨構成例(講習用途向け)
-
ソフトウェア側:
riscv-gnu-toolchain+spike+PK -
ハードウェア側:Yosys + nextpnr + Verilator(または GHDL)
-
FPGA 書き込み:Gowin IDE
-
デバッグ・可視化:GTKWave + GDB
-
設計自動化:Python スクリプト + Makefile
もしよければ、Tang Nano 9K + PicoRV32 講習環境 (GitHub 配布 + スクリプト込み) 向けに推奨ツール&バージョン付きのセットアップ手順を僕が設計できます。やりましょうか?