이 질문은 운영체제가없는 소형 마이크로 컨트롤러를 프로그래밍하는 것에 관한 것입니다. 특히 현재 PICS에 관심이 있지만 문제는 일반적입니다.타이머를 사용하여 시간을 유지하는 것은 임베디드 마이크로 컨트롤러를 중단합니다
타이머 인터럽트 코드 (타이머 화재마다 두 번째 말) :
...
if (sec_counter > 0)
sec_counter--;
...
본선 코드 (비 인터럽트) :
나는 여러 번 시간을 유지하기위한 다음과 같은 패턴을 보았다
sec_counter = 500; // 500 seconds
while (sec_counter)
{
// .. do stuff
}
주 코드는 카운터를 다양한 값 (초뿐 아니라)으로 설정하여 반복 할 수 있습니다.
주류 코드의 sec_counter
에 대한 지정이 원자 적이지 않은 경우 여기에는 경쟁 조건이있는 것으로 보입니다. 예를 들어, PIC18에서 할당은 4 개의 ASM 문으로 변환됩니다 (그 시점에서 각 바이트를로드하고 그 전에 메모리 뱅크에서 오른쪽 바이트를 선택). 인터럽트 코드가 중간에 오면 최종 값이 손상되었을 수 있습니다.
이상하게도 할당 된 값이 256보다 작 으면 이라는 할당은 원자 번호가이므로 문제가되지 않습니다.
이 문제에 관해서는 맞습니까? 이러한 동작을 올바르게 구현하기 위해 어떤 패턴을 사용합니까? 이
- 인터럽트를 비활성화 : 나는 몇 가지 옵션을 참조하십시오. 이것은 깨끗하지만 전체 타이머를 소모합니다 (이전의 경우 1 초 발사 타이머는 다른 목적으로도 사용될 수 있음).
다른 아이디어?
그건 뭐였지? 그는 2 바이트를 가지고 있다는 사실에 대해 이야기하고, 따라서 4 개 작업에 소요 된 8 비트 값을 카운터에 기록 할 때 아무 문제의 원인이 없다는 것을 내 경험 movlw MOVWF movlw MOVWF – SurDin
이 정렬합니다. 문제는 워드의 HI 및 LO 부분 각각에 하나씩 두 개의 별도 쓰기 사이클을 사용하기 때문에 16 비트 값으로 시작됩니다. –
이것은 PIC에만 해당되므로 - piclist에 질문하십시오. 네가 원하는 대답을 얻을 수있을거야. – sybreon