[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Уважаемый Петруха!
Выполнить желательную Вам операцию можно только так, как советует уважаемый Беня - через ассемблерную вставку. Попытка сделать подобный трюк в Си легко приведёт Вас к большим неприятностям. Дело в том, что язык Си, воплощённый в Keil, принципиально не допускает ручные операции со стеком. Так что уйти из функции Вы можете - например, через goto, но при этом стек останется сдвинутым, что, как вы понимаете, очень скоро даст себя знать, так как средства автоматического надзора за стеком не предусмотрены. Кроме того, если функция - прерывающая, то флаг прерывания останется взведённым - он сбрасывается инсрукцией RETI, опять-таки недоступной для ручных манипуляций в языке Си. Значит, последующие запросы на прерывание будут проигнорированы. Что касается переносимости, прозрачности и прочей чепухи - придавать этому чрезмерного значения не стоит, и вот почему. За переносимость приходится платить неоправданно дорого - полным отказом от использования мощи великолепной (хотя и несколько устаревшей) архитектуры 51 процессора, которая была создана без оглядки на язык Си. В этом случае непонятно - а зачем вам 51?
В качестве резюме : ассемблерные вставки в Си-шном коде на Keil использовать можно и нужно, а те, кто не делает этого - или трусы, или лентяи. (Н.Островский, "Как закалялась сталь")
E-mail: info@telesys.ru