Цитата(swisst @ Dec 31 2008, 13:07)

Доброго дня !
Есть 3 вопроса, на которые я самостоятельно не смог найти ответ - решил обратится за помощью:
1. Ругается варнингом:
Код
In function 'Load_Default_Parametrs' passing argument 1 of 'eeprom_write_block' discards qualifiers from pointer target type
на эту строку :
Код
eeprom_write_block((void*)&Parametrs_Ram, (void*) 0x01, sizeof(Parametrs_Ram));
Боротся с варнингами или пустить на самотек ? Если бороться, то что я делаю не так ?
Хотелось бы так же видеть прототип функции. Какой тип первого передаваемого аргумента. А вообще char и volatile char это не одно и тоже для компилятора.
Я по возможности стараюсь все ворнинги убивать, как потенциальные места глюков.
Цитата(swisst @ Dec 31 2008, 13:07)

2. Вопрос по inline-функции. Как правильно объявить, определить, вызвать ?
Делаю так:
Прототип: void func ();
Определение: inline void func (){...код...}
Вызов: void func ();
Ругается так:
warning: C99 inline functions are not supported; using GNU89 to disable this warning use -fgnu89-inline or the gnu_inline function attribute
Добавление в опциях проекта -fgnu89-inline варнинг не отключило.
Типичные грабли на которые сам наступал пару раз. Модификатор inline должен быть в объявлении функции, а не в описании.
Код
inline void f(void);
int main()
{
f();
return 0;
}
void f(void)
{
while(1){;}
}
Также хочу предупредить, что inline это всего лишь рекомендация компилятору, сделать функцию встраиваемой. На поверку функции объявленные таким образом(именно в сишнике) зачастую оказываются не встроенными.
Чтобы такого избегать реализую встроенные функции в хидере, либо если архитектура ПО не позволяет, то добавляю спецатрибуты компилятор, которые гарантируют встроенность функции.
Цитата(swisst @ Dec 31 2008, 13:07)

3. То, что меня убило наповал... Есть проект, есть 2 машины на которых установлены одинаковые версии AVR Studio и WinAVR20071221. На десктопе все ок. В процессе разработки проекта ничего сверхъестественного не было. Копирую проект на ноут, компилирую - размер кода +700 байт, +256 байт озу. Вот эта магическая строчка из map-файла:
Код
.data 0x00800060 0x100 c:/winavr-20071221/bin/../lib/gcc/avr/4.2.2/avr5\libgcc.a(_clz.o)
0x00800060 __clz_tab
с __clz_tab дело уже имел (тему старую не смого найти, к сожалению) - тогда подключал математическую библиотеку libm.a и как рукой снимало. На этот раз - на ноуте не помогает. Настройки проекта естественно не меняю...библиотеки подключаю те же, что и на десктопе...
Также осознаю, что звучит это как-то глупо, но я в ступоре...
Устанавливал последнюю версию WinAVR20081205 - проблем с __clz_tab нет. Объём кода при компиляции отличается на 6 байт (на ноуте больше)...
Что-то не так в этом королевстве. Одинаковый код собранный одинаковыми компиляторами должен давать одинаковый результат.
Могу сказать одно, что например наш проект собираемый на разных писишках, и под винду и под линуха даёт строго один и тот же показатель и по памяти данный и по памяти кода и по поведению на железе. Сначала были разночтения, но как оказалось на практике дело было в самосборном компиляторе на линухе, после установки патчей от винавра, всё стало полностью идентичным.