реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> WinAVR-20071221 и AVR Studio 4.13 SP2 Final, новые релизы программ
aesok
сообщение Dec 27 2007, 19:12
Сообщение #46


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(733259 @ Dec 27 2007, 22:07) *
И что помешает мне поставить //

Ничего не помешает, только перед тем как вы догадаетесь что это нужно сделать, вы поимеете секса со своей програмой через дебагер. Хотите учиться на своих ошибках учитесь, только ПОЖАЛУЙСТА никому не советуйте использовать "naked" c функцией main.

Анатолий.

Сообщение отредактировал aesok - Dec 27 2007, 19:40
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 27 2007, 19:13
Сообщение #47


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aesok @ Dec 27 2007, 21:47) *
Здесь происходит обращение к памяти по адресам [Y+1..Y+2] (это переменная 'i'), но регистр Y не инициализирован!

ИМХО, все-таки Y инициализирован и именно значением == SP
или я не прав и это не всегда так ?
Go to the top of the page
 
+Quote Post
733259
сообщение Dec 27 2007, 19:24
Сообщение #48


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



Цитата
Ничего не помешает, только перед тем как вы догадаетесь что это нужно сделать, вы поимеете секса со своей програмой через дебагер. Хтите учиться на своих ошибках учитесь, только ПОЖАЛУЙСТА никому не советуйте использовать "naked" c функцией main.
Думаю моментально догадаюсь biggrin.gif Гораздо чаще приходится сталкиваться с наездом стека на данные при возникновении прерывания во время вызова вложеных функций.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 27 2007, 19:26
Сообщение #49


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(733259 @ Dec 27 2007, 22:07) *
Я говорю о реальной практике, а не теоретических примерах.
Так что и дальше буду использовать naked.
В принципе, если у Вас есть разрешение на ношение огнестрельного оружия,
Вы можете поиграть и в "русскую рулетку" и никто Вам не помешает...
Тока имейте в виду что это можно делать только до 11 вечера или после 6 утра
чтобы не мешать соседям...
Go to the top of the page
 
+Quote Post
733259
сообщение Dec 27 2007, 19:33
Сообщение #50


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



А по теме - кто нибудь использует avr-gcc четвёрку? А то я как посмотрел во что 20071221 превратил строчку "for (i=0;i<10;i++) a+=arr[i];" (правда и так достаточно безобразную), то прямо ужаснулся. Но может я чо не понимаю?
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 27 2007, 19:38
Сообщение #51


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(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. Если только случайно

Анатолий.

Сообщение отредактировал aesok - Dec 27 2007, 19:45
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 27 2007, 19:51
Сообщение #52


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aesok @ Dec 27 2007, 22:38) *
Если функция naked и не имеет пролога, то FP не может быть навен SP. Если только случайно
Я имел в виду не любую функцию а только main!
ИМХО, при входе в main, Y всегда равен SP, ну а дальше, уже в прологе,
отводится место на стеке под локальные переменные.
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 27 2007, 19:58
Сообщение #53


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



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


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

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

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 27 2007, 20:18
Сообщение #54


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(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
Go to the top of the page
 
+Quote Post
733259
сообщение Dec 28 2007, 01:34
Сообщение #55


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



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

Тьфу, блин, выше я имел в виду "unsigned char i; for (i=0;i<10;i++) arr[i]=i;" - счетчик цикла обрабатывается как int, хотя объявлен unsigned char.

Сообщение отредактировал 733259 - Dec 28 2007, 01:57
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 13 2008, 16:59
Сообщение #56


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Решил приобщиться к прогрессу, обновил ГЦЦ с 3.4.6 на 4.2.2 - существующий проект под м8 подрос с 2252 байт до 2316. sad.gif Попробовал OS_main, не заметил НИКАКОГО эффекта! Как было 2316 так и осталось. Что то лыжи не едут... WinAvr 20071221. Чем такое можно объяснить?
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 13 2008, 22:52
Сообщение #57


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Qwertty @ Jan 13 2008, 19:59) *
sad.gif Попробовал OS_main, не заметил НИКАКОГО эффекта! Как было 2316 так и осталось. Что то лыжи не едут... WinAvr 20071221. Чем такое можно объяснить?


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

Анатолий.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 14 2008, 07:11
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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

Кстати, еще вопрос - наверное не в тему - почему нет отдельной ветки для GCC, как это сделано для IAR? Не удобно разыскивать посты, посвященные GCC, в нескольких ветках...
Go to the top of the page
 
+Quote Post
733259
сообщение Jan 14 2008, 09:25
Сообщение #59


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



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

Сообщение отредактировал 733259 - Jan 14 2008, 09:27
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 14 2008, 09:43
Сообщение #60


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Непомнящий Евгений @ Jan 14 2008, 10:11) *
Не совсем понял - зачем ломать копья из-за main? Она ровно одна, если вы сэкономите на ней несколько байт (десятков байт) - то что это даст (кроме морального удовлетворения smile.gif )?

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

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

Анатолий.
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016