[완료]ARM 환경에서 assert 메세지를 UART로 출력하는 방법. 혹시 있나요?
글쓴이: lsfeel0204 / 작성시간: 수, 2011/10/05 - 10:59오후
제가 ARM 환경에서 펌웨어 프로그래밍하고 있는데요.
혹시 UART 함수를 이용해서 에러가 발생한 위치(라인 또는 call stack)를 출력하는 방법이 있을까요?
호스트 레벨이 아닌 펌웨어가 돌아가고 있는 상태에서 말입니다.
assert함수를 재 정의하면 될것 같은데, 제가 이쪽에 지식이 많이 없어서 어렵기만 하네요...
현재로써는 UART로 error가 발생했다는 사실만 확인하고 있습니다...
혹시 힌트나 도움을 주실분 계신가요?ㅠㅠ
ps. 컴파일러는 RVDS 4.0을 사용하고 있습니다.
Forums:
지나가다
펌웨어 작성하시고 있고 RVDS 쓰시고 계시다구요.
대부분 이런 경우 C로 작성은 하지만, 웬만한 CRT 함수들은 사용이 제약된다는 건 알고 계시지요?
예를 들면, memcpy 정도는 쓸 수 있지만, malloc/free 는 못 쓴다던가. 그걸 쓰려면 RVDS 컴파일러 매뉴얼에 나오는 몇가지 함수들을 정의해주어야 한다는 것 쯤은 알고 계시죠?
또 하나 더 예를 들면, CRT의 printf() 는 못 쓰지만 몇가지 io 드라이버 역할을 해주는 함수들을 구현 해주면 printf(), scanf() 도 쓸 수 있게 되는거 까지 이해는 하시고 계신지...?
그것들을 일일이 구현하기 싫으시면, TRACE32 에 붙여서 세미호스팅같은거 쓰시는 것도 가능하고... 뭐 그렇습니다. RVDS 컴파일러 매뉴얼에 보시면 나옵니다.
그런데, 특히 한국에서는 현장에서 그렇게 까지 깊이 있게 이해를 하고 프로그래밍을 하는 엔지니어를 본적은 없는 것 같고, 대부분은 UART_printf() 정도로 구현해서 사용하시는듯...
assert()는 그냥 에러 메시지 출력 후 멈추는 정도 밖에 안 하구요. RVDS CRT에서 제공하는 assert() 를 쓰려면 뭔가를 추가 구현해야할 것 같은데, 일단 제가 매뉴얼이 지금 없으니 패스하고.
대충, MY_ASSERT() 정도로 구현해서 쓰신다고 한다면,
#define MY_ASSERT(x) do { if (x == 0) { UART_printf("Assertion failed at %s:%d\n", __FILE__, __LINE__); DumpStack(); StopForever(); } } while(0)
하면 될 것 같고,
질문의 요지는 DumpStack() 을 어떻게 할 거냐는 것이시죠?
척박한 펌웨어 환경이시라니, 일단 좀 힘들 것이구요.
잘 노력하시면, 현재의 스택 프레임으로부터 한단계씩 말아 올리시면서 return address 를 뽑아내어 call stack 을 보여주실 수는 있겠지만,
펌웨어 이미지에 디버깅 심벌도 없을테니까 사람이 보기에 좋은 형태로 뽑아 내실 수는 없으니 큰 의미는 없을 거에요.
지나가다
TRACE32 같은거 붙이면, 문제가 일어난 위치에서 콜스택 다 보여주니까, 님과 같은 고민을 안 하는듯요.
감사합니다.
답변 감사합니다^^
댓글 달기