Цитата(etoja @ Aug 13 2007, 07:14)

И всётаки прерывания IRQ в Crossworcs отрабатываются неправильно. Даже с заплаткой klena.
Беру LPC2106, разрешаю прерывания от UART0, UART1, TIMER0. Правильно отрабатывает только TIMER0(с заплаткой klena). Без заплатки вообще прерываний нет. Использовал Crossworcs 1.4, 1.6, 1.7.
Компиляция этого же проекта в ICCV7ARM(Imagecraft) и KEIL приводит к правильному результату.
Кстати. Кто-нибудь проверял в Crossworcs опцию
#pragma pack(1)
для выравнивания структур на границу байта?
Насчёт выравниваний могу посоветовать:
typedef struct {
int var1;
int var2;
short var3 __attribute__ ((packed));
short var4 __attribute__ ((packed));
char var5;
}my_type;
my_type myVar;
Если хочется быстрой работы программы и малого размера кода - писать (__attribute__ ((packed))) для всей структуры не надо! Так как при этом она кладётся без выравнивания и загрузка 2 и 4 байтных переменных происходит побайтно.
Я лично выравнивание в структурах контролирую сам. Атрибут packed пишу только напротив short. Такой код правильно компилируется (int грузится ldr, short - ldrh, char - ldrb) и нормально стыкуется с ассемблерными функциями.
Ну а если ресурсы МК безграничны в рамках данного приложения, то пишем либо packed для всей структуры (тогда она кладётся без выравнивания), либо не пишем пакет вовсе (тогда char и short имеют размер 4 байта)
Напротив char писать packed - не надо! (По крайней мере в последних CrossWorks (1.6).
Кстати у меня имеется корыстный вопросик. Лекарство для CrossWorks 1.7 не подкинете?!?