Чем дальше в лес, тем больше дров.... Ещё один баг IAR for ARM v6:
CODE
__noreturn static void Task3(void *)
{
static const char *t[] = {"FRAM start", "FRAM end", "DF start", "DF end"};
s64 k;
uint i;
while (1) {
while ((k = qdma.read()) >= 0) {
if (!(~(u32)k >> 8 & 255)) { //падает из-за этой строчки
if ((i = k & 255) >= ncell(t))
LogCR0(COL_TEAL "???%u mcs=%u", i, (u32)(k >> 31));
else LogCR0(COL_TEAL "%s mcs=%u", t[i], (u32)(k >> 31));
} else LogCR0(COL_TEAL
"qdma: DMA.EnaCh=0x%02X DMA.IntTCStat=0x%02X num=%u mcs=%u",
(u32)k & 255, (u32)k >> 8 & 255, (u32)k >> 16 & B15 - 1,
(u32)(k >> 31));
}
MboxPend(mboxTask3, ms2tkt(20));
Ptog(PIN_LED_G);
}
}
При попытке компиляции выдаёт:
Код
Tool Internal Error:
Internal Error: [CoreUtil/General]: Illegal state
Internal Error: [CoreUtil/General]: Illegal state
Error while running C/C++ Compiler
Если заменить указанную строчку на:
Код
if (!((u32)~k >> 8 & 255)) {
то всё ок. Оптимизация в положении "Low".
Похоже придётся возвращаться на IAR5.50...

(((