Вливаюсь в ряды вставших на грабли с глюком в прологах/эпилогах обработчиков прерываний. Создал было свою тему, но потом обнаружил ещё две трёхлетней давности. Вот моя
http://electronix.ru/forum/index.php?showtopic=67407Цитата(klen @ Dec 5 2006, 17:13)

1. Баг с прологом пофиксен ручками . ПОКА работает(уже два месяца активного использования), если ктото найдет что чтото вылезло в другом месте - буду дальше искать, если не нет запощу на багзиллу. Соответствующего патча вроде нет???? Такое ащущение что все на этот баг просто забили, поскольку он уж точно год висит и никого особот не напрягает. Возможно потому что очень просто написать обертку входа и выхода из обрпботчика на асме.
Я бы не сказал, что этот баг не напрягает. Обёртку написать конечно просто - одна асм-команда пролог и две команды эпилог. Только нет гарантии правильной работы. Вот мой пример.
Код
void AdcIntr() __attribute__((naked));
...
void AdcIntr() // обработчик прерывания АЦП
{
// asm("LDR SP, =(NEW_FIQ_STACK+128)"); // временно из-за проблем со стеком FIQ
asm("STMDB SP!,{R0-R7,LR}"); // пролог для FIQ
...
// VICVectAddr = 0; // для FIQ не нужна
asm( "LDMIA SP!,{R0-R7,LR} \n" // эпиолог для FIQ
"SUBS PC,LR,#4 ");
}
Тестировал на разных уровнях оптимизации. На "none" вылетает в Data Abort. Залез а дизасм, читаю - оказывается атрибут "naked" выбрасывает не только сохранение/восстановление регистров, но и резервирование в стеке переменных, и даже (!) копирование SP в R11 в моём случае (видимо для работы со стековыми переменными). Interworking Arm/Thumb включён, но весь код написан на Arm.
Проблеме уже 5 лет и никто не "чешется". CW продолжает использовать очередное гуано в своих студиях.
Забыл указать, что оригинальный компилятор в CW 1.7. build 9 не менял на написанный klen-ом, пока не успел, пока камень в огород компилятора из комплекта CW. А как узнать версию конкретно cc1.exe не понял. Там ещё есть файл cc1plus.exe, тоже непонятно что это.