面试踩坑实录:自称精通 STM32+FreeRTOS,基础题直接露怯

今日、履歴書に「STM32開発とFreeRTOS応用を精通」と記載された候補者と面接したが、期待に反して基礎的な組み込み技術問題で実力が露呈。コアQAと専門解説を整理し、同業者と新人の参考に——基礎が不固なら、履歴書が華やかでも無駄になる。

一、致命的QA実録(専門解説付き)

1. 質問:組み込みでconstとvolatileの本質的違いは?

回答:constは変更不可、volatileは変更可…

:cross_mark: 表面のみ説明、本質に触れず
:white_check_mark: 専門解説:
constの核心はコンパイラレベルで変更不可を保証。定数・読み取り専用変数の誤書き防止に使用。
volatileはコンパイラの最適化禁止を通知。変数がハードウェア等で変化する可能性を示す。主な適用場面は以下の3つ:

  • ハードウェアレジスタアクセス(例: volatile uint32_t *reg = (uint32_t*)0x40000000;、ハードウェアが値を変更する可能性あり)
  • マルチスレッド/タスク共有変数(スレッド間同期異常防止)
  • 割り込みサービスルーチン(ISR)とメインプログラムの共有グローバル変数
    補足:const volatile uint32_t *reg はハードウェア読み取り専用レジスタ(ハードウェア書き込み・ソフト読み込み、ソフト誤書き防止とコンパイラ最適化禁止)。

2. 質問:ISR内でprintf呼び出し不可の理由は?

回答:出力が遅いから…

:cross_mark: 表面的説明のみ、致命的リスク未説明
:white_check_mark: 完全解答:
ISRでのprintf呼び出しには「遅い」以上の3つの致命的問題:

  1. 動的メモリ操作(malloc/free)を引き起こし、非リエントラントな関数がメモリ混乱を招く可能性
  2. システムコール含み、コンテキストスイッチを引き起こしISRのアトミック性破壊
  3. 実行時間の不確実性によりリアルタイム性要求違反、高優先度割り込みブロックの可能性
    代替案(実用的):
  • リングバッファでログをキャッシュ、ISRは書き込みのみ、メインループが出力
  • フラグビットでトリガーし、メインプログラムが検出後に実行
  • 動的メモリ回避の軽量ログコンポーネントを統合。

3. 質問:ISRとメイン間での32ビット変数安全アクセス方法?

回答:mutexロック使用?

:cross_mark: 誤解:ISRでのmutexはデッドロックリスクあり、FreeRTOS mutexはISR非対応がデフォルト
:white_check_mark: 標準実装:

  1. 割り込み無効化:__disable_irq() → 変数アクセス → __enable_irq()(簡易だが無効化時間制御必要)
  2. アトミック操作:ARM組み込み関数 __atomic_load_32()/__atomic_store_32() 使用
  3. 単バイト分割:32ビット変数を4つの8ビット変数に分割(8/16ビットコア向け、32ビットコアは省略可)
  4. ハードウェア命令:Cortex-Mの LDREX/STREX で排他アクセス(レースコンディション防止)
    注意:ARMで32ビット変数のアラインメント違反はHardFaultトリガーのため回避必要。

4. 質問:DMAと割り込みの優先度処理?

回答:DMA優先度が高め?

:cross_mark: 単純比較の誤解
:white_check_mark: 深層分析:
組み込みでのDMAと割り込み優先度は3層メカニズム考慮必要:

  1. ハードウェア優先度:NVIC設定(IRQn優先度、数値小が高優先度)
  2. ソフトウェア優先度:RTOS使用時はタスク/ISRのソフト優先度(例: FreeRTOS vTaskPrioritySet
  3. データフロー優先度:STM32の DMA_CCRx で同一DMAチャネル内データフロー優先度設定
    実例:
    ADCサンプリングDMA+デュアルバッファでは、DMA割り込み優先度>ADC割り込みを確保——DMAバッファ切替未了でADC割り込みトリガーによるデータ喪失防止。

二、面接血泪の教訓(新人/HR/面接官全員必読)

1. 履歴書の落とし穴(記載即深掘り注意!)

  • 「精通」慎重に:「STM32精通」と記載ならSPI CRC検証、I2C応答タイムアウト処理、タイマーデッドタイム設定等の詳細問われる
  • プロジェクト経験は具体性を:「XXXドライバ開発担当」だけでは不十分。「I2Cバスレースコンディションをロジアナで波形解析、ミューテックス+タイムアウト再送で解決」等の実証必要
  • スキルマッチは現実的に:ライブラリ使用経験≠精通。低レイヤードライバ自作、ハード/ソフト統合デバッグ能力が基準。

2. 組み込み面接「死亡QAリスト」(回答不可ならほぼ不採用)

  1. プロジェクトの割り込み処理フロー図(コンテキスト保存・割り込みネスト論理含む)
  2. ドライバのレースコンディション/デッドロック検証方法(ロジアナ波形解析・タスクスタック状態出力等の実例)
  3. プロジェクトで最も困難なハードウェアバグとその調査・解決プロセス(問題特定能力評価)
  4. FreeRTOSタスクスイッチングの底面原理?Cortex-MのPendSV割り込みの役割
  5. STM32 GPIO複合機能設定時の注意点(プルアップ/ダウン、出力速度、AFマッピング)

三、交流コーナー

皆様が面接で「履歴書と実力が著しく不一致」なケースに遭遇した経験、または補足の組み込み面接コア問題がある場合はコメント欄で交流を~。新人には基礎を重視し、「精通」の乱用を慎み、堅実な技術力こそが本道であることを願います!