메인 루프와 1 밀리 초 인터럽트가있는 마이크로 컨트롤러가 있다고 가정합니다. (메인 루프의 실행을 방해하는 것이 무엇인지 모르는 경우 ..... 1 밀리 초마다 발생하기 때문에 1 밀리 초 인터럽트). 않는 나는 Status
변수를 갱신 메인 루프의 코드 섹션을부분 휘발성 변수?
volatile status_t Status;
지금 :
은 내가 메인 루프와 밀리 초 인터럽트 사이에서 통신하는 데 사용하는 변수가 거기에 변환의 톤 :
cli(); // This temporarily turns off interrupts, so we don't
// modify the variable unsafely
Status.UpdateStuff();
Status.UpdateOtherStuff();
//etc.
sei(); // Turn interrupts back on
문제는 이러한 기능의 각 ...... 컴파일러가 로컬 메모리에 상태의 값을 캐시 할 수 Status
를 다시 작성 Status
호출한다는 것입니다.
이 내가 할 희망 일을 할 것인가, 아니면 얻을 수있는 더 좋은 방법이있다 :
이cli();
status_t* localStatus = (status_t*)&Status;
localStatus->UpdateStuff();
localStatus->UpdateOtherStuff();
//etc.
Status = *localStatus;
sei();
여기 진짜 문제는 이것이다 :
이 문제에한 가지 가능한 해결책은 이것이다 최적화 프로그램이 변수를 캐시하는 대신 변수를 새로 고치는 문제가 있습니까?
두 번째 발췌 문장에서는 '& Status'를 사용한다고 가정합니다. BTW, 나는 훨씬 더 좋은 대안이 있다고 생각하지 않는다. –
타이머가 대기열에 작업을 삽입하고 주 스레드가 대기열을 읽고 작업을 처리하도록하십시오. 대기열 작업에만 뮤텍스가 필요합니다. –
@MatteoItalia 그래, 그게 무슨 뜻인지 ... – DarthRubik