운영체제가 설치된 환경에서 스레드 안전 IO (예 : 디버그 직렬 포트로가는 printf)를 가장 잘 구현하는 방법에 대한 조언을 찾고 있습니다. 스케줄러가 아직 시작되지 않았거나, 실행 중이거나, 일시 중지되었거나, 중지되거나 중단되었을 수 있습니다. 나는 Newlib과 FreeRTOS를 사용하고있다.스케줄러가 시작되기 전 (또는 멈춘 후) IO 용 FreeRTOS 큐
지금은 _write 시스템 호출 (Newlib) 대기열 문자를 FreeRTOS queue에 넣는 (겉으로보기에 표준적인) FreeRTOS 접근 방식을 사용하고 있습니다. 그런 다음 직렬 포트 하드웨어를 채우는 인터럽트 서비스 루틴에서 비 웁니다 FIFO가 FIFO 빈 인터럽트를 기다리는 경우).
이것은 (적어도 FreeRTOS에서) 스케줄러가 실행 중일 때 큐를 안전하게 사용할 수 있고 인터럽트가 비활성화되어있을 때 디버그 출력을 인쇄 할 수 없다는 단점이 있습니다 (스케줄러가 시작될 때까지 부팅하는 동안, 또는 치명적인 오류 조건 (정확히 어디에서 디버그 printf 출력이 가장 유용 할 것인가 :-)
_write 시스템 호출에 스케줄러 및/또는 인터럽트 상태를 쿼리하고 스케줄러가 실행 및 차단/폴링 직렬 IO 인터럽트가 비활성화 된 경우? 아직 생각하지 않은 더 우아한 아이디어가 있습니까?
감사합니다
치명적인 오류가 발생한 후에 함수 포인터의 무결성에 의존하는 것이 좋습니다. – nategoose
글쎄, 내가 본 것처럼, 콜백 함수 포인터가 치명적인 오류를 일으킨 것이 무엇이든간에, printf() -> _write() -> UART 체인의 다른 많은 것들도 분쇄되어 어쨌든 ... _write 호출이 스케쥴러 상태를 명시 적으로 폴링하고 함수 포인터를 먼저 업데이트하는 것을 제외하고 Maygarden 판사가 제안한 것과 같은 것을 수행했습니다. (새로운 하드웨어에서의 초기 단계 디버깅은 나의 편집증을 정당화합니다 :-) – hugov