|
Биты и IAR живут ли вместе, Экомомно ОЗУ |
|
|
|
Sep 6 2005, 06:21
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(asen @ Sep 6 2005, 09:03) <_< Народ ктонибуть знает как в IAR обьевить собственные флаги ??????? Битовые переменные, в смысле флаги, с IAR, на мой взгляд, отлично уживаются. Рекомендую детально изучить вот этот документ: http://www.gaw.ru/pdf/Atmel/app/avr/AVR035.pdf. В нем изложены рекомендации от IAR, как эффективно создавать код при помощи IAR C/C++...
|
|
|
|
|
Sep 6 2005, 06:43
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
Не знаю, как для AVR, но для MSP430 объявляю так Код typedef struct // Флаги { unsigned flt_prg: 1; unsigned ini_measure: 1; unsigned enable_calk: 1; unsigned enable_ind: 1; unsigned m_prtcl: 1; unsigned enable_temp_f: 1; unsigned enable_temp_q: 1; ........... можно ооочень много флагов объявить } FLAG; использую, например так Код volatile FLAG flag;
if ( flag.enable_temp_f == OFF ) { } Так работает не только в ИАРе, но и во всех нормальных С-компиляторах для винды, для ДОСа и даже работает в HiTech C для козлячих ПИКов... Заранее извиняюсь, если задел любителей ПИКов. :-)
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Sep 17 2005, 16:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Добавлю и я свой вопрос по иару Как корректно проверить флаг в регистре с учетом оптимизации кода? Поясню: в записи такого вида - while( UCSR1A & 0x06 ); для компилятора неочевидно, что значение UCSR1A может измениться само по себе, а не в результате действий программы. как тут быть? Я попробывал так: while ((UCSR1A & 0x06) == 0); виснет. тогда так: volatile unsigned char z = 0; while (z == 0) {z = (UCSR1A & 0x06);} код похож на правду M: LDS R16,_A_UCSR1A ANDI R16,0x06 ST Y,R16 LD R16,Y TST R16 BREQ M:
тоже виснет
А как правильно?
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Sep 17 2005, 17:12
|

Участник

Группа: Свой
Сообщений: 44
Регистрация: 30-07-05
Из: Kyiv, Ukraine
Пользователь №: 7 211

|
2 arttab правильно так: while( UCSR1A & 0x06 ); и кто вам сказал что это для компилятора не очевидно??? Если вашему комилятору это не очевидно - выбросьте его  ... моему (iar4.11a) очевино и все работает: 1075: while( UCSR1A & 0x06 ); +00000725: 9100009B LDS R16,0x009B Load direct from data space +00000727: 7006 ANDI R16,0x06 Logical AND with immediate +00000728: F7E1 BRNE PC-0x03 Branch if not equal може у вас что-то не работает (виснет) по другой причине  ? например промому что вы ждете изменения одного из битов (U2X1) который никогда не изменится - он может измениться только вашей программой.
|
|
|
|
|
Sep 18 2005, 06:14
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(arttab @ Sep 17 2005, 19:41) Добавлю и я свой вопрос по иару Как корректно проверить флаг в регистре с учетом оптимизации кода? Поясню: в записи такого вида - while( UCSR1A & 0x06 ); для компилятора неочевидно, что значение UCSR1A может измениться само по себе, а не в результате действий программы. как тут быть? Я попробывал так: while ((UCSR1A & 0x06) == 0); виснет. тогда так: volatile unsigned char z = 0; while (z == 0) {z = (UCSR1A & 0x06);} код похож на правду M: LDS R16,_A_UCSR1A ANDI R16,0x06 ST Y,R16 LD R16,Y TST R16 BREQ M: тоже виснет А как правильно? Правильно, чтобы ваш UCSR1A (или другой порт) был volatile - это и скажет компилятору, что значение зависит не только от генерируемого кода. А описание портов в стандартном .h имеют этот volatile.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|