関数のハードウェア遅延として 16 ビット タイマーを使用していますdelay_ns(UINT32 ui32_delay_val_ns);
。関数内でdelay_val
は で除算されていTcy
ます。タイマーTcy
は 25ns (40MHz での命令サイクル時間) で実行されるため、すべてのティック (または TMR4 val ビット) は 25ns になります。
優れたソフトウェア エンジニアが行うべきこととして、この関数を使用していくつかのテストを実行したところ、何か疑問に思ったことがありました。
タイミングを参照してください: delay_ns: 10、a=2 b=27 c=485 d=494 e=504
私は 250ns を要求しました。これは 25ns の 10 TMR4 ティックです。
a は BOOL bStart = 1 および TMR4.ON = 1 の後です。(2サイクルは奇妙なことではありません)。
b = 前の 16 ビット キャスト ui 32 ビット val 値を 25 で割った後の TMR4 val;
c = TMR4 val (b の直後!!) 元の 32 ビット val を 25 で割ったとき。
ご覧のとおり、16 ビットの val を使用すると 25 命令サイクルのコストがかかりますが (もしかしたらかなり多いのでしょうか?)、32 ビットを使用すると +450 サイクルのコストがかかりますか? つまり、32 ビット val の単純な除算には 11.5 us かかります!!
特に、これは Microchip の dsPIC33 バリアントであり、いくつかの改善 (パイプライン、ダブル ACU など) があるためです。16ビットMCUなのはわかっていますが、なぜそんなにサイクルがかかるのですか?