Полная версия этой страницы:
__C_task
Student2
Aug 6 2009, 12:53
После ознакомления с рекомендации IAR для оптимального кода я стал използовать __C_task перед main() и увидел сразу уменьшения кода. Потом поставил __C_task перед процедурами которые вызывались из main() без параметрами и код снова уменшился. Притом код продолжает хорошо работать.
Вопрос - что будеть если поставить __C_task перед процедурами которые вызываются с параметрами из main()? Вообще где можно и где не надо поставить __C_task ?
HARMHARM
Aug 6 2009, 13:04
__C_task это эквивалент __noreturn. То есть, компилятор не будет вставлять эпилог функции - восстановление стека и регистров.
Реально можно использовать для main и задач - то есть для функций, из которых не происходит возврат.
Student2
Aug 6 2009, 13:10
Реално я вижу что компилатор вставить RET в конце процедур вызванных из main() с __C_task спереди. То что поменялось - IAR не ползует DSTACK перед вызов процедур.
ИМХО __C_task не совсем __noreturn
Что гадать то... В документации написанно, что функция не сохраняет контекст. А название такое, потому что обычно задачи операционок так себя ведут. Операционка сама сохраняет и восстанавливает контекст. Если вы напишите свои пролог и эпилог для функций то можете хоть все функции обрамлять этим ключевым словом.
Student2
Aug 7 2009, 10:39
То что можно сказать - если поставить __C_task перед процедурами которые вызываются с main() без параметрами и если в main() нет локалные переменные - компресия кода заметная и код работает. Смотрел асемблер - компилер правилно ставит RET в конце процедур. То что видимо отнял компилер из процедурами - нет DSTACK секция где хранят регистры.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.