저는 주로 C.에서 프로그래밍 된 임베디드 마이크로 컨트롤러를 가르칩니다. (예 : dsPIC33fj128gp804) 나는 전역 변수를 사용하며 전염병과 같이 전역 변수를 사용하여 읽지 않은 모든 것을 거부합니다. 나는 더 적은 것을 사용하려고 노력하고 있지만 전역 변수를 사용하지 않는 방법을 모르는 시나리오가 있습니다.인터럽트가있는 전역 변수는 무엇입니까?
마이크로 컨트롤러에는 인터럽트가 장착되어 있습니다. 인터럽트는 하드웨어에서 외부 적으로 트리거되는 이벤트입니다. 인터럽트가 트리거되면 주 코드의 실행이 중지되고 현재 작업 변수가 저장되고 사전 할당 된 함수가 실행 된 다음 주 코드가 중단 된 위치에서 다시 선택됩니다. 인터럽트는 언제든지 트리거 할 수있는 독립 실행 형 함수이기 때문에 함수 안팎으로 아무 것도 전달할 수 없습니다.
예를 들어 UART 하드웨어가 한 바이트의 데이터를 수신하면 데이터는 하드웨어 버퍼에서 이동하여 쓰기가됩니다.
void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void)
{
GlobalVariable = U2RXREG; // Move data to global variable
IFS4bits.U2RXIF = 0; // Clear the UART2 Receive Interrupt Flag
}
전역 변수없이이를 수행하는 방법이 있습니까? 아니면 예외입니까?
다른 스레드와 ISR (인터럽트 서비스 루틴)의 경우 실제로 전역 데이터를 사용해야합니다. 그러나이 데이터에 액세스 할 때 때때로 상호 배제를 보장해야합니다. –
세계는 전염병이 아닙니다. 많은 사람들은 실제로 왜 또는 왜 다른 사람이 아닌지 알 수 없다고 말합니다. 당신이 알고있는 것과 함께 가서 천천히 거기에서 추측에 대한 경험을 바탕으로 변화하십시오 ... –
@ dwelch의 조언을 "천천히"변화 시키면 버그 수를 "천천히"줄이는 것을 알 수 있습니다! 아마 우리는 많이 동의하지만, 나는 그것에 동의 할 지 확신하지 못한다. 그러나 많은 사람들이 맹목적으로 왜 "더 포괄적이지 않은"진리를 따르는 지 그 이유는 무엇보다 중요한 것은 아마 적절한 대안을 이해하는 것입니다. 왜 그리고 어떻게해야하는지에 대한 이해가 필요하다. 전염병에 관해서는 : [세계의 수족관] (http://www.embedded.com/electronics-blogs/break-points/4025723/A-pox-on-globals). – Clifford