職業訓練
https://qiita.com/kaizen_nagoya/items/95368b63fa21d64271ec
Programmer, Day 15
https://qiita.com/kaizen_nagoya/items/b1b1fc9a3eb0ff474c86
C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1
C言語を習得する3つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b
Programmer, Day 17
MCP入門 〜面倒なことはAIエージェントにやらせよう〜 を聞きながら
https://qiita.com/kaizen_nagoya/items/54b648c838fae8d57e38
職業訓練(IT) オープンソースとユーザビリティ教育。構造化とUMLを使って。
https://qiita.com/kaizen_nagoya/items/c41988c2f8ce1b61a08a
名古屋Reject会議 ふたたび
https://qiita.com/kaizen_nagoya/items/d35d2de4a35abb797126
Qiita Tech Festa 2025 自己記事一覧
https://qiita.com/kaizen_nagoya/items/83f7b7d9609d6789dc3a
<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words and/or centences in order.
Este artículo no está completo. Agregaré algunas palabras en orden.
MISRA C
MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
Misra Example Suite at docker コンパイル完了までの道のり。docker(154) error(56)
https://qiita.com/kaizen_nagoya/items/71f04a0204d5a1114577
一つづつMISRAが作成した直したソースは別に解説します。
docker(201) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(1) D_04_03.c
https://qiita.com/kaizen_nagoya/items/780be9109348340e20e0
docker(202) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(2) R_02_02.c
https://qiita.com/kaizen_nagoya/items/496869b87dd3d29cea8b
docker(203) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(3) R_05_03.c
https://qiita.com/kaizen_nagoya/items/cb0d1da183f4f1e9e59d
docker(204) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(4) R_07_04.c
https://qiita.com/kaizen_nagoya/items/73b9f16638273a74d807
docker(205) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(5) R_08_04.c
https://qiita.com/kaizen_nagoya/items/c753db14cc95a9303fa5
docker(206) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(6) R_09_0x.c
https://qiita.com/kaizen_nagoya/items/8ad38c8728440688255c
docker(207) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(7) R_10_0x.c
https://qiita.com/kaizen_nagoya/items/05dd6f6c14aeafbe3e71
docker(208) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(8) R_11_0x.c
https://qiita.com/kaizen_nagoya/items/9962647a1b510825fa6e
docker(209) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(9) R_13_0x.c
https://qiita.com/kaizen_nagoya/items/dcd2de1267e3c3449536
docker(210) gcc(gnu), clang(llvm)コンパイルエラー・警告比較(10) R_14_0x.c
https://qiita.com/kaizen_nagoya/items/772f49486e7cca1dbeb9
gcc(gnu), clang(llvm)コンパイルエラー・警告比較(12) R_17_03.c, docker(165) error(50) https://qiita.com/kaizen_nagoya/items/f85e29050b99ea1c2538
Day 16
構造化
イラストの著作権など
https://qiita.com/kaizen_nagoya/items/409089d995514b5adccf
CISCO router DNS, docker, Web by ChatGPT
https://qiita.com/kaizen_nagoya/items/5dfd7f97cb07d98e9f18
JMAAB制御モデリングガイドライン by ChatGPT
https://qiita.com/kaizen_nagoya/items/8b828c64387b2c4155c7
プログラマ3年で社長事業
https://qiita.com/kaizen_nagoya/items/6b9eb7f026079702dff3
プログラマ3年で社長事業(未成年編)
https://qiita.com/kaizen_nagoya/items/60c4e79e65f0b9b32f46
プログラマ3年で社長事業(未成年編) 博士論文支援追加
https://qiita.com/kaizen_nagoya/items/326452b5bf29c144c307
学習と就職 by ChatGPT
https://qiita.com/kaizen_nagoya/items/b3c46dab1d188790f4fc
鳴潮 枠組み利用のプログラミングか、ゲームの中にプログラミング要素を入れるか
https://qiita.com/kaizen_nagoya/items/35e777726c83d51fbf33
Apple ipadのAI機能 by ChatGPT
https://qiita.com/kaizen_nagoya/items/b95222c573e3fa5d7ca8
Apple AIハードウェア by ChatGPT
https://qiita.com/kaizen_nagoya/items/ce53f750d95d2832829f
CISCOのルータを操るやり方。by ChatGPT
https://qiita.com/kaizen_nagoya/items/29d40e626d9745b2fbdf
CCNA (Cisco Certified Network Associate)対策問題集300 (LogicStack Media)
https://qiita.com/kaizen_nagoya/items/68ba54419f702d98b65b
自動車用ソフトウェアのMILS, SILS, HILS, DriverInTheLoopSimulator, テストコース試験、公道試験の目的と成果について紹介してください。
https://qiita.com/kaizen_nagoya/items/cf2671876473f4ea6cce
SDA(audio), SDR(Radio), SDN(networking) and SDV(software defined vehicle) by ChatGPT
https://qiita.com/kaizen_nagoya/items/cca61da38485ac558123
プログラマ必須科目 ChatGPTにも確認
https://qiita.com/kaizen_nagoya/items/7b30d9d119792130facd
ChatGPT利用の技4つ with ChatGPT
https://qiita.com/kaizen_nagoya/items/4a178bd6a09a4a471a7f
wikipediaの記述の偏り 現状と解決策 by ChatGPT
https://qiita.com/kaizen_nagoya/items/5bc695bfc3f718e47eb2
PowerPoint 筋書き(outline), 見直し(review), 見栄え加工 by ChatGPT
https://qiita.com/kaizen_nagoya/items/37bb97fc250fca37295b
ちょけねこ たんじょうびのおくりもの and HAZOP powered by ChatGPT
https://qiita.com/kaizen_nagoya/items/a3b00eaa33355a82746b
設計 仕様 制約 AI利用開発の鍵 by ChatGPT
https://qiita.com/kaizen_nagoya/items/1b9cb2f9d26308d84791
Mermaid調べ始めた。timing diagram対応 by ChatGPT
https://qiita.com/kaizen_nagoya/items/dcfe80ad1fab1f22ff4b
Linux, SSH and cygwin Powered by ChatGPT
https://qiita.com/kaizen_nagoya/items/4863d3fc03fa139b5015
Cの精神と「全部読まなきゃ病」との戦い by ChatGPT
https://qiita.com/kaizen_nagoya/items/34ab5ae63b34c6bc12e6
Cloud computing standard list 更新 by ChatGPT
https://qiita.com/kaizen_nagoya/items/60a495506269505bfd71
Software Factory from Japan by ChatGPT
https://qiita.com/kaizen_nagoya/items/566ce586bb23423464f4
技術者は英語を学ぶ必要はない。英単語の羅列でいい=プログラム。
https://qiita.com/kaizen_nagoya/items/4fc3963a21e0339fd1c9
C言語を習得する3つの方法 ChatGPT
https://qiita.com/kaizen_nagoya/items/4a3518a18fa49f46787f
C言語(C++)が必要な人、必要ない人 ChatGPT
https://qiita.com/kaizen_nagoya/items/a074cb8cd292d8d94bd4
ChatGPTから学ぶ 3倍褒めて3分の1貶す
https://qiita.com/kaizen_nagoya/items/91e70fd8caa25076718b
猫中心設計から鳥中心設計へ part2
https://qiita.com/kaizen_nagoya/items/4d7a5a33c85e0b01dc5d
apple silicon, apple Intelligence
https://qiita.com/kaizen_nagoya/items/1ba3c921ec01782a2b20
AIシステムの中に、AI機能と、非AI機能に分けて表現してみる。
ルータ 構成要素図
https://qiita.com/kaizen_nagoya/items/81e8ebb258fea1393f06
ChatGPT
Programmer, Day 16 https://qiita.com/kaizen_nagoya/items/5a8002983d2681b56773 の構造化の先が、今日の授業の概要です。どんなことを教えるといいでしょうか。
ChatGPT:
こちらの記事「Programmer, Day 16」(投稿日:2025年8月27日)では、「Day 16」のテーマとして 構造化 が挙げられており、講義の概要として「Cの精神」や「DoCAP」(職業訓練における体系)にも関連していることがわかります
Qiita
。
今日の授業テーマ:構造化(Structured Programming)を深めよう
- 「構造化プログラミング」とは?その思想と背景
なぜ構造化が登場したのか(例えば、ゴートゥーの弊害など)、手続き型プログラミングとの違い、制御フローの明確さを強調。
小さな関数・モジュールを組み合わせて、大きなプログラムを安全かつミスが少ない形で構成する考え方。
- 「Cの精神」と構造化との関係
C言語の設計思想における「明快でシンプルな構造」を支える構造化の重要性を紹介。
→ 「Cの精神」が構造化に支えられている、という点に触れると理解が深まります
Qiita
。
- DoCAP と構造化の実践的応用
DoCAP(職業訓練の文脈)における構造化の役割。例えば、大規模なシステムを設計・保守する際に、部品ごとに分解し構造化する重要性を解説。
UMLやモジュール分割による設計支援も併せて紹介すると実践的。
- 具体的なコード例やワークショップ
典型的な構造化の良いコード例(明確な関数、早期 return、分岐の制御)を示し、生徒とディスカッション。
簡単な C コードを例に、構造化前/後を比較してみる活動もおすすめ。
- 構造化のメリットと限界も整理
メリット:保守性の向上、バグの局所化、理解・レビューのしやすさ。
限界:小さすぎるメソッドの乱用による可読性低下、防御的プログラミングとの相性など。
- 発展的トピック(時間があれば)
モダンな手法との共通点(例:関数型プログラミングでの純粋性、リファクタリングによる構造化の応用)。
継続的レビューやDevOps環境での自動チェックなど、生産性に直結する構成管理も紹介できます(※参考:Day 14で言及されていたレビュー計画やツールの自動化も参考になります)
Qiita
。
講義の流れイメージ(例)
項目 内容
導入 構造化の定義と「Cの精神」との関連
理論 なぜ構造化するのか、歴史背景(ゴートゥーなど)
実践 コード例、リファクタリング演習
応用 UMLやモジュール設計での構造化
まとめ メリット・限界、実務での活かし方まとめ
発展 DevOps、自動レビューとの連携(時間があれば)
この構成で授業を進めると、理論と実践の両面から「構造化プログラミング」の本質を学びやすくなります。特に、Day 16で示されている「構造化」と「Cの精神」、そしてDoCAPという文脈を融合させることで、プログラマとしての思考力が養われる構成になると思います。
他にも取り入れたいトピックや、学習者のレベルに合わせた応用などがあれば、気軽に教えてください!
あなた:
Cの精神がわかるためのソースコード例をお示しください。
ChatGPT:
いい質問です!
「Cの精神」が表れているコード例は、「プログラマが意図してやろうとすることを妨げない」シンプルで明快な記述 です。
ここでは 3 段階の例で示します。
例1: 最小限の「Hello, world」
#include
int main(void) {
printf("Hello, world\n");
return 0;
}
ヘッダを #include するだけで、標準出力が使える。
main 関数はシンプル、複雑な初期化不要。
「余計なものがない」=Cの精神の第一歩。
例2: 構造化の基本 – 配列の平均を計算
#include
double average(int *arr, int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i]; // シンプルなループと配列アクセス
}
return (double)sum / n;
}
int main(void) {
int data[] = {10, 20, 30, 40, 50};
int n = sizeof(data) / sizeof(data[0]);
printf("Average = %.2f\n", average(data, n));
return 0;
}
ポインタと配列のシンプルな関係がそのままコードになる。
「配列の大きさは自分で計算せよ」という自由度(余計な抽象化をしない)。
for ループはわかりやすく直線的な制御フロー。
例3: システム資源への直接アクセス
(Cの精神がよく現れる例)
#include
int main(void) {
FILE *fp = fopen("data.txt", "w");
if (!fp) {
perror("fopen");
return 1;
}
fprintf(fp, "C allows direct file I/O\n");
fclose(fp);
return 0;
}
OS のリソース(ファイル)を 直接扱える自由。
例外処理やガードが「自分で書ける」。
「余計な制約を課さず、必要なら全部プログラマが制御できる」=Cらしさ。
まとめ
最小限で動く(Hello world)
シンプルで構造化できる(平均計算)
ハードやOSに近い自由さ(ファイルアクセス)
これらが「Cの精神」を感じられるソースコード例です。
👉 ご希望なら、もう一歩踏み込んで 「Cの精神が表れた悪い例(アンチパターン)」→「良い例」 の対比で解説することもできますが、それも見てみたいですか?
あなた:
はい。お願いします。
ChatGPT:
ありがとうございます!
では「Cの精神」を理解しやすくするために、悪い例(アンチパターン) と 良い例 を対比して示します。
Cらしさは「余計な抽象化や複雑さを避け、シンプルにプログラマの意図を表現する」ことです。
例1: ループ処理の書き方
❌ 悪い例(Cらしくない)
#include
int main(void) {
int data[5] = {10, 20, 30, 40, 50};
int i = 0;
int sum = 0;
while (1) { // 無限ループ
if (i >= 5) break; // 複雑な制御
sum = sum + data[i];
i++;
}
printf("Average = %d\n", sum / 5);
return 0;
}
意図が不明確(無限ループからの break)。
冗長な書き方で読み手に負担をかける。
「シンプルな構造化」を妨げている。
✅ 良い例(Cの精神に沿った構造化)
#include
int main(void) {
int data[5] = {10, 20, 30, 40, 50};
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += data[i]; // 直線的で明快
}
printf("Average = %d\n", sum / 5);
return 0;
}
for により「0から4まで繰り返す」という意図が明確。
不要な break や無駄な変数を排除。
シンプルで読みやすく、意図が伝わる。
例2: ファイル処理
❌ 悪い例(Cらしくない)
#include
int main(void) {
FILE *fp;
fp = fopen("out.txt", "w"); // エラー処理なし!
fprintf(fp, "Hello\n"); // fp が NULL でも動こうとする
fclose(fp); // クラッシュの可能性
return 0;
}
リソースエラーを無視している。
「プログラマが本来やりたいこと(安全に書き込み)」を妨げている。
✅ 良い例(Cの精神に沿ったシンプルな制御)
#include
int main(void) {
FILE *fp = fopen("out.txt", "w");
if (!fp) {
perror("fopen"); // OS のエラーをそのまま表示
return 1; // 意図的に終了
}
fprintf(fp, "Hello\n");
fclose(fp);
return 0;
}
自由度を保ちつつ、安全性も確保。
エラー時にどうするかをプログラマが制御できる。
「やりたいことを邪魔しないが、責任は自分で持つ」Cらしさ。
例3: 構造体とポインタ
❌ 悪い例(Cらしくない、過剰な抽象化)
#include
struct Point {
int x, y;
};
int addX(struct Point p1, struct Point p2) {
return p1.x + p2.x; // 値渡しで非効率
}
int main(void) {
struct Point a = {1, 2};
struct Point b = {3, 4};
printf("%d\n", addX(a, b));
return 0;
}
構造体を値渡ししてコピーが発生、意図が不明瞭。
「効率」と「意図の明快さ」を損なう。
✅ 良い例(Cの精神に沿った自由な書き方)
#include
struct Point {
int x, y;
};
int addX(const struct Point *p1, const struct Point *p2) {
return p1->x + p2->x; // ポインタ利用で効率的
}
int main(void) {
struct Point a = {1, 2};
struct Point b = {3, 4};
printf("%d\n", addX(&a, &b));
return 0;
}
ポインタを通じて必要な部分だけ扱う。
プログラマが「効率を意識して制御できる」自由さ。
余計な抽象化がない。
まとめ
悪い例 → 不要に複雑、冗長、安全性を無視、効率を損なう。
良い例 → シンプルで明快、自由度を保ちながらプログラマが制御できる。
これが「Cの精神」の核である
👉 プログラマが意図してやろうとすることを妨げない
という考え方につながります。
ご希望なら、次のステップとして「Cの精神 vs 他言語(例: JavaやPython)」を比較したコード例をお見せできますが、それもご覧になりますか?
あなた:
ありがとうございます。お示しいただいたのは、Hosted環境のみで、組み込み構造化の授業では、Freestanding環境の例が必要です。お願いできますか。
ChatGPT:
なるほど!
確かにこれまで示したのは Hosted 環境 (標準ライブラリが前提) での例でした。
組込み構造化の授業では、Freestanding 環境 (ライブラリなし、OSなし前提) の例が必要ですね。
Freestanding では、
stdio.h のような標準ライブラリを使わない
main() の定義すら任意(C規格では main は必須でない)
ハードウェアレジスタやメモリマップに直接アクセス
割り込みベクタや初期化ルーチンが自分で必要
といった特徴があります。
以下、授業で示しやすい 構造化プログラミング的なFreestanding例 をまとめました。
例1: メモリマップトI/Oを使ったLED点滅
// Freestanding 環境用 (標準ライブラリなし)
#define GPIO_BASE 0x40020000U // 例: GPIO ポートのベースアドレス
#define GPIO_MODER (*(volatile unsigned int )(GPIO_BASE + 0x00))
#define GPIO_ODR ((volatile unsigned int *)(GPIO_BASE + 0x14))
// 構造化: 関数で役割を分割
void gpio_init(void) {
GPIO_MODER |= (1U << 10); // 例: GPIOx pin5 を出力に設定
}
void led_on(void) {
GPIO_ODR |= (1U << 5);
}
void led_off(void) {
GPIO_ODR &= ~(1U << 5);
}
void delay(volatile unsigned int count) {
while (count--) {
// 何もしない (ビジーループ)
}
}
int main(void) {
gpio_init();
while (1) {
led_on();
delay(100000);
led_off();
delay(100000);
}
}
ポイント
標準ライブラリ不要。
関数で「初期化」「ON」「OFF」「遅延」を分ける → 構造化。
「Cの精神」=ハードを直接制御できる自由、かつ分かりやすい構造。
例2: 割り込みハンドラの構造化
// ベクタテーブルの先頭に配置される割り込みハンドラ (例: ARM Cortex-M)
void Reset_Handler(void);
void Default_Handler(void);
attribute((section(".isr_vector")))
void (* const g_pfnVectors[])(void) = {
Reset_Handler, // リセット時
Default_Handler, // NMI
Default_Handler, // HardFault
// ... 他の割り込みもここに並ぶ
};
void Reset_Handler(void) {
main(); // Cランタイム初期化後に main へ (本来は .data/.bss の初期化も必要)
}
void Default_Handler(void) {
while (1) {
// 想定外の割り込みを捕捉して無限ループ
}
}
int main(void) {
// 組込みアプリの本体
while (1) {
// メイン処理
}
}
ポイント
Hosted では隠される「起動シーケンス」を自分で記述する。
Reset_Handler → main の流れを 構造化されたエントリーポイント として示せる。
OSに頼らず、自分で必要な仕組みを組み立てられる自由 がCの精神。
例3: 組込みでの構造体によるレジスタ操作
// ペリフェラルのレジスタを構造体でマッピングする例
typedef struct {
volatile unsigned int MODER;
volatile unsigned int OTYPER;
volatile unsigned int OSPEEDR;
volatile unsigned int PUPDR;
volatile unsigned int IDR;
volatile unsigned int ODR;
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *)0x40020000U)
void gpioa_pin5_output(void) {
GPIOA->MODER |= (1U << 10); // PA5 を出力に設定
}
void gpioa_pin5_toggle(void) {
GPIOA->ODR ^= (1U << 5);
}
int main(void) {
gpioa_pin5_output();
while (1) {
gpioa_pin5_toggle();
for (volatile int i = 0; i < 100000; i++);
}
}
ポイント
レジスタ定義を構造体にすることで構造化。
可読性・保守性が向上。
直接アクセスの自由度は保たれる。
授業で強調できること
Hosted と違い「ライブラリがない環境で自分ですべて組み立てる」ことを体験する。
関数分割・構造体定義 によって「構造化プログラミング」が役立つことを実感できる。
Cの精神 = 「プログラマが自由にハードを扱えるが、設計者が責任を持って構造化する」こと。
👉 この流れなら、授業では
最初に「HostedのHello world」→
次に「FreestandingでLED点滅」
と段階的に見せると、「Cの精神」が Hosted/Freestanding 両面で理解されると思います。
ご質問ですが、授業の対象は マイコン(ARM Cortex-Mなど)実機を想定 されていますか?
それとも シミュレータ/抽象的なFreestanding環境 を前提にしましょうか?
あなた:
はい。お願いします。
ChatGPT:
了解しました 👍
では、授業向けに Freestanding環境の構造化プログラミング例 を、
シミュレータ/抽象環境で示せる簡単な例
実機(ARM Cortex-M等のマイコン)を想定した例
の両方で整理してみます。
- シミュレータや抽象Freestanding環境での例
標準ライブラリなし・OSなしを想定して「メモリ上のレジスタを模したLED制御」を行います。
(PC上でもクロスコンパイルしてシミュレーション可能)
// 仮想レジスタ定義 (シミュレータ用)
volatile unsigned int LED_PORT;
// 関数ごとに役割を分けて「構造化」
void led_on(void) {
LED_PORT = 1;
}
void led_off(void) {
LED_PORT = 0;
}
void delay(volatile unsigned int count) {
while (count--) {
// 何もしない
}
}
int main(void) {
while (1) {
led_on();
delay(100000);
led_off();
delay(100000);
}
}
ポイント
標準ライブラリ (stdio.h など) 不使用 → Freestanding
レジスタを 抽象変数で模擬 → シミュレーション可能
関数分割 により「構造化」の意味を明示できる
- 実機(ARM Cortex-M, STM32など)を想定した例
実際のマイコンでは、レジスタを構造体でマッピングしてアクセスします。
// GPIOポートの構造体定義 (例: STM32のGPIOA)
typedef struct {
volatile unsigned int MODER; // モード設定
volatile unsigned int OTYPER; // 出力タイプ
volatile unsigned int OSPEEDR; // 出力速度
volatile unsigned int PUPDR; // プルアップ/ダウン
volatile unsigned int IDR; // 入力データ
volatile unsigned int ODR; // 出力データ
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *)0x40020000U)
void gpioa_pin5_output(void) {
GPIOA->MODER |= (1U << 10); // PA5 を出力に設定
}
void gpioa_pin5_toggle(void) {
GPIOA->ODR ^= (1U << 5); // 出力ビットを反転
}
void delay(volatile unsigned int count) {
while (count--);
}
int main(void) {
gpioa_pin5_output();
while (1) {
gpioa_pin5_toggle();
delay(100000);
}
}
ポイント
実ハードウェアのアドレス空間を直接操作 → Freestandingらしさ
gpioa_pin5_output() / gpioa_pin5_toggle() / delay() と分けて 構造化
プログラマが直接ハードを制御できる「Cの精神」
- 授業での流れ提案
Hosted環境: printf("Hello, world"); → 「標準ライブラリに依存している」ことを確認
Freestanding(抽象シミュレータ): 仮想レジスタにLED出力 → 「ライブラリなしでも動く」ことを体験
Freestanding(実機): 構造体マッピングによるレジスタ操作 → 「構造化により保守性と可読性が上がる」ことを理解
これで、
「HostedとFreestandingの違い」
「Cの精神」=自由+責任
「構造化」の実用性
が一度に学べます。
👉 もし授業で「実機」を使えるなら、どのマイコン(例: STM32, RX, RISC-Vボードなど) を対象にされますか?
機種に合わせてレジスタやサンプルコードを具体化したほうが、学生さんがすぐに試せる教材になりますよ。
あなた:
STM32でお願いします。
ChatGPT:
承知しました!
それでは STM32(Cortex-M搭載マイコン) を対象に、授業で使える Freestanding構造化プログラミング例 を整理します。
標準ライブラリ(stdio.h や HALドライバ)は使わず、レジスタを直接操作する形です。
STM32での Freestanding 構造化例
- GPIOレジスタの構造体定義
// STM32F4シリーズ GPIO (一部抜粋)
typedef struct {
volatile unsigned int MODER; // モード
volatile unsigned int OTYPER; // 出力タイプ
volatile unsigned int OSPEEDR; // 出力速度
volatile unsigned int PUPDR; // プルアップ/プルダウン
volatile unsigned int IDR; // 入力データ
volatile unsigned int ODR; // 出力データ
volatile unsigned int BSRR; // ビットセット/リセット
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *)0x40020000U)
// クロック制御レジスタ (RCC)
#define RCC_AHB1ENR (*(volatile unsigned int *)0x40023830U)
-
初期化とLED制御関数
void gpioa_pin5_init(void) {
// GPIOAクロック有効化 (RCC_AHB1ENR の bit0)
RCC_AHB1ENR |= (1U << 0);// PA5 を出力モードに設定 (MODERの bit10:11 を 01 に)
GPIOA->MODER &= ~(3U << 10); // クリア
GPIOA->MODER |= (1U << 10); // 出力
}
void gpioa_pin5_on(void) {
GPIOA->BSRR = (1U << 5); // bit5 をセット
}
void gpioa_pin5_off(void) {
GPIOA->BSRR = (1U << (5 + 16)); // bit5 をリセット
}
void delay(volatile unsigned int count) {
while (count--) {
asm("nop"); // 最適化防止
}
}
-
メイン処理(構造化されたループ)
int main(void) {
gpioa_pin5_init();while (1) {
gpioa_pin5_on();
delay(1000000);
gpioa_pin5_off();
delay(1000000);
}
}
授業で強調できるポイント
標準ライブラリなし
→ Hosted環境と違い、#include が不要。
→ printf も使えないので、結果は LED の点灯で「見える化」する。
ハードウェア直結の自由度
→ RCC でクロックを自分で有効化。
→ GPIO のモードを直接設定。
→ 「プログラマが意図してやろうとすることを妨げない」=Cの精神。
構造化の工夫
gpioa_pin5_init() で初期化を分離
gpioa_pin5_on/off() でLED制御を関数化
delay() で時間待ちを抽象化
→ 「何をしているか」が読みやすく、保守性が高い。
授業での進め方(例)
HostedのHello World をまず見せて、「標準ライブラリ依存」を確認。
FreestandingでLED点滅(裸コード) を動かす。
「構造化」されていない一枚板コード → 関数に分割した例 に書き換える。
「Cの精神」= 自由と責任、構造化による秩序 をまとめる。
👉 このサンプルは STM32F4 Discovery ボードや Nucleo-F4/F3 シリーズなどで試せます。
(実機ボードに合わせて RCC / GPIO のベースアドレスが少し違いますので調整が必要です)
ご質問ですが、授業で対象にされるのは 特定シリーズ(例: STM32F4, STM32F1, STM32G0) のどれでしょうか?
シリーズを決めれば、そのままビルド&実機動作できる完全コードをご用意できます。
参照
ChatGPT利用の技4つ with ChatGPT
https://qiita.com/kaizen_nagoya/items/4a178bd6a09a4a471a7f
ChatGPTによるQiita記事の改良と補足
https://qiita.com/kaizen_nagoya/items/20604d6dd0702ab95c2f
ChatGPTによるQiita記事の改良と補足(2)
https://qiita.com/kaizen_nagoya/items/996275307ffc8c1243f8
本から始める 面倒なことはChatGPTにやらせよう by からあげ
https://qiita.com/kaizen_nagoya/items/f5ce2a18db54b5610e4b
MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら
https://qiita.com/kaizen_nagoya/items/54b648c838fae8d57e38
【松尾研LLMコミュニティ】面倒なことはLLMにやらせよう "Beginning LLM"2024年10月17日 AI(9)
https://qiita.com/kaizen_nagoya/items/efdc23fbe67cdae2126e
設計:ChatGPTで特異解か一般解を求める AI(1)
https://qiita.com/kaizen_nagoya/items/4dec580e16a7c84b0ec4
みんなの使い方から学ぶ
https://qiita.com/kaizen_nagoya/items/8e7de492d896df94a36e
AI・機械学習 昨日、今日、明日
https://qiita.com/kaizen_nagoya/items/adb184c8fc7a65ac9756
DNA LLM and genome for survey 2200 papers by name.
https://qiita.com/kaizen_nagoya/items/ce8a28d6072f340a9d59
ChatGPTから学ぶ 3倍褒めて3分の1貶す
https://qiita.com/kaizen_nagoya/items/91e70fd8caa25076718b
AI時代の相棒は、キミに決めた! 推しのAIエージェントをシェアしよう!企画参加まとめへの序章
https://qiita.com/kaizen_nagoya/items/e3fd7557bac97d1b88f2
記事投稿数、いいね数の目標設定して ChatGPTに聞いてみた。
https://qiita.com/kaizen_nagoya/items/019e2ad9c3e45e45854e
AI時代の相棒は、キミに決めた! ChatGPT推し ver.0
https://qiita.com/kaizen_nagoya/items/8068a884fb2e64cd3c4f
無料ChatGPTの処理限界
https://qiita.com/kaizen_nagoya/items/84683aee26d9f4a28af0
by ChatGPT, with ChatGPT and people opinions.
https://qiita.com/kaizen_nagoya/items/57f00f9b48b25bc231e6
ChatGPTの使い方の利点と課題 by ChatGPT
https://qiita.com/kaizen_nagoya/items/0f469e473a6ed0407daa
DataRobot 風 AI agent Robotをあなたに
https://qiita.com/kaizen_nagoya/items/1ca8ca1dedefaf739d16
ChatGPTの賢い使い方
https://qiita.com/kaizen_nagoya/items/3a7e4583553543eeeeb3
ChatGPTの弱みをあなたに
https://qiita.com/kaizen_nagoya/items/3c97c63a22939e203905
ChatGPTで裸の王様
https://qiita.com/kaizen_nagoya/items/8377be38d3a763e93811
設計 仕様 制約 AI利用開発の鍵 by ChatGPT
https://qiita.com/kaizen_nagoya/items/1b9cb2f9d26308d84791
PowerPoint 筋書き(outline), 見直し(review), 見栄え加工 by ChatGPT
https://qiita.com/kaizen_nagoya/items/37bb97fc250fca37295b
逃げ回るChatGPTを追い詰めるには
https://qiita.com/kaizen_nagoya/items/cd60426e626ba05e0377
三人寄れば文珠の知恵は直交する能力前提 by ChatGPT
https://qiita.com/kaizen_nagoya/items/512e5611615e2426bb42
プログラマ3年で社長事業(未成年編) 博士論文支援追加
https://qiita.com/kaizen_nagoya/items/326452b5bf29c144c307
自殺防止手引き原稿 補足 by ChatGPT
https://qiita.com/kaizen_nagoya/items/7e459fa7edf7205c2667
しつけ(discipline) の測定視点 by ChatGPT
https://qiita.com/kaizen_nagoya/items/6b5ce03c545f7bbd8723
技術者は英語を学ぶ必要はない。英単語の羅列でいい=プログラム。
https://qiita.com/kaizen_nagoya/items/4fc3963a21e0339fd1c9
猫中心設計から鳥中心設計へ part2
https://qiita.com/kaizen_nagoya/items/4d7a5a33c85e0b01dc5d
プログラマ必須科目 ChatGPTにも確認
https://qiita.com/kaizen_nagoya/items/7b30d9d119792130facd
なんで音楽とプログラムの関係がうまく書けないか。
https://qiita.com/kaizen_nagoya/items/489a68d360df4b26f87d
AI利用業務手引き
https://qiita.com/kaizen_nagoya/items/f201b292f37dba16e9ef
C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1
C言語(C++)が必要な人、必要ない人 ChatGPT
https://qiita.com/kaizen_nagoya/items/a074cb8cd292d8d94bd4
C言語を習得する3つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b
C言語を習得する3つの方法 ChatGPT
https://qiita.com/kaizen_nagoya/items/4a3518a18fa49f46787f