Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: __C_task
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Student2
После ознакомления с рекомендации IAR для оптимального кода я стал използовать __C_task перед main() и увидел сразу уменьшения кода. Потом поставил __C_task перед процедурами которые вызывались из main() без параметрами и код снова уменшился. Притом код продолжает хорошо работать.

Вопрос - что будеть если поставить __C_task перед процедурами которые вызываются с параметрами из main()? Вообще где можно и где не надо поставить __C_task ?
HARMHARM
__C_task это эквивалент __noreturn. То есть, компилятор не будет вставлять эпилог функции - восстановление стека и регистров.
Реально можно использовать для main и задач - то есть для функций, из которых не происходит возврат.
Student2
Реално я вижу что компилатор вставить RET в конце процедур вызванных из main() с __C_task спереди. То что поменялось - IAR не ползует DSTACK перед вызов процедур.

ИМХО __C_task не совсем __noreturn
xelax
Что гадать то... В документации написанно, что функция не сохраняет контекст. А название такое, потому что обычно задачи операционок так себя ведут. Операционка сама сохраняет и восстанавливает контекст. Если вы напишите свои пролог и эпилог для функций то можете хоть все функции обрамлять этим ключевым словом.
Student2
То что можно сказать - если поставить __C_task перед процедурами которые вызываются с main() без параметрами и если в main() нет локалные переменные - компресия кода заметная и код работает. Смотрел асемблер - компилер правилно ставит RET в конце процедур. То что видимо отнял компилер из процедурами - нет DSTACK секция где хранят регистры.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.