Я дважды сталкивался с этой проблемой в своем проекте, и в последний раз я использовал какое-то грязное решение.
Платформа: PIC18F87J60, XC8 v1.12
Я пытаюсь использовать указатели функций, чтобы указать на функции, которые, возможно, находятся в верхней половине моего ПЗУ (>= 0x10000). Это означает, что сам указатель должен быть 17-битным или больше (до 20), чтобы иметь возможность обращаться к такой функции.
Это соответствующий фрагмент кода (упрощенный):
void test(void) @ 0x1C000
{
printf("function pointer called!\r\n");
}
void main(void) {
void (*testPointer) (void) = &test;
//Now testPointer contains 0x0C000
(*testPointer)(); //Doesn't call test. Instead it jumps to 0x0C000
}
Что происходит, так это то, что тест никогда не вызывается. Когда я использую отладчик (PICKIT 3), я вижу, что значение в testPointer равно 0x0C000. Просто кажется, что адрес в указателе округляется до 16 бит максимум, и это всегда происходит. Но когда я помещаю test() где-то ниже 0x10000, все работает нормально, потому что тогда указатель должен быть не более 16 бит.
Когда я считываю программу с устройства, test() действительно размещается по адресу 0x1C000, так что это не проблема, код есть.
В прошлый раз я решил ситуацию, приведя литерал long к указателю, и это сработало, но это грязно, и теперь я хочу этого избежать.
Кто-нибудь признает проблему? Это ошибка компилятора? Если да, то знает ли Microchip об этом? Любые чистые обходные пути? Компилятор XC8 вообще поддерживает 20-битные константные указатели?
Изменить: исправлена опечатка в коде выше &testPointer(); --> (*testPointer()); (нет, это не было причиной моей проблемы)
far rom void (*testPointer) (void) = &test;
? - person Michael   schedule 13.08.2013