2011-05-24 83 views
3

我正在使用AVR Studio 5的EVK1105開發板作爲我的AVR項目的開發IDE。 我正在使用FreeRTOS。我在這個電路板上有3個USART端口。一個外部模塊通過USART-RS232模式連接到我的AVR32板。它以19230波特率,7位數據,奇校驗,停止位1和常規通道模式向USART0發送連續的串行數據。我爲此創建了一項新任務。每發送9個數據字節後,它會發送'\ n'和'\ r'。所以在我的任務中,我繼續收集字符串緩衝區中的9個數據字節,然後在USART1上傳輸它。我正在使用輪詢方法從USAR0收集端口數據。但是我在接收數據時遇到問題。我不知道它的計時問題,或者調度程序在收集數據的同時切換任務。但我沒有得到所需的數據。在FreeRTOS中創建用於USART接收的新任務

以下是我已經檢查爲故障排除的事情 1.將我的外部模塊連接到我的PC超級終端,這給了我完美的結果。 2.實現使用從USART0接收的相同內容以及接收到的任何內容作爲沒有FreeRTOS的傳輸到USART1。它的工作很好。

請提出一些想法可能是錯誤的。我正在使用隊列在Tx和Rx任務之間進行通信,以將字符串緩衝區從USART0傳遞到USART1。處理隊列問題嗎?如何解決隊列問題?

我在Rx Task的無限任務循環中使用了50ms的延遲。它可以造成問題嗎?如果我不使用任何延遲操作系統崩潰。請建議一些良好的做法,以在FreeRTOS中創建新任務,以便我不會遇到任何計時問題。

回答

1

對於這樣的用例,我不會使用50ms延遲的輪詢方法從UART外設中檢索數據。根據系統負載和UART接收緩衝區大小,您可能很容易丟失接收的數據。

至少在UART數據接收時使用一箇中斷,將每個接收到的字節複製到本地緩衝區中,該緩衝區將由TX線程讀取。

你可以有一個更好的解決方案,使用DMA通道接收數據幀,並在收到9個字​​節時收到通知。我不知道你的AVR設備是否有DMA外設。

1

你還在爲此工作嗎?你的問題的陳述是模糊的,但我有幾個建議/主要問題。 1)您可能需要的一些文件,看看有什麼寄存器 在 http://www.atmel.com/dyn/products/product_docs.asp?category_id=163&family_id=607&subfamily_id=2138&part_id=4117

2)在此獲得巨大的數據表PDF和先前的帖子你的國家,你有,在某些情況下,能夠接收數據。您需要從這些示例項目中找到USART HW初始化代碼,並將它們放入freeRTOS示例項目中。特別是呼叫

gpio_enable_module() with {AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION} 

要連接到USART到CPU 我相信

InitRs232() 

只是這樣做需要身邊有很多的代碼戳 - 有很多依賴。

2)你打什麼函數從USART0檢索數據? 19kbaud大約是2000bytes/sec或1byte/0.5ms,所以50ms輪詢是不夠的。我建議你的RX任務持續輪詢(從不明確地睡覺),但優先級低於TX任務。

3)集中調試調用RX任務來檢索數據。使用調試器查看usart的硬件寄存器。特別是

USART0 CR登記AVR32_USART_CR_RXEN_MASK應設置爲啓用RX
USART0 CSR寄存器AVR32_USART_CSR_RXRDY_MASK將指示是否有新的數據出現 您還可以檢查過低標誌來判斷是否你已經錯過了一些數據。 當讀取USART0 rhr時,它應該是您發送的一個字節。

如果你仍然在研究這個問題,我可以多看看這一點。