技術系備忘録

随時更新です。技術横断で要点をメモします。詳細説明を記事で用意した場合にはリンクを貼っておくようにします。他記事から本項を参照するような使い方もします。

組み込み

チャタリング対策(ソフト対策)

wait関数を置いて時間を稼げば良い。ただしwaitした分だけCPUを専有してしまう。チャタリングを防止して、スイッチ入力を完成させよう:イチから作って丸ごと学ぶ! H8マイコン道(9)(3/3 ページ) – MONOist

ビット演算
  1. あるレジスタの任意のbitに1をライトしたい
    OR演算を使用する。例えばレジスタSSR03の下位4bitをすべて1にしたい場合、以下のように記述する。
    SSR03 |= 0x0f;
  2. あるレジスタの任意のbitに0をライトしたい
    AND演算を使用する。例えばレジスタSSR03の下位4bitをすべて0にしたい場合、以下のように記述する。
    SSR03 &= 0x00;
  3. あるレジスタの任意のbitをリードしたい
    ビットマスクを使用する。例えばレジスタSSR03のbit5をリードしたい場合、以下のように記述する。(AND演算の結果を一次変数に代入してから比較でも良い。)
    ( SSR03 & 0x20 ) == 0x00; 真のときはbit5に0が入っており、偽のときは1が入っている
    ( SSR03 & 0x20 ) == 0x01; 真のときはbit5に1が入っており、偽のときは0が入っている
割込みハンドラとハンドラ内処理の注意点

割込みハンドラ内(割込み処理中)では以下3点に注意する。

  1. ハンドラ内で関数を使うことは極力避ける
    マイコンはスタックの段数が限られており、割込ハンドラから他の関数を呼び出すとスタックを多く消費し、スタックオーバーフローを起こしやすいため。
  2. ハンドラ内での長い処理は極力避ける(シリアル通信など)
    割込み処理中は優先度の低い他の処理が実施されないため、CPU時間が割り込みに占有されてしまい、システム全体のスループットが低下してしまう。ハンドラ内ではフラグを立てるだけにして、実際の処理はmain関数内で実行すべき。
  3. 他の処理が発行するトリガは待たない
    割込みは他の処理に優先して実行される処理のため、ハンドラ内で他の処理待ちに入ると「他の処理」は永遠に実行されずデッドロックに陥ってしまう(全てのタスクや割り込み処理が他の処理の終了待ちに入ってしまい誰も動けなくなる)。(参考:例外が発生しました | ユークエスト)

余談ですが、マイコンによっては割り込みハンドラが動作している状態をハンドラモードと呼ぶ場合がある。例えばARMのCortex-Mプロセッサは、メインプログラムを実行するスレッドモードと割込みなどの例外処理を実行するハンドラモードの2つの動作モードを定義している。

Markdown

Excelの表をMarkdown形式に変換する

Markdownは表を作るのが苦手なため、複雑な表を作成する場合はMarkdown Tables generator – TablesGenerator.comを使うと良い。
使い方はExcelの表をMarkdown形式に変換 – Qiitaで説明されている。