|
|
  |
WinAVR-20071221 и AVR Studio 4.13 SP2 Final, новые релизы программ |
|
|
|
Dec 27 2007, 19:12
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(733259 @ Dec 27 2007, 22:07)  И что помешает мне поставить // Ничего не помешает, только перед тем как вы догадаетесь что это нужно сделать, вы поимеете секса со своей програмой через дебагер. Хотите учиться на своих ошибках учитесь, только ПОЖАЛУЙСТА никому не советуйте использовать "naked" c функцией main. Анатолий.
Сообщение отредактировал aesok - Dec 27 2007, 19:40
|
|
|
|
|
Dec 27 2007, 19:24
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата Ничего не помешает, только перед тем как вы догадаетесь что это нужно сделать, вы поимеете секса со своей програмой через дебагер. Хтите учиться на своих ошибках учитесь, только ПОЖАЛУЙСТА никому не советуйте использовать "naked" c функцией main. Думаю моментально догадаюсь  Гораздо чаще приходится сталкиваться с наездом стека на данные при возникновении прерывания во время вызова вложеных функций.
|
|
|
|
|
Dec 27 2007, 19:26
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(733259 @ Dec 27 2007, 22:07)  Я говорю о реальной практике, а не теоретических примерах. Так что и дальше буду использовать naked. В принципе, если у Вас есть разрешение на ношение огнестрельного оружия, Вы можете поиграть и в "русскую рулетку" и никто Вам не помешает... Тока имейте в виду что это можно делать только до 11 вечера или после 6 утра чтобы не мешать соседям...
|
|
|
|
|
Dec 27 2007, 19:38
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 27 2007, 19:51
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Dec 27 2007, 22:38)  Если функция naked и не имеет пролога, то FP не может быть навен SP. Если только случайно Я имел в виду не любую функцию а только main! ИМХО, при входе в main, Y всегда равен SP, ну а дальше, уже в прологе, отводится место на стеке под локальные переменные.
|
|
|
|
|
Dec 27 2007, 19:58
|
Знающий
   
Группа: Участник
Сообщений: 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? Этого никто не гарантировал. Анатолий.
|
|
|
|
|
Dec 27 2007, 20:18
|
дятел
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 14 2008, 09:25
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата(Непомнящий Евгений @ Jan 14 2008, 12:11)  Не совсем понял - зачем ломать копья из-за main? Она ровно одна, если вы сэкономите на ней несколько байт (десятков байт) - то что это даст (кроме морального удовлетворения  )? Вы правы почти ничего кроме удовлетворения, раздражает лишний код. Цитата Кстати, еще вопрос - наверное не в тему - почему нет отдельной ветки для GCC, как это сделано для IAR? Не удобно разыскивать посты, посвященные GCC, в нескольких ветках... Присоединяюсь, непонятно, ведь gcc куда более распространен.
Сообщение отредактировал 733259 - Jan 14 2008, 09:27
|
|
|
|
|
Jan 14 2008, 09:43
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

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