0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Programmer, Day 16

Last updated at Posted at 2025-08-27

職業訓練
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)を深めよう

  1. 「構造化プログラミング」とは?その思想と背景

なぜ構造化が登場したのか(例えば、ゴートゥーの弊害など)、手続き型プログラミングとの違い、制御フローの明確さを強調。

小さな関数・モジュールを組み合わせて、大きなプログラムを安全かつミスが少ない形で構成する考え方。

  1. 「Cの精神」と構造化との関係

C言語の設計思想における「明快でシンプルな構造」を支える構造化の重要性を紹介。
→ 「Cの精神」が構造化に支えられている、という点に触れると理解が深まります
Qiita

  1. DoCAP と構造化の実践的応用

DoCAP(職業訓練の文脈)における構造化の役割。例えば、大規模なシステムを設計・保守する際に、部品ごとに分解し構造化する重要性を解説。

UMLやモジュール分割による設計支援も併せて紹介すると実践的。

  1. 具体的なコード例やワークショップ

典型的な構造化の良いコード例(明確な関数、早期 return、分岐の制御)を示し、生徒とディスカッション。

簡単な C コードを例に、構造化前/後を比較してみる活動もおすすめ。

  1. 構造化のメリットと限界も整理

メリット:保守性の向上、バグの局所化、理解・レビューのしやすさ。

限界:小さすぎるメソッドの乱用による可読性低下、防御的プログラミングとの相性など。

  1. 発展的トピック(時間があれば)

モダンな手法との共通点(例:関数型プログラミングでの純粋性、リファクタリングによる構造化の応用)。

継続的レビューや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等のマイコン)を想定した例

の両方で整理してみます。

  1. シミュレータや抽象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

レジスタを 抽象変数で模擬 → シミュレーション可能

関数分割 により「構造化」の意味を明示できる

  1. 実機(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の精神」

  1. 授業での流れ提案

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 構造化例

  1. 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)

  1. 初期化と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"); // 最適化防止
}
}

  1. メイン処理(構造化されたループ)
    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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?