Цитата(sensor_ua @ Jul 4 2008, 10:11)

__bic_SR_register() делается с тупым запрещением/разрешением прерываний или через сохранение статуса
Как вы себе это представляете? GIE живет в этом же регистре SR. Если я понимаю правильно, то __bic_SR_register(x) компилится в (к сожалению, проверить сейчас не на чем):
Код
bic #x, SR;если х - константа
mov &val, Rx
bic Rx, SR; если х - переменная.
Где тут запрещать прерывания?
Цитата(sensor_ua @ Jul 4 2008, 10:11)

, ну а __bic_SR_register_on_exit() просто не трогает GIE или как, "встраивается" в эпилог и её нужно использовать перед самым выходом или может вызываться в любом месте обработчика прерывания, или просто в любой критической секции (при уже запрещённых прерываниях)
А разве она встраивается не в точку использования? В точке использования компилятор знает, сколько байтов он положил на стек в процессе выполнения обработчика. Например, 4. Тогда __bic_SR_register_on_exit(х) выливается в bic #x, 4(SP). При выходе из прерывания на исполнении RETI это "подправленное" значение будет загружено в SR. Тут тоже запрещать прерывания негде.