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

|
Цитата(733259 @ Dec 24 2007, 21:49)  А чем OS_main отличается от __attribute__((naked))? Всегда применяю для main и никаких warning-ов и лишнего кода. Дело в том что атрибут 'naked' выкидывает не только лишний но и нужный код. Анатолий.
|
|
|
|
|
Dec 25 2007, 04:29
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата(aesok @ Dec 25 2007, 02:39)  Дело в том что атрибут 'naked' выкидывает не только лишний но и нужный код. Выкидывает, но только не в main - там пролог и эпилог не нужны.
|
|
|
|
|
Dec 25 2007, 05:36
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(733259 @ Dec 25 2007, 07:29)  Выкидывает, но только не в main - там пролог и эпилог не нужны. Я вот тоже попробовал naked, и прошло нормально. Но в мэйне не должно быть локальных переменных.
|
|
|
|
|
Dec 25 2007, 05:48
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата Я вот тоже попробовал naked, и прошло нормально. Но в мэйне не должно быть локальных переменных. А можно подробнее? У меня постоянно в main локальные переменные, обычно static правда, хотя точно не уверен т.к. int main() __attribute__((naked)); int main(){ у меня вооще везде, стереотип выработался.
|
|
|
|
|
Dec 25 2007, 05:58
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(733259 @ Dec 25 2007, 08:48)  А можно подробнее? У меня постоянно в main локальные переменные, обычно static правда, хотя точно не уверен т.к.
int main() __attribute__((naked)); int main(){
у меня вооще везде, стереотип выработался. static - не локальная!! Это глобальная переменная с ограниченной областью видимости.
|
|
|
|
|
Dec 25 2007, 06:13
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата(Qwertty @ Dec 25 2007, 10:58)  static - не локальная!! Это глобальная переменная с ограниченной областью видимости. Это я знаю, какие траблы с локальными переменными main? Я не заметил никаких, вот и спрашиваю.
|
|
|
|
|
Dec 25 2007, 06:18
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(733259 @ Dec 25 2007, 09:13)  Это я знаю, какие траблы с локальными переменными main? Я не заметил никаких, вот и спрашиваю. Так они в прологе создаются и инициализируются. А naked пролог выкидывает
|
|
|
|
|
Dec 25 2007, 07:09
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Согласен, только чем отличается переменная static от локальной в main, ведь эта, локальная, всё равно всегда существует вместе с main.
ЗЫ: скачал, под wine работает безупречно. Не заметил разницы между naked и OS_main на примере, специально объявил uint16_t array[64] в main. Бинарник совпадает до байта. К сожалению реальный код, как и в предыдущих версиях, больше чем у 3.3.6, 3660 байт против 3274 в одном из моих проектов. Жаль.
|
|
|
|
|
Dec 25 2007, 09:39
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(733259 @ Dec 25 2007, 10:09)  Согласен, только чем отличается переменная static от локальной в main, ведь эта, локальная, всё равно всегда существует вместе с main. Различие в том, где она создается. Локальная - в прологе мэйна. Static - в секции bss, если не ошибаюсь. Цитата(733259 @ Dec 25 2007, 10:09)  ЗЫ: скачал, под wine работает безупречно. Не заметил разницы между naked и OS_main на примере, специально объявил uint16_t array[64] в main. Бинарник совпадает до байта. К сожалению реальный код, как и в предыдущих версиях, больше чем у 3.3.6, 3660 байт против 3274 в одном из моих проектов. Жаль. А массивы вроде локальными не бывают, они всегда static, даже если объявлены локальными. Это сразу видно по использованию ОЗУ, массив сразу увеличивает использованное ОЗУ, а простые локальные переменные не увеличивают.
|
|
|
|
|
Dec 25 2007, 10:04
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(733259 @ Dec 25 2007, 10:09)  ЗЫ: скачал, под wine работает безупречно. Не заметил разницы между naked и OS_main на примере, специально объявил uint16_t array[64] в main. Бинарник совпадает до байта. К сожалению реальный код, как и в предыдущих версиях, больше чем у 3.3.6, 3660 байт против 3274 в одном из моих проектов. Жаль. НУ СКОЛЬКО РАЗ ВАМ МОЖНО ПОВТОРЯТЬ. Что место в для локадьных переменных в стеке выделяеться в прологе функции. Применениие атрибута 'naked' выкидывает код пролога и эпилога из функции! Это значит что место для локальных переменных не будет выделено!!!! Анатолий.
|
|
|
|
|
Dec 25 2007, 10:18
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата Различие в том, где она создается. Локальная - в прологе мэйна. Static - в секции bss, если не ошибаюсь. Знаю, я имел в виду их использование в програме (в main) одинаковое, если есть существенные различия, укажите. Цитата А массивы вроде локальными не бывают, они всегда static, даже если объявлены локальными. Но указатель стека в прологе main устанавливается в зависимости от. Правда это в 3.3.6, в 4.2.2 еще не проверил. Цитата НУ СКОЛЬКО РАЗ ВАМ МОЖНО ПОВТОРЯТЬ. Что место в для локадьных переменных в стеке выделяеться в прологе функции. Да ясно всё. Я полагаю, что без пролога в main можно прекрасно обойтись, я всегда обходился, во всяком случае. Локальные переменные в main, не static, какой-то очень частный случай, ИМХО.
Сообщение отредактировал 733259 - Dec 25 2007, 10:20
|
|
|
|
|
Dec 25 2007, 10:25
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(733259 @ Dec 25 2007, 13:18)  Да ясно всё. Я полагаю, что без пролога в main можно прекрасно обойтись, я всегда обходился, во всяком случае. Локальные переменные в main, не static, какой-то очень частный случай, ИМХО. Компилятор может создать код, которому требуеться место в стеке, даже тогда, когда вы не создавали локальных переменных. Я постараюсь вечером найти пример. Анатолий.
Сообщение отредактировал aesok - Dec 25 2007, 10:26
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|