Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR-20071221 и AVR Studio 4.13 SP2 Final
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
aesok
Цитата(singlskv @ Dec 27 2007, 22:13) *
ИМХО, все-таки Y инициализирован и именно значением == SP
или я не прав и это не всегда так ?


В прологе выполняеться следующий псевдокод:

FP = SP
FP = FP - <frame_size>
SP = FP

где:
FP - Frame Pointer, размещаеться в регистре Y
SP - Stack Pointer
frame_size - размер памяти необходимой для хранения локальных переменных.

адреса [FP+1...FP+1+frame_size] - локальный фрейм функции.

Для всех функций, которые имеют фрейм, FP = SP, и регистр FP(Y) используется в качестве базового для доступа к локальным переменным. В AVR архитектуре SP не может быть базовым регистром. Если функция не имеет фрейма регистр Y(FP) в прологе не инициализируется, и свободно используется компилятором в теле функции.

Если функция naked и не имеет пролога, то FP не может быть навен SP. Если только случайно

Анатолий.
singlskv
Цитата(aesok @ Dec 27 2007, 22:38) *
Если функция naked и не имеет пролога, то FP не может быть навен SP. Если только случайно
Я имел в виду не любую функцию а только main!
ИМХО, при входе в main, Y всегда равен SP, ну а дальше, уже в прологе,
отводится место на стеке под локальные переменные.
aesok
Цитата(singlskv @ Dec 27 2007, 22:51) *
Я имел в виду не любую функцию а только main!
ИМХО, при входе в main, Y всегда равен SP, ну а дальше, уже в прологе,
отводится место на стеке под локальные переменные.


Я писал про все функции, включая main и начиная с avr-gcc 4.2 + mega256 патч. В avr-gcc 3 main работает немного по другому, но это уже история.

С чего вы взяли что Y == SP перед входом в полог main? Этого никто не гарантировал.

Анатолий.
singlskv
Цитата(aesok @ Dec 27 2007, 22:58) *
Я писал про все функции, включая main и начиная с avr-gcc 4.2 + mega256 патч. В avr-gcc 3 main работает немного по другому, но это уже история.
может и история...
тока после неудачной попытки перехода на 200701xx,
я пока сижу на 2006xxxx, для меня предсказуемость генерируемого кода важнее...
Цитата
С чего вы взяли что Y == SP перед входом в полог main? Этого никто не гарантировал.
Анатолий.

А вот отсюда и взял:
Код
__init:

#ifndef __AVR_ASM_ONLY__
    .weak    __stack

    /* By default, malloc() uses the current value of the stack pointer
       minus __malloc_margin as the highest available address.

       In some applications with external SRAM, the stack can be below
       the data section (in the internal SRAM - faster), and __heap_end
       should be set to the highest address available for malloc().  */
    .weak    __heap_end
    .set    __heap_end, 0

    .section .init2,"ax",@progbits
    clr    __zero_reg__
    out    _SFR_IO_ADDR(SREG), __zero_reg__
    ldi    r28,lo8(__stack)
#ifdef SPH
    ldi    r29,hi8(__stack)
    out    _SFR_IO_ADDR(SPH), r29
#endif
    out    _SFR_IO_ADDR(SPL), r28

Причем что у avr-libc-1.4.4 и у avr-libc-1.4.6 этот код абсолютно одинаков и кажеться давно
уже не претерпевал никаких изменений...

Разночтения могут возникнуть только если я начну переопределять код в секциях .initX
733259
В init2 Y устанавливается на вершину стека. И что это даёт - Y+1 все равно использовать нельзя.

Тьфу, блин, выше я имел в виду "unsigned char i; for (i=0;i<10;i++) arr[i]=i;" - счетчик цикла обрабатывается как int, хотя объявлен unsigned char.
Qwertty
Решил приобщиться к прогрессу, обновил ГЦЦ с 3.4.6 на 4.2.2 - существующий проект под м8 подрос с 2252 байт до 2316. sad.gif Попробовал OS_main, не заметил НИКАКОГО эффекта! Как было 2316 так и осталось. Что то лыжи не едут... WinAvr 20071221. Чем такое можно объяснить?
aesok
Цитата(Qwertty @ Jan 13 2008, 19:59) *
sad.gif Попробовал OS_main, не заметил НИКАКОГО эффекта! Как было 2316 так и осталось. Что то лыжи не едут... WinAvr 20071221. Чем такое можно объяснить?


тем что ваша функция 'main' не использует "call-saved" регистры и стек для хранения значений локальных переменных.

Анатолий.
Непомнящий Евгений
Не совсем понял - зачем ломать копья из-за main? Она ровно одна, если вы сэкономите на ней несколько байт (десятков байт) - то что это даст (кроме морального удовлетворения smile.gif )? Или речь идет о совсем младших мегах?

Кстати, еще вопрос - наверное не в тему - почему нет отдельной ветки для GCC, как это сделано для IAR? Не удобно разыскивать посты, посвященные GCC, в нескольких ветках...
733259
Цитата(Непомнящий Евгений @ Jan 14 2008, 12:11) *
Не совсем понял - зачем ломать копья из-за main? Она ровно одна, если вы сэкономите на ней несколько байт (десятков байт) - то что это даст (кроме морального удовлетворения smile.gif )?
Вы правы почти ничего кроме удовлетворения, раздражает лишний код.
Цитата
Кстати, еще вопрос - наверное не в тему - почему нет отдельной ветки для GCC, как это сделано для IAR? Не удобно разыскивать посты, посвященные GCC, в нескольких ветках...
Присоединяюсь, непонятно, ведь gcc куда более распространен. wacko.gif
aesok
Цитата(Непомнящий Евгений @ Jan 14 2008, 10:11) *
Не совсем понял - зачем ломать копья из-за main? Она ровно одна, если вы сэкономите на ней несколько байт (десятков байт) - то что это даст (кроме морального удовлетворения smile.gif )?

Применение атрибутов OS_main и OS_task позволяет сэкономить от 0 до примерно 40 байт кода и от 0 до 16 байт RAM. Точка. Никто не обещал что добавив в программу 20 буковок и она станет в 2 раза меньше.
Цитата(Непомнящий Евгений @ Jan 14 2008, 10:11) *
Или речь идет о совсем младших мегах?

Не только. Для ботлоадера очень важен размер кода.

Анатолий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.