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

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


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 13-05-05
Пользователь №: 4 977



WinAVR-20071221 hxxp://sourceforge.net/project/showfiles.php?group_id=68108
Что нового:
  • Added support for these devices: AT90PWM216, AT90PWM316, ATtiny43U, ATtiny48, ATtiny88, AT90PWM2B, AT90PWM3B, ATmega48P, ATmega88P, ATmega168P, ATmega328P, ATmega1284P, ATmega32HVB
  • Binutils 2.18 - New version.
  • GCC 4.2.2 - New version.
  • avr-libc 1.6.0 - New version.
  • avrdude 5.5 - New version.
  • GDB / Insight 6.6 - New version.
  • AVaRICE 2.7 - New version.
  • SRecord 1.37 - New version.


AVR Studio 4.13 SP2(b571) hxxp://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.13SP2.exe
  • ATmega32HVB, ATmega1284P, ATtiny48, ATtiny43U.
  • Full support for the new STK600 starter kit, including programming front-end and command line tools.
  • New devices in Simulator V2: ATmega164P, ATmega324P, ATmega644P, ATmega1284P, ATmega48P, ATmega88P, ATmega168P, ATmega328P, ATmega32HVB, ATtiny48 and ATtiny43U.
  • ELF production file format support.
  • Several enhancements in the IO view.
  • and many more...
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 21 2007, 21:07
Сообщение #2


Знающий
****

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



В версию avr-gcc из WinAVR-20071221 добавлены два новых атрибута:

Функция с атрибутом 'OS_task' не сохраняет "call-saved" регистры (r2-r15, r28-r29 ), что уменьшает код функции и сокращает использование стека. Эта функция должна вызываться только из aссемблерного кода. Используйте этот атрибут для 'task' функций в RTOS.

Функция с атрибутом 'OS_main' имеет более оптимизированный пролог чем Функция с атрибутом 'OS_task', но накладывает дополнительное ограничение что прерывания должны быть запрещены при вызове этой функции. Используйте этот атрибут для функции 'main'. Но если прерывания разрешены до вызова функции 'main', то используйте с ней атрибут 'OS_task'.

Анатолий.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 22 2007, 00:55
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Судя по дате, продукт недавний. Как у него на счет стабильности?

Цитата(aesok @ Dec 22 2007, 05:07) *
Функция с атрибутом 'OS_task' не сохраняет "call-saved" регистры (r2-r15, r28-r29 ), что уменьшает код функции и сокращает использование стека. Эта функция должна вызываться только из aссемблерного кода. Используйте этот атрибут для 'task' функций в RTOS.

Т.е. если я использую, например scmRTOS, то все функции-процессы можно объявлять с атрибутом OS_task?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
sla000
сообщение Dec 22 2007, 03:29
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670



Кроме того добавлена поддержка языка Ада.
Кто шарит, отпишитесь плз работает - нет. А то в комплекте примеров на Аде не поставляется.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 22 2007, 08:27
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(aesok @ Dec 21 2007, 23:07) *
Функция с атрибутом 'OS_task' не сохраняет "call-saved" регистры (r2-r15, r28-r29 ),
Как этот атрибут соотносится с __noreturn__ ? В смысле в чём отличие?
Я в avr-gcc порте scmRTOS для OS_PROCESS и для OS::Run() просто дал атрибут __noretrun__ и вроде бы всё нормально. Регистры не сохраняются, стек даром не расходуется.
Заодно проверка компилятором - сообщение об ощибке, если вдруг нечаянно устроил возврат из главной функции процесса, по кр. мере в scmRTOS это делать нельзя и дополнительная помощь со стороны компилятора не помешает.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 22 2007, 10:32
Сообщение #6


Знающий
****

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



Цитата(haker_fox @ Dec 22 2007, 03:55) *
Судя по дате, продукт недавний. Как у него на счет стабильности?
Т.е. если я использую, например scmRTOS, то все функции-процессы можно объявлять с атрибутом OS_task?


Скорее всего да, но я не работал с scmRTOS, а глянув на исходники не нашeл там порта на GCC. общее правило такое, если код вызывающий функцию-процесс не расчитывает на то что регистры r2-r15, r28-r29 сохранят свое значение после возврата из этой функции, то эту функция можно объявлять с атрибутом 'OS_task'.

