硬體環境: stm32f105rct6
軟體環境:freertosv8
問題描述:採用中斷方式接收資料,然後將收到的一幀資料放入訊息佇列,然後有專門的乙個任務用來從訊息佇列中取資料並處理。jlink除錯以及燒錄執行都是可以的,但是當隨著通訊頻率的增加以及執行時間的加長,系統會出現「宕機」(即,不停的進入中斷而致使主程式流程無法執行);
問題分析:根據現象猜測 1、是否為堆疊溢位了呢? 2、是否頻率太高了呢? 3、是否標誌位忘記沒有清除呢?
然後逐項進行測試:
1、查htm檔案確定大概需要的堆疊,發現確實存在溢位的可能:
而我分配的為:
2、將傳送頻率降低然後長時間執行,400ms的傳送頻率(uart配置的波特率為9600,資料幀長度為8位元組),燒錄執行後大約1小時後就有可能復現問題。所以覺得應該是別的地方還是存在問題,頻率過高並不是導致該問題的根本原因,高頻率只是讓問題更容易出現。
3、將所有的串列埠錯誤的中斷檢測均加上,看是哪兒出現了異常,中斷捕獲採用usart_getitstatus,在捕獲到中斷後,清楚中斷置位,發現長時間執行後還是不停進入中斷,但是usart_getitstatus檢測到的所有中斷位均是reset,為什麼會一直進入中斷呢,即使已經不傳送資料了,然後想到可以通過usart_getflagstatus來檢測;將所有的檢測錯誤的方式均換成usart_getflagstatus,發現存在ore中斷置位,然後在結果為set時,清除置位;長時間執行程式,ok,問題沒有復現。傳送頻率改為10ms,執行一晚上問題沒有復現,到此問題得以解決。
結論:在使用串列埠中斷接收資料時,ore中斷應通過usart_getflagstatus來進行捕獲。
STM32F10x系列 中斷
概念問題 中斷與事件有什麼聯絡與區別?stm32之中斷與事件 中斷與事件的區別 簡單概括下。中斷 cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多...
STM32F10X入門 流水燈
2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...
STM32F10X 位帶操作
在stm32微控制器的學習中,有乙個最大的特點就是你所編寫的stm32的程式操作,基本上都是匯流排的操作,比如gpiob odr 0x0001 或者直接等於1 這樣的操作必須要考慮整個暫存器的資料,但其實如果學過51微控制器的人都知道,我們除了對於匯流排操作外,我們還是經常會對單獨的位進行操作,比如...