IAR이라는 컴파일러에서 신기한걸 목격했습니다.더불어 질문포함.

puaxx의 이미지

IAR컴파일러로 컴파일되던 소스코드를 avr-gcc에서 돌수 있도록 포팅 하고 있습니다.

근데 포팅하다보니 신기한걸 발견했습니다.

__io union {
unsigned char SREG; // The sfrb as 1 byte
struct { // The sfrb as 8 bits
unsigned char SREG_Bit0:1,
SREG_Bit1:1,
SREG_Bit2:1,
SREG_Bit3:1,
SREG_Bit4:1,
SREG_Bit5:1,
SREG_Bit6:1,
SREG_Bit7:1;
};
} @ 0x3F;

위에서 보면 @ 0x3F라고 되어있네요. 이건 avr-gcc에서는 컴파일이 안되는지 error: stray '@' in program 만 뱉어 내는군요.

혹시 저게 어떤의미를 가지는지 정확히 아시는분 계신가요?

gcc에서도 비슷한 의미를 가지게 만들수가 있을까요?

bugiii의 이미지

특정 어드레스를 지정하는 것입니다. 특정 번지를 지정한 후 그 비트들을 쉽게 조작할 수 있도록 한 것인데, 어떤 컴파일러는 비트필드가 아니라 그 비트들을 바로 변수로 지정하는 것도 가능합니다. 이렇게 하면 귀찮은 논리 연산 없이도 특정 비트를 조작할 수 있습니다.

그 특정 어드레스는 CPU의 주변 장치에 대한 제어를 위한 것이거나 빠른 레지스터로 이용하능하게 하는 것있습니다. 해당 CPU (8051 계열 같습니다.) 의 그 번지가 어떤 의미인지 조사해보시면 될 것입니다.

아마도 avr-gcc 에서도 이와 같은 것을 컴파일러 확장으로 제공할 것입니다. 찾으시면 여기에 한번 남겨 주세요.

익명사용자의 이미지

SREG는 SFR의 주소로 접근할 수 있습니다. (그 주소를 지정한 문법일 것이고요...) avr-gcc에서는 SREG가 이미 선언되어 있으므로 따로 선언하지 않아도 됩니다. 다만 bit를 union 형태로 선언해서 접근하는 건 프로그램을 좀 바꿔야 할 듯 싶네요.

nobut0의 이미지

질문과 관계된 댓글은 아니지만 저역시 IAR로 만들었던 프로그램을 AVR-GCC로 바꾸려는 작업을 하고 있습니다.
글쓰신 분께서는 포팅 작업을 한다고 하셨는데 단순히 헤더부분만 INCLUDE 해서는 정상적으로 되지 않아서 그런 것인가요?
제 단순한 생각으로는 컴파일러만 IAR에서 AVR-GCC로 바꾸고 단지 CPU포트에 관계된 IOM128.H 라던가 IO.H 같은 것들만 IAR의 INC를 가리키게끔 하면 된다고 생각했습니다.
그런데 이런 INCLUDE 작업조차도 에디터에서 지정하던 makefile에서 지정하던 관계없이 정상적으로 읽어들이지 못하네요.
혹시 같은 문제로 인해 소스를 수정하시는 건지 궁금합니다.
며칠째 이문제로 골머리를 앓고 있네요.

make life meaningful!

SoftOn의 이미지

소스 수정해야 됩니다.

IAR compiler가 @ 문자를 어떻게 해석하는가를 찾고 그에 맞는 avr-gcc 문법을 찾아서 바꿔야 합니다.

제가 8051용 IAR만 있어서;;
다음 경로에서 관련 문서를 찾을 수 있었습니다.

C:\Program Files\IAR Systems\Embedded Workbench 4.05\8051\doc\EW8051_CompilerReference.pdf

page 86을 보면 다음과 같이 '@'에 대해서 설명되어 있더군요

Data placement at an absolute location
To place a variable at an absolute address, the argument to the operator @ and the
#pragma location directive should be a literal number, representing the actual
address.
Example
__no_init char alpha @ 0x80; /* OK */
__no_init __bit bool beta @ 0x60; /* OK */
#pragma location=0x90
__code const int gamma; /* OK */
__xdata_rom const int delta @ 0xA0 = 3; /* OK */
int epsilon @ 0xB0; /* Error, neither */
/* "__no_init" */
/* nor"const".*/

그럼 이제 '@'를 어떤 의미로 사용한 건지 알았으니 avr-gcc 문서 보시고 같은 기능을 하는 문법을 찾아서 바꿔야겠죠;; ^^;

avr-gcc에서는 avr/sfr_defs.h를 참고하시면 아마 문법이 어떻게 되는지는 알 수 있을겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.