uart 인터럽트 예제

데이터 불일치로 인한 오류를 방지하기 위해 두 개 이상의 프로세스(예: 주 및 인터럽트 루틴)를 통해 전역 또는 공유 데이터에 액세스하고 수정할 때 상호 제외가 필요합니다. 이 문제는 레지스터에서 새 전역 또는 공유 변수 값이 변경되고 아직 메모리에 다시 기록되지 않은 동안 프로세스 간에 전환할 때 발생할 수 있습니다. OS를 사용하면 동기화 프리미티브를 사용하여 이 중요한 코드 섹션 문제를 해결합니다. OS가 없는 단일 프로세서 시스템에서는 인터럽트를 사용하지 않도록 설정하여 중요한 섹션에 대한 상호 제외를 제공할 수 있습니다. 이 경우 사용 중인 직렬 포트의 UART에서 인터럽트를 잠시 비활성화하기만 하면 됩니다. 변수 선언에 C의 휘발성 키워드는 해당 변수 원자성(즉, 비인터럽트)에 대한 작업을 수행하여 이 문제를 다소 해결하는 데 도움이 되지만 버퍼 배열에서 가능한 모든 문제를 해결하지는 못합니다. mbed 컴파일러에서 인터럽트를 __disable_irq()로 비활성화할 수 있습니다. __enable_irq()로 활성화됨; (즉, 접두사는 두 개의 밑줄입니다.) mbed C 컴파일러에서 NVIC_EnableIRQ() 및 NVIC_DisableIRQ(함수는 개별 인터럽트를 비활성화하고 활성화하는 데 사용됩니다. 데모 코드에서 UART1 인터럽트 하드웨어가 사용됩니다(예: UART1_IRQn). UART1은 p9 및 p10에 연결됩니다. 이 ARM Cortex M3 교과서와 LPC1768 사용자 설명서는 UART및 인터럽트 제어 하드웨어를 보다 자세하게 설명합니다.

LPC17xx.h에는 인터럽트 할당 및 이름이 포함되어 있습니다. 직렬 포트에 책도 있습니다. „OP1을 작성한 후 인터럽트가 발생하지만 OP2를 작성하기 전에 해당 인터럽트를 처리하는 데 승수가 사용되는 경우 원래 승수 모드 선택이 손실되고 결과를 예측할 수 없습니다. 이를 방지하려면 하드웨어 승수를 사용하기 전에 인터럽트를 사용하지 않도록 설정하거나 인터럽트 서비스 루틴에서 승수를 사용하지 마십시오.“ 당신은 단지 그 곱셈 주위에 인터럽트를 사용하지 않도록 설정하려고 했습니까? 나는 일종의 컴파일러 (또는 오히려 라이브러리)가 이것을 처리 할 것으로 예상한 것 같아요. 인터럽트를 명시적으로 활성화하고 사용하지 않도록 설정하지 않고는 다른 컨텍스트에서 곱셈을 안전하게 수행 할 수 없다는 것이 다소 이상해 보입니다. 나는 그것이 솔루션의 너무 일반적이기 때문일 수 있다고 생각한다. 그럼에도 불구하고, 나는 실제로 당신의 해결책을 더 좋아한다. 우리는 이미 요소의 수가 2의 힘이어야한다는 경고를 했기 때문에 각 요소의 크기가 2의 힘이되어야한다고 말할 이유가 없으므로 곱셈 대신 비트 이동을 할 수 있습니다.