[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Mihasic 14 ноября 2001 г. 15:13
В ответ на: От Асм к Си отправлено Петруха 14 ноября 2001 г. 11:39

Уважаемый Петруха!
Выполнить желательную Вам операцию можно только так, как советует уважаемый Беня - через ассемблерную вставку. Попытка сделать подобный трюк в Си легко приведёт Вас к большим неприятностям. Дело в том, что язык Си, воплощённый в Keil, принципиально не допускает ручные операции со стеком. Так что уйти из функции Вы можете - например, через goto, но при этом стек останется сдвинутым, что, как вы понимаете, очень скоро даст себя знать, так как средства автоматического надзора за стеком не предусмотрены. Кроме того, если функция - прерывающая, то флаг прерывания останется взведённым - он сбрасывается инсрукцией RETI, опять-таки недоступной для ручных манипуляций в языке Си. Значит, последующие запросы на прерывание будут проигнорированы. Что касается переносимости, прозрачности и прочей чепухи - придавать этому чрезмерного значения не стоит, и вот почему. За переносимость приходится платить неоправданно дорого - полным отказом от использования мощи великолепной (хотя и несколько устаревшей) архитектуры 51 процессора, которая была создана без оглядки на язык Си. В этом случае непонятно - а зачем вам 51?
В качестве резюме : ассемблерные вставки в Си-шном коде на Keil использовать можно и нужно, а те, кто не делает этого - или трусы, или лентяи. (Н.Островский, "Как закалялась сталь")

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru