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

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

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

設計のポイント

sizeofを使用する

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

実現したい仕様・課題

配列サイズやバッファ長、型のバイト数をコード中に数値で直書きすると、サイズ変更時の修正漏れが不具合につながります。またintなどの型サイズは処理系依存であり、バイト数を決め打ちしたコードは別のマイコンへ移植した際に誤動作します。サイズ指定を安全で移植性のある形にしたいというのが課題です。

設計のポイント

sizeof演算子を使用することで、指定した型のバイトサイズを取得できます。また、変数(配列や構造体)を指定することで、その総バイト数を取得することもできます。memsetやmemcpyのサイズ指定には、数値の直書きではなくsizeofを使うことを基本とします。memset(array, 0x00, sizeof(array)); と書けば、配列サイズを変更してもこの行は修正不要で、常に正しいバイト数が渡ります。256 * sizeof(int) のように要素数×型サイズで書く方法もありますが、変数名だけで完結するsizeof(array)のほうが修正漏れの余地がありません。配列の要素数が必要な場合は sizeof(a) / sizeof(a[0]) で求められ、要素の型を変更しても追従します。注意すべき点として、関数の引数として受け取った配列はポインタに退化するため、sizeofはポインタのサイズ(4や8)を返してしまいます。配列を関数へ渡すときは、サイズを別引数で一緒に渡す設計とします。また、構造体のsizeofはパディングを含んだ実サイズを返すため、通信フレーム構造体が意図したサイズになっているかの検証(packed指定の確認)にも活用できます。型サイズの決め打ちをなくすことは、マイコン変更・コンパイラ変更に強いコードへの第一歩です。

【コード例】

int array[256];

memset(array, 0x00, 256 * sizeof(int));  // 型サイズをsizeofで
memset(array, 0x00, sizeof(array));      // 配列全体ならこちらが安全

#define ARRAY_NUM (sizeof(array) / sizeof(array[0]))  // 要素数

// 注意:引数の配列はポインタに退化する
void func(int a[]) {
  // sizeof(a) はポインタのサイズになる(配列サイズは別引数で渡す)
}

補足情報

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

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

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

お問い合わせ

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

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