−プログラミング−

初版 2002年8月20日作成
https://www.sessame.jp/
責任編集  坂本 直史


 言語に依存しない項目

      【プログラミングで意識すべき開発環境に関する情報】

        ・使用する言語
        ・ネイティブ開発かクロス開発か
        ・デバッグ環境

      【プログラミングで意識すべきマイコンのアーキテクチャ】

        ・レジスタ構成
          ・レジスタの本数
          ・アドレッシングモード
            ・間接アドレッシング
          ・16ビットのレジスタを8ビット2本にできるか
        ・キャッシュ
        ・メモリマップドI/O
        ・浮動小数点/固定小数点
        ・ビッグエンディアン/リトルエンディアン

    <CPUに依存しない情報>

      【プログラミングで意識すべき周辺ハードウェア仕様】

        ・ハードウェア制御のタイミング
        ・エッジトリガとレベルセンシティブ
        ・チャタリング
        ・メモリの種類
          ・速いメモリ遅いメモリ
          ・フラッシュの場合はリライトを抑える

      【実行のインフラに関する知識】

        ・ROM化するかしないか
        ・スタートアップの仕組み
          ・セルフテストの必要性

  <コーディングで理解しておくべきソフトウェア的概念>

    【アルゴリズムとデータ構造】

    【ポーリングと割り込みの実装】

      ・サンプルを出してやる

    【リエントラント性(再入可能性)】

    【再帰呼び出し】

      ・禁止

  <ソフトウェア的に気を付けるべき部分>

    【コンパイラのくせやバグ】

      ・コンパイラは信用するな
      ・最適化オプションを外してみる/付けてみる
      ・ソースでなくバイナリに対して責任を持つという衿持

    【移植性】

      ・言語そのものの仕様に関わる部分
      ・ベンダごとの拡張仕様に関わる部分

    【リソース管理】

      ・コンストラクションとデストラクション
        ・mallocとfree
          ・システムコールが発行されるので
           思っている以上に負荷がかかる
          ・メモリリークの防止
        ・newとdelete
          ・リソースリーク
        ・同じレイヤーでコンストラクションとデストラクションを行う
      ・スタックサイズ
        ・スタックサイズを把握しておく
        ・コンパイラにも依存する

    【トップダウンとボトムアップの混合】

      ・両方のアプローチが必要
        ・ハードウェアレイヤーからボトムアップしたものと
         設計からトップダウンで来たものを上手くミックスする

    【多重割り込み】

  <チューニングと最適化>

    <チューニング>

     【速度チューニング】

        ・ROMを一度RAMにコピーする
        ・時間のかかるスカなコーディングを避ける

      【メモリチューニング】

    【最適化】

      ・再利用性最適化
      ・移植性最適化
      ・省電力最適化

  <デバッグ>

    【スタブやドライバ】

      ・ダミーのスタブやドライバは先に作成しておく

    【デバッグ容易コーディング】

      ・アサーション
      ・メンテナンスが容易なコーディング

    【デバッガ】

      ・ブレークポイント
      ・トレース
      ・ウォッチ
        ・printf を自分で実装する
        ・会社資産の printf を再利用する

    【モジュールのトレース】

    【実機を意識したテストパターンやテストデータ(ベクタ)】

    【バグの分析/切り分け】

  <コードレビュー/コードインスペクション>

    【コードレビューの種類】

      ・コードインスペクション
      ・ウォークスルー

    【コーディング規約】

      ・ハンガリアン記法

    【コード品質】

      ・複雑度
      ・KLOC数
      ・実行経路数

  <品質の確保>

    【テストファースト】

    【カバレッジ】

      ・C0/C1/C2カバレッジ
        ・C0は最低限のマナー
      ・MC/DCカバレッジ

    【テストの実行環境】

    【データフロー分析/テスト】

    【コメントの量と質】

      ・標準に則っているか

    【動的な品質】

      ・バッファオーバーフロー
      ・セグメンテーションフォールト

  【構成管理】

       ・バージョン管理

 言語に依存する項目

  <構造化系言語に依存する項目>

    <手続き型プログラミング>

      【フローチャート】

      【構造化プログラミング】

        ・スパゲッティプログラム
        ・1 entry 1 exit

      【GOTO文(論争)】

      【モジュール分割】

        ・構造化チャート
          ・PAD
          ・HCP

      【変数スコープ】

        ・スコープを明確にする
        ・グローバル変数は多用するな

    <C言語に依存する項目>

      ※C言語に関する部分はMISRA-Cを参考にして挙げる
      ・配列とポインタ
      ・暗黙のint
        ・16ビットか32ビットか
        ・typedef して使う
      ・変数が #define されているか
      ・副作用
      ・K&RとANSI

  <アセンブラに依存する項目>

    【アセンブラの得意な部分】

      ・積和演算
      ・キャリー付き演算
      ・スーパーバイザーコール(特権命令)
      ・スタートアップロジック
      ・クリティカルセクション

  <OO系言語に依存する項目>

    【OO系言語の原則】

      ※J-Tasterを参考にして挙げる
      ・多重継承はあまりやるな
      ・深い継承はしない
      ・Cohesion に気を付ける
        ・あるメソッドで他のメソッドを呼ぶ
      ・演算子オーバライドは禁止
      ・関数を使うな
        ・例外もある
          ・異常にメモリが少ない場合
            ・携帯のJavaでゲームを書く場合とか
      ・実行効率も考える