7

私は現在、lpc2378でいくつかのARMアセンブラーをいじっていますが、炉の温度を制御するためのループを作成しました。プロジェクトを完了するには、何らかの割り込み処理を実装する必要があると思います。

アプリケーションが実行されると、Button_1入力を待機するループに入り、ループが続行されてさまざまな段階を経ますが、アプリケーションが機能するためのButton_2入力を待機することはできません。

では、ここでいくつか質問がありますが、割り込みハンドラーはどのように正確に機能しますか?どうすればそれをアプリケーションに実装できますか。

これが私のButton_1コードです:

;=========================================================================
; Wait for BUT1 to be pressed
;=========================================================================
WaitBUT1
  STMFD r13!,{r0,r5,r14}   ; Push r0, r5 and LR

WaitForBUT1Pressed
    ldr r0, = IO0PIN            ; Address of FIO0PIN register 
    ldr r1, [r0]                ; Read FIO0PIN in to r1
    ands r1, r1, # B1_MASK      ; Mask out BUT1
    beq BUT1Pressed             ; Exit LED toggle loop if button is pressed
    B WaitForBUT1Pressed
BUT1Pressed

  LDMFD r13!,{r0,r5,r14}   ; Pop r0, r5 and LR
  mov pc, r14              ; Put link register back into PC

と私のButton_2コード:

;=========================================================================
; Wait for BUT2 to be pressed
;=========================================================================
WaitBUT2
  STMFD r13!,{r0,r5,r14}   ; Push r0, r5 and LR

WaitForBUT2Pressed
    ldr r0, = IO0PIN            ; Address of FIO0PIN register 
    ldr r1, [r0]                ; Read FIO0PIN in to r1
    ands r1, r1, # B2_MASK      ; Mask out BUT1
    beq BUT2Pressed             ; Exit LED toggle loop if button is pressed
    B WaitForBUT2Pressed
BUT2Pressed

  LDMFD r13!,{r0,r5,r14}   ; Pop r0, r5 and LR
  mov pc, r14              ; Put link register back into PC

また、私の炉制御ループ:

LoopStart

   BL WaitBUT1 ; wait until button 1 is pressed
   BL heaterOn ; turn heater on
   BL systemLedOn ; turn system LED on
   BL readTemp ; Check ADC for temp
   BL checkTemp ; Count down, check ADC for temp
   CMP r3, #5 ; Compare timer with delay
   BGT errorVal
   SUBS r4, r2, r7  ;Performs r7 = r4 - r2 and sets condition register
   BEQ LoopStart ; if equal nothing to do
   BGT overTemp ; r7 < 0 case
   BL errorLedOn
   BL heaterOn
   BL FanOff
   B LoopStart

overTemp
   BL errorLedOn
   BL heaterOff
   BL FanOn
   B LoopStart


   BL WaitBUT2
   BL FanOff
   BL errorLedOff
   BL systemLedOff
   BL heaterOff

       B LoopStart

前もって感謝します。

4

2 に答える 2

12

まだ持っていない場合は、ARM ARM(ARMアーキテクチャリファレンスマニュアル)を入手する必要があります。以前は1つしかありませんでしたが、コアが非常に多いため、アーキテクチャごとに分割する必要がありました。 左側のARMアーキテクチャに沿ったhttp://infocenter.arm.com 、次にリファレンスマニュアル、次にARMv5、はい、ARMv4(ARM7TDMI)を使用していることはわかっています。ARMv5マニュアルは、かつてのマニュアルです。

例外ベクトルなどについて説明します。

起動時に、アドレス0x00000000の命令が実行されることはすでにご存知でしょう。割り込みの場合、アドレス0x00000018の命令が呼び出されます。

.globl _start
_start:
    b   reset     ;@ 0x00000000 reset
    b   handler   ;@ 0x00000004 undefined instruction
    b   handler   ;@ 0x00000008 software interrupt swi
    b   handler   ;@ 0x0000000C prefetch abort
    b   handler   ;@ 0x00000010 data abort
    b   handler   ;@ 0x00000014 dont know
    b    irq_handler   ;@ 0x00000018 irq
    b   handler   ;@ 0x000000

ARM ARMからは、レジスタがバンクされていること、特にr13スタックポインタ、割り込みモードの場合は別のスタックポインタがあることもわかります。したがって、起動時に、通常のスタックを設定するときに、割り込みスタック用のスペースも設定する必要があります。

reset:
;@//mov r0, #(PSR_IRQ_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
mov r0,#0xD2
msr cpsr_c, r0
ldr sp, =0xD600C000

;@//mov r0, #(PSR_SVC_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
mov r0,#0xD3
msr cpsr_c, r0
ldr sp, =0xD600B000

ある時点で、cpsrで割り込みを有効にする必要があります。周辺機器(チップ内、コア外)で割り込みを有効にするまで、これを待つことができます。

;@ SVC MODE, IRQ ENABLED, FIQ DIS
mov r0,#0x53
msr cpsr_c, r0

割り込みを有効にする方法と、割り込みが発生したときに割り込みをクリアする方法を理解するには、lpc部分のマニュアルを読む必要があります。

