Я пишу загрузчик для PIC32MX, используя компилятор HiTech's PICC32 (аналогично C90). В какой-то момент мне нужно перейти к основной процедуре real , поэтому где-то в загрузчике у меня есть
void (*user_main) (void);
user_main = (void (*) (void)) 0x9D003000;
user_main();
(Обратите внимание, что в реальном коде сигнатура функции - это typedef'd, а адрес - макрос.)
Я бы предпочел рассчитать этот (виртуальный) адрес из физического адреса и получить что-то вроде:
void (*user_main) (void);
user_main = (void (*) (void)) (0x1D003000 | 0x80000000);
user_main();
... но когда я пытаюсь это сделать, я получаю ошибку компилятора:
Error #474: ; 0: no psect specified for function variable/argument allocation
Я тут что-то сказал о неясности синтаксиса С?
Эта ошибка не относится к какой-либо конкретной строке, но если я закомментирую вызов user_main()
, она исчезнет. (Это может быть компилятор, удаляющий избыточную ветвь кода, но HiTech PICC32 не особенно хорош в облегченном режиме, так что, возможно, нет.)
Обновление : я также заметил, что если я использую
void (*user_main) (void);
unsigned int x = 0x9D003000;
user_main = (void (*) (void)) x;
user_main();
Я получаю ту же ошибку.