[완료]ARM 환경에서 assert 메세지를 UART로 출력하는 방법. 혹시 있나요?

lsfeel0204의 이미지

제가 ARM 환경에서 펌웨어 프로그래밍하고 있는데요.

혹시 UART 함수를 이용해서 에러가 발생한 위치(라인 또는 call stack)를 출력하는 방법이 있을까요?

호스트 레벨이 아닌 펌웨어가 돌아가고 있는 상태에서 말입니다.

assert함수를 재 정의하면 될것 같은데, 제가 이쪽에 지식이 많이 없어서 어렵기만 하네요...

현재로써는 UART로 error가 발생했다는 사실만 확인하고 있습니다...

혹시 힌트나 도움을 주실분 계신가요?ㅠㅠ

ps. 컴파일러는 RVDS 4.0을 사용하고 있습니다.

익명 사용자의 이미지

펌웨어 작성하시고 있고 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 같은거 붙이면, 문제가 일어난 위치에서 콜스택 다 보여주니까, 님과 같은 고민을 안 하는듯요.

lsfeel0204의 이미지

답변 감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.