組み込み機器・ハードウェアの設計開発から装置製作まで社内一貫対応!

組み込み機器・ハードウェア設計製作.com
組み込み機器・ハードウェア設計製作.com

produced by株式会社アイディアイ

設計のポイント

標準関数を使う

設計内容分類組み込みソフトウェアにおけるC言語記述

実現したい仕様・課題

配列の初期化やコピーをforループで1要素ずつ記述すると、コードが冗長になるうえ、ループ条件の書き間違いによる範囲ミスも起こりがちです。定型的なメモリ操作を、短く、速く、間違いにくく記述したいというのが課題です。

設計のポイント

標準関数を使うことで、値の代入・コピーのためのコードを短く記述できます。配列のゼロクリアは、forループの代わりに memset(a, 0x00, 32); の1行で書け、配列間のコピーも memcpy(a, b, 32); で完結します。記述が短くなるだけでなく、標準ライブラリのmemset/memcpyは処理系ごとに最適化されている(ワード単位の転送やCPUの専用命令を使う実装が多い)ため、素朴な1バイトずつのループより高速に動作することが一般的です。サイズ指定には数値の直書きではなくsizeofを併用し、memset(a, 0x00, sizeof(a)); とすることで、配列サイズ変更への追従と単位(バイト数)の間違い防止を両立します。使用上の注意として、memcpyはコピー元とコピー先の領域が重なっている場合の動作が未定義のため、同一バッファ内での移動など重なりの可能性がある場合はmemmoveを使います。文字列のコピーには、終端まで際限なく書き込むstrcpyではなく、サイズ上限を管理できる関数(snprintf等)の使用を推奨します。また、memsetの値引数はバイト単位で埋められるため、int配列を「全要素1」にする用途には使えない(0と-1/0xFF以外は意図どおりにならない)ことも理解して使い分けます。定型操作を標準関数に寄せることで、コードの意図が読み取りやすくなり、レビューも「サイズ指定が正しいか」の確認に集中できます。

【コード例】

// ループによる初期化・コピー
for (i = 0; i < 32; i++) { a[i] = 0x00; }
for (i = 0; i < 32; i++) { a[i] = b[i]; }
// ↓ 標準関数で簡潔・高速に
memset(a, 0x00, sizeof(a));
memcpy(a, b, sizeof(a));

// 領域が重なる可能性がある場合はmemmove
memmove(&buf[0], &buf[4], len - 4);

補足情報

当事例のような、マイコンのファームウェアにおけるC言語記述のポイントをまとめた冊子の無料DLが可能です。
是非以下よりご確認ください。

マイコンのファームウェア C言語記述のポイント

>>ダウンロードはこちら!

お問い合わせ

組み込み機器・ハードウェア 設計製作.comを運営する株式会社アイディアイは、組み込み機器・ハードウェアの設計開発代行サービスを提供しています。
試験装置や制御機器、組み込みボードなど、設計・開発委託先をお探しの皆様、お気軽に当社に御相談ください。

技術資料のダウンロードはこちらから 技術資料ダウンロ―ド メールフォームでのお問い合わせはこちらから ご相談・お問合せ