3

AVRプロジェクトの開発IDEとしてAVRStudio5でEVK1105開発ボードを使用しています。FreeRTOSを使用しています。このボードには3つのUSARTポートがあります。1つの外部モジュールがUSART-RS232モードを介してAVR32ボードに接続されています。それは、19230ボーレート、7データビット、奇数パリティ、ストップビット1、および通常チャネルモードでUSART0上のボードに連続シリアルデータを送信します。この目的のために新しいタスクを作成しました。9データバイトごとに、「\n」と「\r」を送信します。そのため、私のタスクでは、文字列バッファに9データバイトを収集し続け、それをUSART1で送信します。受信ポートであるUSAR0からデータを収集するためにポーリング方式を使用しています。しかし、私はデータの受信で問題に直面しています。タイミングの問題なのか、データ収集中にスケジューラーがタスクを切り替えるのかわかりません。しかし、必要なデータが得られません。

トラブルシューティングとしてすでに確認したことは次のとおりです。1。外部モジュールをPCハイパーターミナルに接続すると、完璧な結果が得られます。2. USART0からの受信を使用するのと同じことを実装し、受信したものはすべてFreeRTOSを使用しない場合と同じようにUSART1に送信されます。それはうまくいきます。

何が間違っているのか考えてみてください。キューを使用してTxタスクとRxタスクの間で通信し、USART0からUSART1に文字列バッファを渡します。キューの処理に問題がありますか?キューのトラブルシューティングを行うにはどうすればよいですか?

RxTaskの無限タスクループで50msの遅延を使用しています。問題が発生する可能性はありますか?遅延を使用しないと、OSがクラッシュします。タイミングの問題が発生しないように、FreeRTOSで新しいタスクを作成するためのいくつかの良い方法を提案してください。

4

2 に答える 2

1

このようなユースケースでは、UARTペリフェラルからデータを取得するために50msの遅延のあるポーリング方法を使用しません。システム負荷やUART受信バッファのサイズによっては、受信したデータが簡単に失われる可能性があります。

少なくとも、受信したすべてのバイトをTXスレッドによって読み取られるローカルバッファにコピーするUARTデータ受信の割り込みを使用します。

DMAチャネルを使用してデータフレームを受信し、9バイトが受信されたときに通知を受け取ることで、さらに優れたソリューションを実現できます。お使いのAVRデバイスにDMA周辺機器があるかどうかはわかりません。

于 2011-06-24T12:16:50.120 に答える
1

あなたはまだこれに取り組んでいますか?あなたの問題の記述は曖昧ですが、そこにいくつかの提案/主要な質問があります。1)レジスターが何であるかを確認するためにいくつかのドキュメントが必要な場合がありますhttp://www.atmel.com/dyn/products/product_docs.asp?category_id=163&family_id=607&subfamily_id=2138&part_id=4117で巨大なデータシートのPDFを 入手してください

2)この投稿と以前の投稿では、場合によっては、データをRXすることができたと述べています。これらのサンプルプロジェクトからUSARTHW初期化コードを見つけて、freeRTOSサンプルプロジェクトに取り込む必要があります。特にへの呼び出し

gpio_enable_module() with {AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION}

USARTからCPUに接続するには、

InitRs232()

これを行うには、多くのコードを調べる必要があります-多くの依存関係があります。

2)USART0からデータを取得するためにどの関数を呼び出していますか?19kbaudは約2000バイト/秒または1バイト/0.5msであるため、50msのポーリングでは十分ではありません。RXタスクは継続的に(明示的にスリープしないで)ポーリングしますが、TXタスクよりも優先度を低くすることをお勧めします。

3)データを取得するための呼び出しでRXタスクのデバッグに集中します。デバッガーを使用して、usartのハードウェアレジスタを確認します。特に

USART0 crレジスタAVR32_USART_CR_RXEN_MASKは、RXを有効にするように設定する必要があります
。USART0csrレジスタAVR32_USART_CSR_RXRDY_MASKは、そこに新しいデータがあるかどうかを示します。USART0 rhrの読み取りが発生すると、送信したバイトである必要があります。

あなたがまだこれに取り組んでいるなら、私はこれをもう少し調べることができます。

于 2011-08-09T17:18:22.643 に答える