Сообщение отредактировал aesok - Dec 22 2007, 10:32
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 22 2007, 12:00
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(aesok @ Dec 22 2007, 12:32) *
Скорее всего да, но я не работал с scmRTOS, а глянув на исходники не нашeл там порта на GCC.

Он там пока в репозитории в branches/avreal лежит. Нужно ещё очень внимательно проверить. Но пользоваться уже можно.
Да её и раньше портировали "частным порядком", там немного работы.

Цитата
общее правило такое, если код вызывающий функцию-процесс не расчитывает на то что регистры r2-r15, r28-r29 сохранят свое значение после возврата из этой функции, то эту функция можно объявлять с атрибутом 'OS_task'.
И всё же как по моему вопросу - соотношению атрибутов OS_task и noreturn ?

Правильно ли я понимаю, что OS_task это старый добрый noreturn минус подавление генерации команды ret и проверка компилятором построения функции как действительно никогад не возвращающей управления?

Похоже, что для процессов scmRTOS правильнее применять noreturn, а OS_task оставить для тех ОС, в которых процесс может прекратить существование путём возврата из основной функции процесса.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 22 2007, 12:25
Сообщение #8


Знающий
****

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



Цитата(ReAl @ Dec 22 2007, 15:00) *
И всё же как по моему вопросу - соотношению атрибутов OS_task и noreturn ?

Правильно ли я понимаю, что OS_task это старый добрый noreturn минус подавление генерации команды ret и проверка компилятором построения функции как действительно никогад не возвращающей управления?


Я перичитал описание атрибута 'noreturn' - основное его предназначение позволить компилятору оптимизировать вызывающию функцию, и не генерировать в ней код после вызова функции с атрибутом 'noreturn'. Как компилятор должен/может оптимизировать саму функцию к которой применен атрибут 'noreturn' надо посмотреть.

Атрибут "OS_task" (OS_main) заставляет компилятор генерировать специальные версии пролога и эпилога для указанной функции. Эта функция перестает соответствовать соглашениям о вызове функций в С, и не должна вызываться из С кода.

Цитата
Похоже, что для процессов scmRTOS правильнее применять noreturn, а OS_task оставить для тех ОС, в которых процесс может прекратить существование путём возврата из основной функции процесса.


'noreturn' ничего не даст кроме предупреждения компилятора, если функция функция всетаки возвращает управление. Компилятор не сможет оптимизировать вызывающий код, он же написан в ассемблере. Для функции с OS_task генерируються более эффективные пролог и эпилог, если функция не не возвращается, то эпилог не генерируеться.

Анатолий.

PS: Для тех кто не знаком с терминами пролог и эпилог:

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

эпилог - код выполняемый после тала функции, востанавливает 'call-saved' реистры, освобождает место в стеке выделеное в прологе и выполняет команду 'RET'.


Анатолий.

Сообщение отредактировал aesok - Dec 22 2007, 13:09
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 22 2007, 20:05
Сообщение #9


Знающий
****

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



Цитата(aesok @ Dec 22 2007, 15:25) *
Цитата

И всё же как по моему вопросу - соотношению атрибутов OS_task и noreturn ?

Правильно ли я понимаю, что OS_task это старый добрый noreturn минус подавление генерации > команды ret и проверка компилятором построения функции как действительно никогад не возвращающей управления?


Я перичитал описание атрибута 'noreturn' - основное его предназначение позволить компилятору оптимизировать вызывающию функцию, и не генерировать в ней код после вызова функции с атрибутом 'noreturn'. Как компилятор должен/может оптимизировать саму функцию к которой применен атрибут 'noreturn' надо посмотреть.



Разница между "noreturn' и 'OS_task' есть: первый предотвращает сохранение регстров r2-r15, второй дополнительно r28-r29. Ну и само сабой 'OS_task' работает для всех функций, вне зависимости от того возвращают они управление или нет.

Анатолий.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2007, 22:57
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Есть еще вопрос по "noreturn" с main() в режиме С++. Как известно, main() в С++ должна быть объявлена как возвращающая int. Если к ней добавить "noreturn", то появляется warning:
main.cpp:68: warning: function declared 'noreturn' has a 'return' statement
хотя никаких return statement в функции нет, из for(;;) {} выхода тоже не сущствует, и никаких ret в листинге нет. Это бага?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 23 2007, 07:13
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(aesok @ Dec 22 2007, 14:25) *
'noreturn' ничего не даст кроме предупреждения компилятора, если функция функция всетаки возвращает управление.
Ну и на том спасибо :-), я стараюсь, чтобы предупреждений не было вообще и при таком подходе даже просто выдать предупреждение - уже помощь компилятора.

