19.4.2.2. orb_check() 함수로 새로운 데이터 수신 여부(Updated Flag) 확인
전 단원에서 픽스호크 데몬이 스스로 통제권을 꺾고 CPU 권한을 양보하며 잠드는 px4_usleep이라는 코어 생명선 타이머를 구축해 냈다면, 이제 스레드가 깊은 잠(usleep)에서 깨어난 바로 직후 메인 루프에서 버퍼를 무식하게 즉각 열어제끼기 전에 먼저 “똑똑” 가볍게 껍데기에 노크(Knock)를 해보는 고상하고 우아한 커널 예의범절, 즉 orb_check() 매크로 API의 실행 기법을 코드에 정식 타설할 차례이다.
이 위대한 스케줄링 함수는 절대 VFS 링 버퍼에서 무거운 거대 실제 페이로드 데이터를 무식하게 뜯어오려 시도하지 않는다. 단지 커널 스케줄러단에 맵핑(Mapping)된 마이크로 통제 레지스터 메타데이터 플래그(Flag)만을 아주 찰나에 가볍게 찔러보고, **“내가 마지막으로 이 파이프에서 추출해 간 이후로, 새로운 데이터가 한 방울이라도 추가되었는가?”**에 대한 절대적인 YES/NO 답변만을 메모리 포인터 bool 타입으로 번개처럼 빠르게 덮어 반환해 주는 엣지(Edge) 함수이다.
1. 런타임 링 버퍼 업데이트 체커(Update Checker) 게이트키퍼 로직 타설
무지성으로 구조체를 메모리에 선언하고 강제 orb_copy 딥 카피(memcpy)를 때리기 전에, 루프의 가장 윗단 입구에 이 초경량 체커 함수를 호출하여, 연산력 낭비를 입구컷(Cut) 원천 차단하는 강력한 수문장(Gatekeeper)을 물리적으로 세운다.
// 1. 메인 루프 진입 전, 미들웨어 VFS망 파이프 1회 강제 개통
int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_test_data));
while (!thread_should_exit) {
// 2. 가장 가벼운 1바이트 데이터 갱신 여부(Update Flag) 상태 메모리 캐시 변수 선언
// 매 루프마다 반드시 false로 깨끗이 지워 영 초기화(Zero-init)해 둔다.
bool updated = false;
// 3. [초경량 노크 타격] 링 버퍼 꼬리단에 내 스레드 몫의 새로운 지분이 생겼는지 VFS 체크
// - 첫 번째 인자 sensor_sub_fd: 내가 아까 개통권을 확보한 내 스레드의 전용 수신 파이프라인 핸들러 인덱스
// - 두 번째 인자 &updated: 새 프레임이 버퍼에 떨어졌으면 true, 아무런 변동이 없으면 false를 강제로 쑤셔 넣을 참조 포인터 C 주소
orb_check(sensor_sub_fd, &updated);
// 4. 무자비한 수문장 통제 분기: 무의미한 CPU 소비 및 L1 캐시 미스를 원천 차단하는 방어막
if (updated) {
// [업데이트 확정 통과 구간]
// 오직 updated == true 일 때만 이 안전지대로 단독 진입하여, 다음 단계인 무거운 카피 로직을 전개할 자격을 부여받는다.
PX4_INFO("New sensor data physically detected in VFS! Preparing deep memory copy...");
// (주의: 이 통과 블록 안쪽에 19.4.2.3 단원의 실제 orb_copy 탈취 연산 로직이 들어갈 것이다)
} else {
// [데이터 기아(Starvation) 허탕 구간]
// 저 반대편 퍼블리셔가 아직 데이터를 생성하지 않아 링 버퍼가 그대로라면,
// 불필요한 물리적 복사 연산을 물리적으로 시도조차 하지 않고 쿨하게 스킵(Skip)해버린다.
// 이것이 바로 CPU 점유율을 1% 밑으로 폭락시키는 시스템 구원의 핵심이다.
}
// 5. 이번 사이클에 먹을 게 있었건 없었건 간에, 다음 사이클을 기약하며 무조건 루프 꼬리에서 다시 쿨타임 수면 진입!
px4_usleep(200000);
}
2. orb_check()가 시스템 전역에 부르는 하드웨어 메모리 안정성의 나비효과
단 한 줄의 아주 가벼운 이 orb_check 방어선과 if(updated) 분기문이 루프 상단에 굳건히 구축됨으로써, 우리는 앞선 막가파식 단순 읽기(Simple Read) 아키텍처에서 핏빛으로 발생했던 1번 맹점, 즉 “변하지도 않은 똑같은 옛날 데이터를 무의미하게 수백 번 중복해서 까보는 쓰레기 짓(Over-reading)“의 끔찍한 오버헤드를 코어 시스템 레벨에서 0%로 완벽하고 치명적으로 박살 내버렸다.
이제 이 픽스호크 데몬은 아무리 px4_usleep 타이머 주기가 짧게 쪼개져 1초에 만 번 미친 듯이 루프를 헛돌고 제자리 돌기를 하더라도, 정작 버퍼에 새로운 패킷 조각이 떨어지지 않았을 때는 그 무겁고 거대한 C++ 구조체 객체 할당이나 memcpy 블록 카피를 단 한 번도 무식하게 수행하지 않고 찰나의 순간에 0.001ms 만에 루틴을 스킵하고 다시 잠들어 버린다.
이것은 극한의 배터리와 한정된 1MB SRAM 생태계 위에서 몸통을 비틀고 있는 전체 픽스호크 보드의 I/O 캐시 미스(Cache Miss) 확률을 기적적으로 줄여주며, 자세를 잡아야 하는 다른 핵심 비행 연산 코어 데몬들의 숨통을 크게 틔워주는, 진정한 펌웨어 코어 아키텍트로서 보여줄 수 있는 최고의 시스템 해킹 최적화 미학인 것이다.