2

80MHz クロック レートで動作するように PIC32 を構成しています。テストとして、DIOピンをトグルしてみました

while(1) {        
    LATFbits.LATF4 = !LATFbits.LATF4;
}

スコープに応じて、625kHz で DIO をトグルするだけです。分解されたリストを見る

9D000118  8C446160   LW A0, 24928(V0)
9D00011C  30840010   ANDI A0, A0, 16
9D000120  2C840001   SLTIU A0, A0, 1
9D000124  8C436160   LW V1, 24928(V0)
9D000128  7C832104   INS V1, A0, 4, 1
9D00012C  AC436160   SW V1, 24928(V0)
9D000130  0B400046   J 0x9D000118

指示はそれほど多くありません。なぜそんなに遅いのですか?

==============

アセンブリで最終的に20MHz(4命令)を取得

#include<p32xxx.h>

.text
.set    noreorder
.set    nomacro

.global toggle
.ent    toggle

toggle:

# void toggle(int mask)

# $a0 - mask
# performs toggles in an infinite loop (never returns)

# la $t0, 0xbf886160  # LATF base address 04:clear 08:set 12:inv

la $t0,LATF

loop:
sw  $a0,  4($t0)        # write mask to clear 
sw  $a0,  8($t0)        # write mask to set
j loop
nop

.end toggle
4

3 に答える 3

1

INV レジスタを使用して PORT をトグルしようとしましたか?

TRIS、PORT、および LAT ベース レジスタに加えて、各ポートモジュールは、 アトミック ビット操作を提供し、より高速な I/O ピン操作を可能に
する SET、CLR、および INV レジスタに関連付けられています。

于 2013-06-06T15:29:19.087 に答える
0

これらのアイデアは非対称の波形を示しますが、1 秒あたりの遷移数を増やします。

高速サンプリングのバーストが必要な場合、同様のアプローチを使用しました。もちろん、書き込みではなく読み取りです。

すでに述べた他のアイデアとともに:

while(1) {        
  LATFbits.LATF4 = 0;
  LATFbits.LATF4 = 1;
}

ループのオーバーヘッドを減らすこともできます

while(1) {        
  LATFbits.LATF4 = 0;
  LATFbits.LATF4 = 1;
  LATFbits.LATF4 = 0;
  LATFbits.LATF4 = 1;
  LATFbits.LATF4 = 0;
  LATFbits.LATF4 = 1;
  ...
  LATFbits.LATF4 = 0;
  LATFbits.LATF4 = 1;
}

PIC24 を使用すると、多くの DIO ピンにタイマー出力を設定し、ハードウェアで信号を生成できます。PIC32でも同じことができると思います。

于 2013-06-07T18:04:22.760 に答える
0

(ds)PIC の C30 コンパイラには、F デバイスでは 1 つの命令で、-E デバイスでは 2 つの命令でビット トグルを行う_builtin_btg () があります。PIC32にもそれがあるかどうかを確認してください。Eシリーズと同様に、PIC32は必ずしも1サイクル/ I / O命令ではないため、おそらく途中までしか到達しません。

また、アウトプット コンペアのようなモジュールを使用すると、モジュールのペリフェラル クロックが CPU がトグルできるクロックよりも高い場合 (たとえば、メモリ レイテンシが原因で)、より高速に到達できる可能性があります。

于 2013-06-11T13:36:35.417 に答える