|
|
  |
WinAVR-20080610, делимся впечатлениями |
|
|
|
Aug 18 2008, 13:44
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324

|
Доброе время суток, уважаемые. Возникла проблема при переходе с WinAVR-20070525 на WinAVR-20080512. При компиляции появляется предупреждение, что атрибут PROGMEM проигнорирован. Цитата ../menu.h:17: warning: ignoring attributes applied to 'struct <anonymous>' after definition на код Код typedef struct { //const char* ptr_item;// pointer to item name const char item_name[20];// string ptr_function select_function; // function pointer at enter/escape uint8_t ent_f; // ID menu item to enter uint8_t esc_f; // ID menu item to escape }Menu PROGMEM; Из-за этого память данных раздувается с 50 байт то 850. В чем может быть проблема? Заранее спасибо
|
|
|
|
|
Aug 18 2008, 14:27
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Попробуйте так Код typedef struct { //const char* ptr_item;// pointer to item name const char item_name[20];// string ptr_function select_function; // function pointer at enter/escape uint8_t ent_f; // ID menu item to enter uint8_t esc_f; // ID menu item to escape }Menu;
Menu Menu_Item PROGMEM;
|
|
|
|
|
Sep 11 2008, 19:04
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 31-10-05
Пользователь №: 10 350

|
Вот нарвался на странность Прописываю свой тип данных - структуру. Об'являюуказатели на этот тип. Код typedef struct { uint8_t status; //Status uint8_t R_index; //Read index uint8_t W_index; //Write index uint8_t buffer[MAXBUFFER]; }RINGBUFFER;
volatile RINGBUFFER *Rx,*Tx; Компилирую (без оптимизации)- все ОК, НО!!!!!!!! В Студии вижу полную "лажу" Мало того, что компилятор разместил экземпляры типа структуры в регистрах Так еще и они (эти два экземпляра) - одно и тоже - т.е при записи в Rx->buffer пишется также и в Tx->buffer - извечный вопрос. ЧТО ДЕЛАТЬ? :о) PS Может тупо "дать по рукам" компилятору и поставить Код volatile RINGBUFFER *Rx,*Tx __attribute__ ((section (".data"))); ?
Сообщение отредактировал Tracer - Sep 11 2008, 19:22
|
|
|
|
|
Sep 11 2008, 19:35
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Tracer @ Sep 11 2008, 23:04)  Вот нарвался на странность Приведите больше кода, как вы работаете с указателемя, как выделяете память под структуры. Анатолий.
|
|
|
|
|
Sep 11 2008, 19:58
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 31-10-05
Пользователь №: 10 350

|
Цитата(aesok @ Sep 11 2008, 22:35)  Приведите больше кода, как вы работаете с указателемя, как выделяете память под структуры.
Анатолий. Спасибо, ЭТО Я ТУПЛЮ. Действительно объявил указатели и БОЛЬШЕ НИЧЕГО. Пошел учить матчасть :о) Все поправил Объявляю теперь так Код volatile RINGBUFFER Rx,Tx; Все встало на места и находится там где надо Еще один вопрос Есть функция Код void rb_flush(RINGBUFFER *rb) { cli(); rb->R_index=0; rb->W_index=0; rb->status=EMPTYBUFFER; sei(); } Вызываю ее так Код void main(void) { ... rb_flush(&Rx); ... } Компилятор ругается - но не сильно А всетаки, что ему не нравится? Код ../rb.c:63: warning: passing argument 1 of 'rb_flush' discards qualifiers from pointer target type ../rb.c:64: warning: passing argument 1 of 'rb_flush' discards qualifiers from pointer target type
|
|
|
|
|
Sep 11 2008, 20:50
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Tracer @ Sep 11 2008, 22:58)  Компилятор ругается - но не сильно А всетаки, что ему не нравится? void rb_flush( volatile RINGBUFFER *rb) Но вы хорошенько подумайте, нужен ли вам volatile для всего буфера? Возможно, достаточно объявить с volatile только индексы и статус?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 11 2008, 21:12
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 31-10-05
Пользователь №: 10 350

|
Цитата(Сергей Борщ @ Sep 11 2008, 23:50)  void rb_flush(volatile RINGBUFFER *rb) Но вы хорошенько подумайте, нужен ли вам volatile для всего буфера? Возможно, достаточно объявить с volatile только индексы и статус? 1. БОЛЬШОЕ спасибо. 2. Подумаю, Но без volatile в дизасемблере просто "окровения от GCC". Я такой код хрен бы писал какой он генерит. Но может я еще не достиг нужных высот для понимания Великой идеи :0)
Сообщение отредактировал Tracer - Sep 11 2008, 21:13
|
|
|
|
|
Sep 12 2008, 19:01
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 31-10-05
Пользователь №: 10 350

|
Цитата(Непомнящий Евгений @ Sep 12 2008, 07:13)  Вы хотите сказать, что корректный С-код компилируется в неверную программу? Можете привести полный пример? Проверил В этой версии все ОК. В версии WinAVR 20071221 переменная ms_delay хранилась в регистре при прервании пушалась - изменялась-попалась - т.е ничего не менялось. Вот в этом примере. Код #include <stdint.h> #include <avr/interrupt.h>
uint16_t ms_delay=0;
ISR(TIMER0_OVF_vect) { if(ms_delay)ms_delay--;
}
void my_delay(uint16_t msd) { ms_delay=msd; while(ms_delay){} }
void main(void) { cli(); TCCR0=0x03; TCNT0=0x83; TIMSK=0x01; sei(); DDRB =0xff; while(1) { PORTB=0xff; my_delay(1000); PORTB=0x00; my_delay(1000); } При объявлении ее volatile все заработало. Я с тех пор глобальные переменные - объявляю типа volatile.
Сообщение отредактировал Tracer - Sep 12 2008, 19:04
|
|
|
|
|
Sep 12 2008, 19:08
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Tracer @ Sep 12 2008, 23:01)  Я с тех пор глобальные переменные - объявляю типа volatile. avr-libc-user-manual FAQ#1 Анатолий.
|
|
|
|
|
Sep 12 2008, 19:27
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 31-10-05
Пользователь №: 10 350

|
Цитата(aesok @ Sep 12 2008, 22:08)  avr-libc-user-manual FAQ#1
Анатолий. Да да именно мой случай. Ну кто же читет Факи в доках, пока не поморочит себе изрядно голову :о)) Теперь то я уже ЭТО знаю.
|
|
|
|
|
Sep 25 2008, 10:44
|

Участник

Группа: Участник
Сообщений: 16
Регистрация: 27-04-05
Из: Воронеж
Пользователь №: 4 541

|
Добрый день! У меня WinAVR 20080512 + AVR Studio 4.14 выдаёт предупреждение Код ../main.c:890: warning: passing argument 2 of 'eeprom_write_block' makes pointer from integer without a cast на последнюю строку в этом примере: Код #define EEPROM_SENSOR2_ADR 0x078 // адрес хранения номера датчика unsigned char current_sensor_code[8]; //текущий код датчика
...
eeprom_busy_wait(); eeprom_write_block (current_sensor_code, EEPROM_SENSOR2_ADR, 8); (функции - из eeprom.h того же WinAVR'a) т.е. ему не нравится то, что указатель на адрес записан в явном виде (конктетный адрес в EEPROM), хотя всё работает. как мне можно записать указатель на адрес ЕЕПРОМ чтобы компилятор не выдавал предупреждение? Можно ли при этом не расходовать RAM для хранения указателя? Или может существует какой-нибудь ключ для отмены выдачи предупреждения такой записи указателя?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|