Исходные данные: IAR 5.30 + LPC2478, ЖКИ TFT, внешняя SDRAM в качестве буфера индикатора.
при работе наблюдаются периодические неприятные помехи на индикаторе. опытным путем было установлено, что помехи вызываются некоторыми операциями чтения/записи SDRAM (в том числе в участки памяти, не находящиеся внутри буфера ОЗУ). Написал тестовый цикл
Код
for (;;)
{
int y1 = 0, y2 = 200;
int x1 = 0, x2 = 200;
for (; y1 <= y2; ++y1)
{
volatile u16 *from = screen_shadow + x1 + (y1 * C_GLCD_H_SIZE);
volatile u16 *to = screen_buffer + x1 + (y1 * C_GLCD_H_SIZE);
for (int i = x1; i < x2; ++i) *to++ = *from++;
}
}
сперва грешил на размерность указателей (8/16/32 бита), потом выяснилось, что дело не в этом, а в уровне оптимизации. при level = medium все стоит как вкопаное, как только ставлю high - помехи. при этом при high level от компилятор от исходного кода ничего не оставляет, все ссылки идут куда-то в недра memcpy, с использованием жутких конструкций типа LDMIA, STMIA, LDMCSIA и проч.
Конечно, причина ясна, можно обойти, но собирать весь проект со средним уровнем оптимизации очень не хочется, выискивать по всему коду и обвешивать обращения к SDRAM прагмами тоже нет никакого желания. volatile не помогает ни коим образом. может, что-то еще посоветуете?