アプリケーションをより適切にデバッグするのに役立つデバッグツールを作成したいと思います。私は(OSなしで)必要最低限の作業をしています。AtmelのSAM3でIAR組み込みワークベンチを使用します。
タイムアウトの場合に特定のIRQを呼び出すウォッチドッグタイマーがあります(これはリリース時にソフトウェアリセットに置き換えられます)。IRQハンドラーで、ウォッチドッグタイムアウトが発生した正確な場所のスタックトレースを出力(UART)したいと思います。
Webを調べましたが、その機能の実装は見つかりませんでした。
誰もがこの種のものにアプローチする方法についての考えを持っていますか?
編集:OK、スタックからリターンアドレスを取得できたので、WDTタイムアウトが発生した場所を正確に把握できます。各関数が異なる量のローカル変数をスタックにプッシュするため、スタック全体の巻き戻しは最初に表示されるように単純ではありません。
私が最終的に得たコードはこれです(他の人にとっては、それが役に立つと思うかもしれません)
void WDT_IrqHandler( void )
{
uint32_t * WDT_Address;
Wdt *pWdt = WDT ;
volatile uint32_t dummy ;
WDT_Address = (uint32_t *) __get_MSP() + 16 ;
LogFatal ("Watchdog Timer timeout,The Return Address is %#X", *WDT_Address);
/* Clear status bit to acknowledge interrupt */
dummy = pWdt->WDT_SR ;
}