0

こんにちは、Nios で割り込みを使用して Uart を使用する方法を学習していますが、開始方法がわかりません。ポーリングではできましたが、割り込みの使用を開始する方法がわかりません。

どんな助けでもいただければ幸いです

これが私のコードです

#include <stdio.h>                    // for NULL
#include <sys/alt_irq.h>              // for irq support function
#include "system.h"                   // for QSYS defines
#include "nios_std_types.h"           // for standard embedded types

#define JTAG_DATA_REG_OFFSET          0
#define JTAG_CNTRL_REG_OFFSET         1


#define JTAG_UART_WSPACE_MASK         0xFFFF0000
#define JTAG_UART_RV_BIT_MASK         0x00008000
#define JTAG_UART_DATA_MASK           0x000000FF

volatile uint32* uartDataRegPtr  = (uint32*)JTAG_UART_0_BASE;
volatile uint32* uartCntrlRegPtr = ((uint32*)JTAG_UART_0_BASE +
                                             JTAG_CNTRL_REG_OFFSET);
void uart_SendByte (uint8 byte);
void uart_SendString (uint8 * msg);
//uint32 uart_checkRecvBuffer (uint8 *byte);

uint32 done = FALSE;

void uart_SendString (uint8 * msg)
{
    int i = 0;
    while(msg[i] != '\0')
    {
        uart_SendByte(msg[i]);
        i++;
    }
} /* uart_SendString */

void uart_SendByte (uint8 byte)
{
    uint32 WSPACE_Temp = *uartCntrlRegPtr;

    while((WSPACE_Temp & JTAG_UART_WSPACE_MASK) == 0 )
    {
        WSPACE_Temp = *uartCntrlRegPtr;
    }

    *uartDataRegPtr = byte;

} /* uart_SendByte */

uint32 uart_checkRecvBuffer (uint8 *byte)
{
    uint32 return_value;
    uint32 DataReg = *uartDataRegPtr;

    *byte = (uint8)(DataReg & JTAG_UART_DATA_MASK);
    return_value = DataReg & JTAG_UART_RV_BIT_MASK;


    return_value = return_value >> 15;
    return return_value;



} /* uart_checkRecvBuffer */

void uart_RecvBufferIsr (void* context)
{


} /* uart_RecvBufferIsr */



int main(void)
{
  uint8* test_msg = (uint8*)"This is a test message.\n";

  //alt_ic_isr_register (  ); // used for 2nd part when interrupts are enabled

  uart_SendString (test_msg);

  uart_SendString ((uint8*)"Enter a '.' to exist the program\n\n");

  while (!done)
  {
      uint8 character_from_uart;
      if (uart_checkRecvBuffer(&character_from_uart))
      {
          uart_SendByte(character_from_uart);
      }

    // do nothing
  } /* while */

  uart_SendString((uint8*)"\n\nDetected '.'.\n");
  uart_SendString((uint8*)"Program existing....\n");
  return 0;

} /* main */

uart_checkRecvBuffer の代わりに uart_RecvBufferIsr を使用するとします。この状況にどのように対処できますか?

4

1 に答える 1

0

alt_ic_isr_register() を使用して割り込みハンドラーを登録する必要があります。これは、割り込みが発生したときに呼び出されます。詳細 (いくつかのサンプル コードを含む) は、アルテラのこの NIOS II PDF ドキュメントに記載されています。

割り込みを使用するようにコードを変更する限り、次のようにします。

uart_checkRecvBuffer(); を削除します。

uart_RecvBufferIsr() を次のように変更します (申し訳ありませんが、ここにはコンパイラがないため、構文/機能を確認できません)。

volatile uint32 recv_flag = 0;
volatile uint8  recv_char;
void uart_RecvBufferIsr(void *context)
{
    uint32 DataReg = *uartDataRegPtr;

    recv_char = (uint8)(DataReg & JTAG_UART_DATA_MASK);
    recv_flag = (DataReg & JTAG_UART_RV_BIT_MASK) >> 15;
}

上記のコードの話の教訓は、割り込みをできるだけ短くし、厳密に必要でないことはすべて外部で実行できるようにすることです (おそらく、recv_char と recv_flag で使用したロジックを単純化することによって)。

そして、ループを次のように変更します。

while (!done)
{
    if (recv_flag)
    {
        uart_SendByte(recv_byte);
        recv_flag = 0;
    }
}

ポートの速度によっては、私が行ったことに問題がある可能性があることに注意してください。上記の「while」ループで処理するには文字の受信が速すぎる場合、一部の文字が失われます。

最後に、いくつかの変数を「揮発性」として宣言して、コンパイラが while ループなどで変数をレジスタに保持しないようにしたことに注意してください。

しかし、うまくいけば、これでうまくいくでしょう。

于 2014-02-13T01:43:59.693 に答える