もうちょっときれいに

昨日のコードを少し書き直しました。

void boot_for_gdb(void)
{
    if ( ! (*pSWRST & RESET_SOFTWARE ) ){   /* ソフトウェアリセットが起きていないなら以下実行 */
        *pSWRST = 0x07;                     /* 内蔵ペリフェラルのリセット */
        asm volatile( "ssync;" );
        *pSWRST = 0x00;                     /* 内蔵ペリフェラルのリセット解除。 */
        asm volatile( "ssync;" );
        *pSYSCR |= 0x10;                    /* no boot on core reset */
        asm volatile( "ssync;" );
        asm volatile( "raise 1;" );         /* コアリセット */
        while( 1 )
            ;                               /*リセットが発生するまでループ*/
    }
}

リセットがあったか否かを、USPではなくSWRSTレジスタのビットで判断しています。すっきりしました。