2017-10-06 25 views
1

내 프로그램에서 이상한 동작이 발생했습니다. 문맥을 위해, 나는 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() 기능은 특정 아무것도하지 않습니다

이 지점으로 바로 이동하려면 여기 내가 가지고있는 것입니다. 여기서는 전역 변수 (struct) 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
    1. 모두 외부if 조건이 참인지

      if 조건이 모두 거짓이라는 사실을 의미한다. 문제는 여기에 무엇인가 잘못되었습니다. 일반적으로이 값은 foo() 함수의 조건에서만 발생합니다. 그리고이 상태에있는 경우 var.y이고이 조건이 끝나면 0과 같습니다.

    var은 현재 다른 곳에서는 사용되지 않습니다.

    제 질문은, 당신은이 현상에 대한 설명을 해 주시겠습니까?

    감사합니다.

  • 답변

    1

    아마도 실제 캐싱 레지스터 캐싱이 표시됩니다. 전역이 volatile (https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword 참조)으로 선언되어 있는지 확인하십시오. 기본적으로 생성 된 코드는 var.x이 현재 함수 외부에서 변경할 수 있다고 생각하지 않습니다. volatile 키워드는 비동기 작업 (ISR, 신호 처리기, 다른 스레드 등)에 의해 값이 수정된다고 가정해야한다고 코드 생성기에 알립니다.

    아, 언어가 volatile 키워드를 정의하므로 대상 언어가 C 또는 C++라고 가정합니다.

    +0

    나는 '휘발성'키워드를 사용해야하는 방법, 이유 및시기를 완전히 이해하지 못했습니다 (기사 상태는 btw). 이제 알았어. 그것은 문제를 해결했습니다. 감사 ! – vionyst

    +0

    @ D.Shawley 귀하의 경우 충분하지 않습니다! 그것도 원자가되어야합니다. volatile은 객체의로드 및 저장 만 보장하지만 원자 성은 보장하지 않습니다. 그는 값을 확인하고 변경되는 값 (로드/수정/저장 사이)에 대한 조치를 취합니다. –