1

特殊目的レジスタ 527 (Alt Time Base レジスタ上位) をリセット (0 に設定) する必要があります。しかし、この関数 sysAltTimeBaseUreset は VxWorks ターゲットの PowerPC (Freescale P2020) をクラッシュさせます。

FUNC_BEGIN(sysAltTimeBaseUreset)
    mtspr       527, 0x0000              /* reset high 32-bits of Alt. Time Base register */
    bclr        20,0                    /* Return to caller */
FUNC_END(sysAltTimeBaseUreset)

次の関数は問題なく動作し、AltTimeBase 上位レジスタの内容を返します。

FUNC_BEGIN(sysAltTimeBaseUGet)
    mfspr       r3, 527            /* high 32-bits of Alt. Time Base register */
    bclr        20,0                    /* Return to caller */
FUNC_END(sysAltTimeBaseUGet)
4

1 に答える 1

2

タイム ベース レジスタへの書き込みは、スーパーバイザ レベルのソフトウェア用に予約されています。ユーザー レベルのソフトウェアは、タイム ベース レジスタへの書き込みを許可されていません。通常は、レジスタを 2 つの異なる時間で読み取り、減算して経過時間を求めるだけで十分です。

さらに、下位タイム ベース レジスタがラップするたびに変更されるため、上位タイム ベース レジスタだけを書き込むべきではありません。レジスタを設定するための推奨される手順は、下位タイム ベース レジスタをゼロに設定し (これにより、タイム ベースの次の 2 32ティック内でラップが発生するのを防ぎます)、次に上位タイム ベース レジスタを目的の値に設定してから、下位タイム ベース レジスタを目的の値に設定します。(読み取るときは、上位レジスタを読み取り、下位レジスタを読み取り、再度上位レジスタを読み取る必要があります。上位レジスタが変更された場合は、下位レジスタの値を破棄して繰り返す必要があります。)

また、ハードコードされた特殊レジスタ番号ではなく、タイム ベース レジスタへの書き込みにニーモニックを使用することをお勧めしますmttbumttbl詳細は覚えていませんが、一部の PowerPC 実装では、別のレジスタ番号にタイムベース レジスタのエコーがありました。ここでは、読み取りはできるが書き込みはできないと思います。

于 2012-09-14T15:23:16.797 に答える