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

 
 
> __C_task
Student2
сообщение Aug 6 2009, 12:53
Сообщение #1


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



После ознакомления с рекомендации IAR для оптимального кода я стал използовать __C_task перед main() и увидел сразу уменьшения кода. Потом поставил __C_task перед процедурами которые вызывались из main() без параметрами и код снова уменшился. Притом код продолжает хорошо работать.

Вопрос - что будеть если поставить __C_task перед процедурами которые вызываются с параметрами из main()? Вообще где можно и где не надо поставить __C_task ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
HARMHARM
сообщение Aug 6 2009, 13:04
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



__C_task это эквивалент __noreturn. То есть, компилятор не будет вставлять эпилог функции - восстановление стека и регистров.
Реально можно использовать для main и задач - то есть для функций, из которых не происходит возврат.
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 6 2009, 13:10
Сообщение #3


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Реално я вижу что компилатор вставить RET в конце процедур вызванных из main() с __C_task спереди. То что поменялось - IAR не ползует DSTACK перед вызов процедур.

ИМХО __C_task не совсем __noreturn

Сообщение отредактировал Student2 - Aug 6 2009, 13:10
Go to the top of the page
 
+Quote Post
xelax
сообщение Aug 7 2009, 06:28
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Что гадать то... В документации написанно, что функция не сохраняет контекст. А название такое, потому что обычно задачи операционок так себя ведут. Операционка сама сохраняет и восстанавливает контекст. Если вы напишите свои пролог и эпилог для функций то можете хоть все функции обрамлять этим ключевым словом.
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 7 2009, 10:39
Сообщение #5


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



То что можно сказать - если поставить __C_task перед процедурами которые вызываются с main() без параметрами и если в main() нет локалные переменные - компресия кода заметная и код работает. Смотрел асемблер - компилер правилно ставит RET в конце процедур. То что видимо отнял компилер из процедурами - нет DSTACK секция где хранят регистры.
Go to the top of the page
 
+Quote Post

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

 


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


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