割り込みハンドラー(アドレス0x18で分岐するコード)で最初に行う必要があるのは、共有(バンクされていない)レジスターをスタックに保持して、それらを台無しにしないようにすることです。中断されたコードに戻ったときにそうしないと、レジスタが変更され、そのコードが機能しない可能性があります。プロジェクトはASMにあるように見えるため、アプリケーションでいくつかのレジスタを使用し、isr専用にいくつかのレジスタを予約して、スタックを設定する必要がないようにすることができます。ハンドラーのどこかでblを使用する場合は、lrをスタックに保存する必要があります。

ある時点で、ハンドラーは周辺機器の割り込みをクリアして、次の割り込みまで再度起動しないようにする必要があります。そのためのlpcマニュアルを読む必要があります。はい、私がlpcと言うとき、私は以前はフィリップスであったNXPを意味します...

最後に、lrをプッシュしてポップし、プッシュした場合は他のレジスタをポップした場合は、この正確な命令を使用すると、アームが戻り、モードが中断されたモードに戻ります(これらのレジスタの使用に切り替えます)銀行登録簿)。

subs pc,lr,#4

特定のコア(この場合はARM7TDMI-S)のTRM(テクニカルリファレンスマニュアル)を入手することも必要になる場合があります。通常、ARMではお勧めします。インフォセンターページで、左側はARM7プロセッサに移動します。アーキテクチャではARMv7ではなく、ARM11、ARM9、ARM7がある下部に移動します。

ボタンはバウンドしてI/Oピンに多くのエッジを発生させるため、割り込みが乱雑になる可能性があります。あなたの他の投稿を見ると、どこで割り込みが必要になるかわかりません。一般に、特に必要がない限り、割り込みは避けてください。彼らは一般的に厄介です。確かに、使用を避けられないデザインがあります。また、すべてのコードが割り込みハンドラーであり、アプリケーションには起動コードと無限ループ(またはある種のスリープ)以外は何もないイベント駆動型の設計があります。

割り込みを使用してデバウンスすることができます。たとえば、タイマー割り込みを設定し、割り込み内のボタンのI / Oピンをサンプリングすると、かなりの量のバウンスを回避できますが、ボタンの押下を見逃す可能性もあります。 。ボタンのI/Oピンが2回押されていない状態で、連続して2つの割り込みがアサートされているという理由だけで、状態変数をどこかで変更し、ボタンを離すと状態変数を変更します。その状態変数のエッジの変化は、アプリケーションにとって重要です。ボタンが押されていない状態から押された状態になったら、何かを実行します。ボタンが押された状態から押されていない状態になったら、何もしないでください。例として、ボタンが押されていない状態から押された状態に変わるのを待ちます。

同じタイマー割り込みを使用して、ADCを開始またはサンプリングすることもできます。

ここでも言及されている他の問題を解決していないので、私は割り込みに近づきません。最初にその問題を把握してから、割り込みが必要な機能が必要かどうかを判断します。adcの偶数/定期的なサンプリングのように。

それはあなたが始めるのに十分すぎるはずです。割り込みを試す場合は、このアプリケーションの一部として割り込みを試さないでください。たとえば、LEDウィンカーなど、完全に別のアプリケーションを作成してください。割り込みハンドラーでLEDの状態を変更するか、グローバル変数を変更するか、ハンドラーにレジスターを作成して、フォアグラウンドで監視し、結果としてLEDを変更します。常に問題/学習演習を個々の部分に分割し、それらを解決してから、それらを接着して1つの部分を追加し、テストし、1つの部分を追加し、テストします。

于 2012-05-18T07:03:39.280 に答える
1

この場合、割り込みハンドラーは不要のようです。「待機」機能を使用するのではなく、メインループのボタン2をポーリングするだけで済みます。これをループの最後に追加します。

ldr r1, [r0]                ; Read FIO0PIN in to r1
ands r1, r1, # B2_MASK      ; Mask out BUT1
beq STOP

ここで、STOPは、安全な炉のシャットダウンを実行するターゲットです(つまり、無期限に稼働したままにしないでください)。

ループにはbutton1の待機が含まれていることに注意してください-確かにそれは前 にあるはずLoopStartですか?heaterOnそうしないと、制御ループは、制御アクションを実行せずに、各反復でボタンが押されるのを待ちます。最後のアクションが!だった場合、危険な状況になる可能性があります。

それを超えて、ARM-Cortexコア(LPX2378はARM7TDMI-Sコア)の前は、ARMコアは2つの割り込みソースIRQとFIQのみを定義し、ほとんどの部分にはARMコア自体の外部に別個の割り込みコントローラーがあり、この割り込みはコントローラはベンダー固有です。したがって、たとえばGPIO割り込みが自分の側でどのように処理されるかを判断するには、ARMのドキュメントではなく、デバイスのリファレンスマニュアルを参照する必要があります。

ARM Cortex-Mベースのデバイスは急速にARM7デバイスに取って代わりつつあり、そのようなデバイスを使用したほうがよい場合があります。特に、割り込み処理ははるかに簡単で、柔軟性があり、効率的です。Cortex-MがARM7でどのように改善されるかについては、この記事を参照してください。

于 2012-05-19T09:24:29.010 に答える