Цитата(1kvi1 @ Aug 17 2011, 13:26)

использую C8051F342 - 25д6 RAM+4096XRAM
вся забита под завязку
Очень много локальных переменных типа unsigned long - причем для каждой из них компилятор выделяет 4 байта в XRAM
Если не ошибаюсь, Keil анализирует программу (строит граф вызовов функций или что-то в этом духе) и оптимизирует использование памяти. То есть если на этапе компиляции известно, что две функции не вызывают друг друга, то их локальные переменные могут располагаться в перекрывающихся участках памяти. При анализе вызовов функций компилятор может быть сбит с толку, например, указателями на функции (попробуй проследи за ними). Так что я бы попытался понять, есть ли в программе что-то, что мешает компилятору делать свою работу.
Вот тут есть немного информации про указатели на функции и граф вызовов функций:
Application Note 129 - Function Pointers in C51.