Изменчивые переменные или проблемы изменчивой структуры в C
Вот мой заголовочный файл (Header.h)
#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;
}
}
}
Как видите, прерывание происходит каждые 10 мксек, и если оно правильно выполняет некоторые коды, оно изменит Var2 со значением между 30-40 и установит переменную Flag. в основном коде, если установлен флаг, это должна быть функция вызова процесса и изменение Var1 со значением Var2. Но иногда я получаю 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");
}
}
и все функции прерывания работают нормально, но в функции процесса это меня злит.
Буду признателен за любые хитрости, на которые я не обратил внимания.
1 ответ
Никогда ничего не ожидайте, когда используете ключевое слово "volatile" внутри любого типа typedef. Вы объявляете тип "struct St", включая ключевое слово. Ваше описание подразумевает, что вы ожидаете изменчивого поведения для переменной "Переменная", которая определяется и объявляется без ключевого слова. По моему опыту, ключевое слово только иногда (в зависимости от платформы и компилятора) влияет на тип. Кажется, что он надежно влияет, если используется как в определении, так и в объявлении переменной.
Попробуйте изменить
struct ST Variable;
в
volatile struct ST Variable;
а также
extern struct ST Variable;
в
extern volatile struct ST Variable;
Кроме того, есть ли опечатка вокруг "St"!= "ST", с типом "struct ST", объявленным в другом месте?
Также, как примечание, вы можете переместить объявления типов в заголовок.
В настоящее время у меня нет доступа к среде C, поэтому, пожалуйста, извините, я не проверяю свой ответ.