我有一個微控制器必須從PC串行端口(115200波特)下載一個大文件,並通過SPI(〜2 MHz)將其寫入串行閃存。閃存寫入必須在256字節塊之後,寫入命令和頁面地址。系統上可用的RAM總量爲1 kB,堆棧大小爲80字節。如何在內存受限的嵌入式系統上處理大數據傳輸?
目前,這是通過從UART填充256字節的緩衝區,然後ping到另一個256字節的緩衝區,通過接收緩衝區就緒信號上的中斷來填充,同時在寫入忙時寫入閃存。重複緩衝區交換直到操作完成。
我寧願設置TX/RX中斷兩種,關於單獨的循環緩衝區操作SPI和UART接口處理器。因此,不用輪詢新字節並等待操作完成,我可以簡單地填充TX緩衝區並啓用中斷或檢查緩衝區中的傳入數據。這會給實際工作帶來更多的時鐘週期,而不是等待外設。
實施IRQ與128字節循環緩衝區後,我輪詢數據的UART接收緩衝區,並立即將其置於SPI TX緩衝區做文件傳輸。我用這種方法遇到的問題是,我沒有足夠的RAM用於緩衝區,並且PC接收緩衝區的填充速度比我將數據傳送到閃存發送緩衝區的速度要快。很顯然,傳輸速度不是問題(115.2 kHz輸入和2 MHz輸出),但是在每個256字節頁面發送後都有一個寫週期等待。
看來頻繁的SPI中斷阻塞了一些UART中斷並導致字節被漏掉。我選擇的解決方案是爲UART接收中斷使用環形緩衝區,並將數據送入256字節的頁面緩衝區,通過輪詢字節傳輸和寫入完成,發送到串行閃存。 128個環形緩衝區足夠大以防止SPI寫入期間發生溢出。
這實際上是通過USB接口發生的,這些信號不可用。不過這是個好建議。 – 2008-12-11 15:57:36