2010-05-04 7 views
3

운영체제가 설치된 환경에서 스레드 안전 IO (예 : 디버그 직렬 포트로가는 printf)를 가장 잘 구현하는 방법에 대한 조언을 찾고 있습니다. 스케줄러가 아직 시작되지 않았거나, 실행 중이거나, 일시 중지되었거나, 중지되거나 중단되었을 수 있습니다. 나는 Newlib과 FreeRTOS를 사용하고있다.스케줄러가 시작되기 전 (또는 멈춘 후) IO 용 FreeRTOS 큐

지금은 _write 시스템 호출 (Newlib) 대기열 문자를 FreeRTOS queue에 넣는 (겉으로보기에 표준적인) FreeRTOS 접근 방식을 사용하고 있습니다. 그런 다음 직렬 포트 하드웨어를 채우는 인터럽트 서비스 루틴에서 비 웁니다 FIFO가 FIFO 빈 인터럽트를 기다리는 경우).

이것은 (적어도 FreeRTOS에서) 스케줄러가 실행 중일 때 큐를 안전하게 사용할 수 있고 인터럽트가 비활성화되어있을 때 디버그 출력을 인쇄 할 수 없다는 단점이 있습니다 (스케줄러가 시작될 때까지 부팅하는 동안, 또는 치명적인 오류 조건 (정확히 어디에서 디버그 printf 출력이 가장 유용 할 것인가 :-)

_write 시스템 호출에 스케줄러 및/또는 인터럽트 상태를 쿼리하고 스케줄러가 실행 및 차단/폴링 직렬 IO 인터럽트가 비활성화 된 경우? 아직 생각하지 않은 더 우아한 아이디어가 있습니까?

감사합니다

답변

2

아마도 _write 시스템 호출에서 간접 참조를 사용하는 것이 약간 더 편할 것입니다. 상태를 확인하는 대신 함수 포인터를 사용하여 스케줄러 실행 여부, 인터럽트 사용 여부 등을 기준으로 원하는 기능을 수행하십시오. 그런 다음 프로그램 상태가 변경 될 때 적절한 콜백 함수를 설정하십시오.

int (*writeCallback)(int, const void *, unsigned int); 

int 
_write(int fd, const void *buffer, unsigned int count) 
{ 
    return writeCallback(fd, buffer, count); 
} 

... 

writeCallback = polling_write; 

... 

writeCallback = rtos_write; 

... 

또는, 당신은 당신이 인터럽트/RTOS 시설 (예를 들어, 예외 핸들러)가 없습니다 알고 장소에서 사용하는 표준 라이브러리 스트림 시스템을 우회 다른 디버그 기능 (즉, printf와)를 정의합니다.

+0

치명적인 오류가 발생한 후에 함수 포인터의 무결성에 의존하는 것이 좋습니다. – nategoose

+0

글쎄, 내가 본 것처럼, 콜백 함수 포인터가 치명적인 오류를 일으킨 것이 무엇이든간에, printf() -> _write() -> UART 체인의 다른 많은 것들도 분쇄되어 어쨌든 ... _write 호출이 스케쥴러 상태를 명시 적으로 폴링하고 함수 포인터를 먼저 업데이트하는 것을 제외하고 Maygarden 판사가 제안한 것과 같은 것을 수행했습니다. (새로운 하드웨어에서의 초기 단계 디버깅은 나의 편집증을 정당화합니다 :-) – hugov