鎖定問題**,對所有全域性變數互斥訪問**逐一注釋,同時檢測注釋後是否停止丟幀:鎖定問題**位置;
在問題**處新增除錯**,通過串列埠重定向列印相關全域性變數;
雖然方法費時費力,但很快有了突破:列印出來的全域性變數僅反覆的進行加0操作,其未做任何改變,但仍發生丟幀,由此推論:串列埠丟幀是由於全域性變數互斥訪問引起的可能性極大。
解決方法:1、使用中斷開關,在進行互斥訪問前關閉中斷,完成後再開啟中斷;2、使用ldrex/strex指令;
為了最快地解決問題,先暫時採用方法一(以下是部分**):
void uart_it_sw(functionalstate state)void usart1_irqhandler(void)
} static int front=0;
static int rear=0;
static int count=0;
void push(unsigned char tmp)
else
}void pop(int len)
uart_it_sw(disable); //互斥訪問前關閉串列埠中斷
front+=len;
front%=max_queue_len;
count-=len;
uart_it_sw(enable); //互斥訪問結束重新開啟串列埠中斷
}
}void empty(void)
結果:在開啟互斥訪問中斷開關後,長時間大量測試下均未發生丟幀。
總結:如何鎖定和確定問題和解決問題的最終方法一樣的重要;其次大膽猜測,用後驗邏輯去解決問題也不失為一種解決問題的好思路。
全域性變數中斷原子操作 微控制器中斷全域性變數保護方法
首先要明白這幾個知識點 關鍵字volatile的使用,原子操作,臨界區的使用。明白的直接跳到文中的4.全域性變數的使用及保護處檢視。1.關鍵字volatile 關鍵字volatile用於告訴編譯器,說明被修身的變數可能會被意想不到地改變,防止編譯器對 進行優化。比如如下程式 1ucnms 0x65 ...
全域性變數中斷原子操作 微控制器中斷全域性變數保護方法
首先要明白這幾個知識點 關鍵字volatile的使用,原子操作,臨界區的使用。明白的直接跳到文中的4.全域性變數的使用及保護處檢視。1.關鍵字volatile 關鍵字volatile用於告訴編譯器,說明被修身的變數可能會被意想不到地改變,防止編譯器對 進行優化。比如如下程式 1ucnms 0x65 ...
全域性變數的使用
什麼是全域性變數呢?我們知道,全域性變數是這樣的變數,他們能夠在這個程式中的任何位置都被使用,也就是說,不管是main函式中,還是我們自己寫出來的函式中,都可以無條件的使用他們,雖然這對於我們看來很是方便,但是他隱含的卻違背了結構化的程式設計思想,所以在我們程式化的設計過程中,應該少用全域性變數。在...