Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "Оптимизация" в WinAVR и как с этим бороться
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2
MaxiMuz
Цитата(sigmaN @ Nov 28 2011, 22:40) *
перед main воткните __attribute__ ((noreturn));
http://www.emerson.emory.edu/services/gcc/...Attributes.html
экономит "пару" байт

Никакого действия этот предписание на программу не оказало, и я не понял из описания на что оно конкретно делает.
ARV
Цитата(ILYAUL @ Nov 29 2011, 08:15) *
ИМХО . Для 13 писать на С , можно только в рамках изучения С , там и asm сложно "развернуться", если задействовать все ее ресурсы.
не согласен. во-первых, все ресурсы МК вообще сложно задействовать одновременно (в одном проекте то есть), даже если МК "просторнее" тини13. а во-вторых, я лично последние годы пишу только на Си, причем для тини13 сделал несколько разных проектов, часто даже не напрягаясь с оптимизацией. последний проект - RGB-светильник с дистанционным управлением (пульт ДУ тоже на тини13) sm.gif на Си пишется достаточно комфортно.
MaxiMuz
При использовании int OS_main (void) компилятор выдает: warning: no return statement in function returning non-void и до hex-файла дело не доходит. Ткните пальцем где можно об этом подробнее прочитать.
sigmaN
warning это не error и по идее не должен приводить к трудностям с hex файлом.
no return statement in function returning non-void подсказывает вам, что функцию вы объявили как возвращающую значение(т.е. не void) а return в теле функции не встречается.
Самое простое: добавить в функцию return 0;
MaxiMuz
Цитата(sigmaN @ Jan 24 2012, 05:07) *
warning это не error и по идее не должен приводить к трудностям с hex файлом.
no return statement in function returning non-void подсказывает вам, что функцию вы объявили как возвращающую значение(т.е. не void) а return в теле функции не встречается.
Самое простое: добавить в функцию return 0;

добавил в конец функции int OS_main (void) оператор return 0;
предупреждение пропало, но ошибка линковщика , которую я в начале не заметил осталась :
Код
inking: copy_reg_struct.elf
avr-gcc -mmcu=attiny13a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=copy_reg_struct.o  -std=gnu99 -MMD -MP -MF .dep/copy_reg_struct.elf.d copy_reg_struct.o --output copy_reg_struct.elf -Wl,-Map=copy_reg_struct.map,--cref,-gc-sections     -lm
c:/program files/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr25/crttn13a.o:(.init9+0x0): undefined reference to `main'
make.exe: *** [copy_reg_struct.elf] Error 1
_Pasha
Таварисч не панимаит.
Код
int main(void) __attribute__((OS_main))
{
// blabla
  return 0;
}
MaxiMuz
Цитата(_Pasha @ Feb 2 2012, 15:16) *
Таварисч не панимаит.
Код
int main(void) __attribute__((OS_main))
{
// blabla
  return 0;
}

Да! я не поимаю! в этом случае компил. кажет:
Код
copy_reg_struct.c:112: error: expected ',' or ';' before '{' token
Сергей Борщ
QUOTE (MaxiMuz @ Feb 3 2012, 12:42) *
Да! я не поимаю!
_Pasha описАлся.
CODE
__attribute__((OS_main))
int main(void)
{
// blabla
  return 0;
}


или
CODE
int main(void)  __attribute__((OS_main));

int main(void)
{
// blabla
  return 0;
}
И не спрашивайте "почему?". Так есть.
MaxiMuz
Доброго времяни суток!
Не стал создавать отдельной темы. Хочу прояснить для себя такой момент, фрагмент:
Код
#define  Mask (0x07)
int main (void)
{
uint8_t Cnt=0;
while (1)
    {
    if (Cnt &((unsigned char) Mask))
        {Buf1=1;
        }
        else
        { Buf1=2;
        }
        Cnt++;
    }
}
Где условие компилируется в:
Код
    if (Cnt &((unsigned char) Mask))
  56:    82 2f           mov    r24, r18
  58:    90 e0           ldi    r25, 0x00; 0
  5a:    87 70           andi    r24, 0x07; 7
  5c:    90 70           andi    r25, 0x00; 0
  5e:    89 2b           or    r24, r25
  60:    19 f0           breq    .+6     ; 0x68 <main+0x1c>

здесь игнорирование (unsigned char) перед Mask это особенности GCC компилятора ?
Т.к. AVR 8ми битный, можно ли отключить както 16битное расширение ?
Genadi Zawidowski
Используйте компилятор поновее (avr-gcc 4.7.2, avr-gcc 4.8) - будет Вам счастье (на моих проектах объём кода на 30% уменьшился):

Код
0000007c <main>:
  7c:    80 e0           ldi    r24, 0x00; 0
  7e:    92 e0           ldi    r25, 0x02; 2
  80:    21 e0           ldi    r18, 0x01; 1
  82:    37 e0           ldi    r19, 0x07; 7
  84:    38 23           and    r19, r24
  86:    19 f0           breq    .+6; 0x8e <main+0x12>
  88:    20 93 60 00     sts    0x0060, r18
  8c:    02 c0           rjmp    .+4; 0x92 <main+0x16>
  8e:    90 93 60 00     sts    0x0060, r25
  92:    8f 5f           subi    r24, 0xFF; 255
  94:    f6 cf           rjmp    .-20; 0x82 <main+0x6>


Берётся тут и подключается в AvrStudio 4.19 без проблем.
Палыч
Цитата(MaxiMuz @ Oct 16 2012, 22:35) *
здесь игнорирование (unsigned char) перед Mask это особенности GCC компилятора ?

Это - не "игнорирование", а "integer promotion" прописанное в стандарте ISO/IEC 9899:1999
MaxiMuz
Цитата(Палыч @ Oct 17 2012, 09:15) *
Это - не "игнорирование", а "integer promotion" прописанное в стандарте ISO/IEC 9899:1999

т.е. этому стандарту не важно что в выражении стоит операция приведение типов ?
Сергей Борщ
В этом стандарте операция "&" выполняется над операндами не ниже (unsigned) int. Все, что меньшего размера приводится к этим типам. После вашего явного приведения к unsigned char. Затем оптимизатор может выкинуть не влияющие на результат операции, такие как сравнение заведомо нулевых старших байтов. Ваш компилятор действует строго по стандарту, но его оптимизатор недостаточно проработан - обновите компилятор.
Палыч
Цитата(MaxiMuz @ Oct 17 2012, 16:11) *
стандарту не важно что в выражении стоит операция приведение типов ?
Почему одна операция (в данном случае - приведение типов) должна быть "важнее" других операций (например, & или + или др.) ? Транслятор генерирует код в соответствии с написаной Вами программой на языке С и положениями стандарта. В п.5.1.2.3 "Program execution" стандарта в абзаце 10 приведен пример, иллюстрирующий Ваш случай:
Цитата
EXAMPLE 2 In executing the fragment
char c1, c2;
/* ... */
c1 = c1 + c2;
the ‘‘integer promotions’’ require that the abstract machine promote the value of each variable to int size
and then add the two ints and truncate the sum.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.