這是我的頭文件(Header.h)volatile變量或用C揮發性結構問題
#include <stdio.h>
#include <string.h>
void Process(void);
和 「Header.C」
#include <stdio.h>
#include <string.h>
#include "Header.h"
struct St{
unsigned long int volatile Var1;
unsigned long int volatile Var2;
unsigned char volatile Flag;
};
extern struct ST Variable;
void Process(void){
Variable.Var1=Variable.Var2;
}
和主文件:
#include <stdio.h>
#include <string.h>
#include "Header.h"
struct St{
unsigned long int volatile Var1;
unsigned long int volatile Var2;
unsigned char volatile Flag;
};
struct ST Variable;
//Interrupt each 10us
void TIM_IRQHandler(){
//Do something
if(something==True)
{
Variable.Flag=1;
Variable.Var2=AVariable; //AVariable is between 30-40
}
}
int main(){
while(1)
{
//wait 10ms
if(Variable.Flag==1)
{
Process();
Variable.Flag=0;
}
}
}
正如你可以看到一箇中斷每10us發生一次,如果它正確地執行了一些代碼,它將改變Var2的數值在30-40之間,並設置一個Flag變量樂。在主代碼中,如果標誌已被設置,它應該是呼叫處理功能並且用Var2值更改Var1。 但有時我收到var1與其他奇怪的值,他們是不正確的。我測試了我的中斷,我發現我從來沒有填寫我的Var2奇怪的值。
void TIM_IRQHandler(){
//Do something
if(something==True)
{
Variable.Flag=1;
Variable.Var2= < 30-40>;
}
if(Variable.Var2>40 || Variable.Var2<30){
printf("ERROR");
}
}
和所有中斷功能工作正常,但在過程功能,它讓我生氣。
我會欣賞任何我沒有注意到的技巧。
這是什麼意思? 'Variable.Var2 = < 30-40>;'它是如何編譯的? – Arash
這不是我的確切代碼,但它意味着它的值可能在30到40之間 –
@Ehsan Zakeri:當前一個結果仍在處理中時,您有可能發生第二次中斷觸發和'Var2'的潛在競賽。如果讀取不是原子的,比如在一個典型的8位MCU上,那麼你可能會得到一些來自前一個值的字節,一些來自新的。最簡單的解決方法是在Process之前重置'Variable.Flag'並測試,看看它是否在之後再次被提升,在這種情況下,你可以旋轉並重試。相反,該標誌應該是'sig_atomic_t'類型,在實踐中這不太可能是個問題。還有其他需要注意的問題。 – doynax