Цитата(aesok @ Dec 22 2007, 22:05) *
Разница между "noreturn' и 'OS_task' есть: первый предотвращает сохранение регстров r2-r15, второй дополнительно r28-r29. Ну и само сабой 'OS_task' работает для всех функций, вне зависимости от того возвращают они управление или нет.
Я немного поэкспериментировал, для avr-gcc 4.2.2 (WinAVR-20071221) для функции, помеченной этими атрибутами, различие действительно такое (для noreturn добавляется сохранение r28,r29 в начале пролога, если же организовать возврат из функции, то и в конце эпилога) а вот 4.3.0 (сборка klen http://electronix.ru/forum/index.php?showtopic=38876) генерирует абсолютно одинаковый код для этих двух атрибутов (видать какой-то патч с winavr.cvs.sourceforge... недотащен был).
Более ранние компиляторы, естетсвенно, вообще OS_task не знают. Так что я пока оставлю как есть, с noreturn, а там посмотрим, добавлю проверку версии компилятора и в зависимости от этого изменение #define OS_PROCESS на атрибут noreturn или OS_task.


Цитата(Сергей Борщ @ Dec 23 2007, 00:57) *
Есть еще вопрос по "noreturn" с main() в режиме С++. Как известно, main() в С++ должна быть объявлена как возвращающая int. Если к ней добавить "noreturn", то появляется warning:
main.cpp:68: warning: function declared 'noreturn' has a 'return' statement
хотя никаких return statement в функции нет, из for(;;) {} выхода тоже не сущствует, и никаких ret в листинге нет. Это бага?

return 0; перед закрывающей скобкой '}' в main() в С++ присутствует неявно, если его не написал программист.
В стандарте написано:
Цитата
3.6.1 Main function
...
5 A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing
return 0;

А в "полновесном" С++ управление на закрывающую скобку main() может перейти и при бесконечном цикле, и при noreturn-функции (о которых стандарт вообще ничего не знает) - за счёт исключения. Поэтому return 0; всегда неявно присутствует для С++ - программы.
Есть ли смысл делать в avr-gcc какой-то особый подход - я не уверен. Да, он всё равно не поддерживает исключения и за бесконечный цикл в main() не попасть никак, но "генерация" неявного retrun 0; и упомянутого предупреждения происходит, как я понимаю, на платформо-независимых этапах компиялции.
А потом оптимизатор выбрасывает это как unreachable code, но это потом :-)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 23 2007, 10:37
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ReAl @ Dec 23 2007, 09:13) *
но "генерация" неявного retrun 0; и упомянутого предупреждения происходит, как я понимаю, на платформо-независимых этапах компиялции.
А потом оптимизатор выбрасывает это как unreachable code, но это потом :-)
Я понятия не имею, как оно работает внутри sad.gif . Я снаружи лишь вижу warning, лезу в листинг и не нахожу там никакого ret на который выдано предупреждение. Это несколько, хм... смущает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Алекс
сообщение Dec 23 2007, 12:52
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Не могу второй день скачать сервис пак AVR Studio 4.13 SP2, это только у меня или у всех
Go to the top of the page
 
+Quote Post
designer
сообщение Dec 23 2007, 20:02
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 27-05-05
Из: Rivne, Ukraine
Пользователь №: 5 472



Нормально скачалось.
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 24 2007, 09:25
Сообщение #15


Знающий
****

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



Цитата(ReAl @ Dec 23 2007, 10:13) *
Более ранние компиляторы, естетсвенно, вообще OS_task не знают. Так что я пока оставлю как есть, с noreturn, а там посмотрим, добавлю проверку версии компилятора и в зависимости от этого изменение #define OS_PROCESS на атрибут noreturn или OS_task.


Используйте оба этих атрибута: 'noreturn' - для генерации предупреждений а "OS_task" для экономии кода и стека.

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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:10
Рейтинг@Mail.ru


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