내 프로그램에서 이상한 동작이 발생했습니다. 문맥을 위해, 나는 STM32F469 마이크로 컨트롤러를 프로그래밍하고있다. 사용 된 IDE는 SW4STM32입니다 (Eclipse Neon 버전 (4.6.3) 포함).STM32F4, IRQ 처리기와 공유 변수가있는 함수 간의 이상한 동작
이void foo(void){
while(1){
if(var.x == 1){
var.x = 0;
var.y = 1;
// Some irrelevant calculus
var.y = 0;
}
}
foo()
기능은 특정 아무것도하지 않습니다
var
을 사용하여 다른 관련없는 것들 사이에서 작동합니다. 이름 상태로
void interruption(void){
if(var.x == 0 && var.y == 0){
// Some irrelevant calculus
var.x = 1;
}
}
는 interruption()
함수는 ISR (중단 서비스 루틴)입니다. 이 ISR과 관련된 인터럽트는 약 16ms마다 발생합니다. 그것은 같은 전역 변수 (구조체) var
와 함께 작동합니다. 마지막으로
main
:
int main(void)
{
myStruct var;
var.x = 0;
var.y = 0;
// Some initialization (the ISR for example)
foo();
}
좋아 내가 이해하지 못하는 것입니다 그 전체 과정에만 작동합니다 "뭔가"예를 들어 while
루프와 if
조건 사이에 존재하는 경우 : 지연 또는 foo()
기능의 핀 상태의 스위치 :
void foo(void){
**Place something here to make the process work, a 1ms delay for example**
while(1){
if(var.x == 1){
var.x = 0;
var.y = 1;
// Some irrelevant calculus
var.y = 0;
}
}
다만 구체적으로 : 작동하지 않을 때, 그것은 둘 다 내 프로그램은 0,123,103 통과 없다는 것을 의미한다ISR의 조건이나의 if
조건. 그것이 작동 할 때, 프로그램은 둘 다 통과한다 (if
상태). 이 값의 var.x == 0
var.y == 1
- 모두 외부
if
조건이 참인지if
조건이 모두 거짓이라는 사실을 의미한다. 문제는 여기에 무엇인가 잘못되었습니다. 일반적으로이 값은foo()
함수의 조건에서만 발생합니다. 그리고이 상태에있는 경우var.y
은이고이 조건이 끝나면0
과 같습니다.
var
은 현재 다른 곳에서는 사용되지 않습니다.
제 질문은, 당신은이 현상에 대한 설명을 해 주시겠습니까?
감사합니다.
나는 '휘발성'키워드를 사용해야하는 방법, 이유 및시기를 완전히 이해하지 못했습니다 (기사 상태는 btw). 이제 알았어. 그것은 문제를 해결했습니다. 감사 ! – vionyst
@ D.Shawley 귀하의 경우 충분하지 않습니다! 그것도 원자가되어야합니다. volatile은 객체의로드 및 저장 만 보장하지만 원자 성은 보장하지 않습니다. 그는 값을 확인하고 변경되는 값 (로드/수정/저장 사이)에 대한 조치를 취합니다. –