AVR + IAR + Глобальные переменные

Jun 03, 2004 5 Replies

Thu Jun 03 2004 19:08, Pavel Sirotkin wrote to All:

PS> Хочется задать 3 переменные,одна из которых величиной 2 байта, PS> а две другие представляют из себя младший и старший байт первой.

PS> В CodeVision работает такая конструкция:

PS> unsigned int temp @ 0x60; PS> unsigned char temp_lsb @ 0x60; PS> unsigned char temp_msb @ 0x61;

PS> А вот IAR ругается на строчки:

PS> __no_init unsigned int temp @ 0x60; PS> __no_init unsigned char temp_lsb @ 0x60; PS> __no_init unsigned char temp_msb @ 0x61;

PS> Очень хочется,чтоб работало :-)

Тяжелое наследие ассемблерного детства :)

typedef union { u16 word; struct { u8 lsb; u8 msb; } byte; } MSB_LSB;

___no_init MSB_LSB temp;

"There is no business other then show business " (c)

Здравствуйте.



Хочется задать 3 переменные,одна из которых величиной 2 байта, а две другие представляют из себя младший и старший байт первой.



В CodeVision работает такая конструкция:



unsigned int temp @ 0x60; unsigned char temp_lsb @ 0x60; unsigned char temp_msb @ 0x61;



А вот IAR ругается на строчки:



__no_init unsigned int temp @ 0x60; __no_init unsigned char temp_lsb @ 0x60; __no_init unsigned char temp_msb @ 0x61;



Очень хочется,чтоб работало :-) Куда копать ? Заранее спасибо.



Hello, Pavel Sirotkin !

Это легко делается стандартными средствами (union, адресная арифметика etc.), зачем применять нестандартные?

И правильно делает.

С уважением, Дима Орлов.

Здравствуйте, Vladimir

VV> Тяжелое наследие ассемблерного детства :)

Желание максимально упростить программу и код покороче получить :-)

VV> typedef union { VV> u16 word; VV> struct { VV> u8 lsb; VV> u8 msb; VV> } byte; VV> } MSB_LSB; VV>

VV> ___no_init MSB_LSB temp;

компилируем -> получаем:

Error[Pe349]: no operator "*" matches these operands Error[Pe349]: no operator "~" matches these operands

Это мне перегрузку операторов делать ? Или я не так понял ??

А попроще никак нельзя ? :-)

Здравствуйте

VV> typedef union { VV> u16 word; VV> struct { VV> u8 lsb; VV> u8 msb; VV> } byte; VV> } MSB_LSB; VV>

VV> ___no_init MSB_LSB temp;

Извиняюсь,что то туплю. Разобрался.

Спасибо,за ответы.

Привет Pavel!

03 Jun 04 19:08, Pavel Sirotkin писал All:

PS> Хочется задать 3 переменные,одна из которых величиной 2 байта, PS> а две другие представляют из себя младший и старший байт первой.

PS> В CodeVision работает такая конструкция:

PS> unsigned int temp @ 0x60; PS> unsigned char temp_lsb @ 0x60; PS> unsigned char temp_msb @ 0x61;

PS> А вот IAR ругается

Правильно ругается - синтаксическая ошибка. Вообще-то в подобных случаев обычно используют union:

typedef struct { #ifdef __LITTLE_ENDIAN__ unsigned char lsb; unsigned char msb; #else unsigned char msb; unsigned char lsb; #endif } two_ch;

typedef union { unsigned int i; two_ch b; } uint_uchars;

Задавать же фиксированные адреса для переменных лучше примерно так:

#define temp (*(uint_uchars*)0x60)

А использовать нестандартные расширения ИМХО имеет смысл только там, где стандартными средствами языка задача не решается...

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Крыскас. Потому что крыса вам доверяет.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required