저는 Atmel의 XMEGA 장치 용으로 작은 Zigbee 라이브러리를 구현하고 있습니다. 지그비 (Zigbee) 라디오는 내부 USART를 사용하여 MCU와 통신합니다.순환 버퍼 구문 분석
라이브러리를 작성하기 시작할 때 고정 된 배열과 수신 된 데이터에 대한 인터럽트를 사용했습니다. 지그비가 프레임 길이를 알기 때문에 전체 커맨드를 얻었 으면 (마지막으로 시작 구분자와 체크섬을 뺀) 인터럽트 서비스 루틴에서 플래그를 설정하고 배열을 다른 배열로 복사합니다. 내 주요().
배열을 복사 한 후에 다른 루틴 ZBProcessFrame이 프레임을 파싱하고 적절한 조치를 취합니다.
이 접근법의 잠재적 인 문제는 배열을 복사하는 동안 다른 메시지가 올 수 있으며이 공유 변수를 변경할 수 있다는 것입니다.
온라인으로 읽는다면 어레이를 복사하는 동안 인터럽트를 끌 수도 있고 순환 버퍼를 사용해야한다는 것입니다. 그러면 어레이 전체를 복사하지 않아도됩니다. 32 바이트 순환 버퍼를 성공적으로 구현했지만 이제는 실제 데이터가 시작된 위치와 시작 구분 기호 이후의 바이트 수를 어떻게 알 수 있습니까?
ISR(Receiver Interrupt)
{
ring->add(USART_Data);
}
나는 구분 기호 여기부터 확인하고 유효한 명령이 여기에있다 넣다 플래그를 설정해야 : 내 ISR은 다음있다? 그런 다음 main()은 플래그를 계속 볼 수 있고 발생하면 유효한 명령이 있다는 것을 의미합니다.
이 방법이 유효한 방법입니까 아니면 대안을 찾아야합니까?
여기에 속임수가 없습니다. 단 하나의 리더와 하나의 작성자 (ISR 일 가능성이 있음)를 제공하면 소비자의 ISR 및 RP에 WP 만 쓸 필요가 없으므로 잠재적 경쟁 조건이 발생할 수 있습니다. 이 배열은 잠금없는 순환 버퍼를 생성합니다. SMP 시스템이나 CPU가 주문에 맞지 않는 명령을 사용하는 경우에는 메모리 장벽을 사용해야합니다. – marko
@marko 그게 내가하는 일이야. – saad
아니요. 버퍼에서 바이트를 읽을 때 인터럽트를 비활성화한다고 가정 해보십시오. 당신은 이것을 할 필요가 없습니다. – marko