Я пишу загрузчик для PIC32MX, используя компилятор PICC32 от HiTech (аналогично C90). В какой-то момент мне нужно, чтобы перейти к основной процедуре реального, так что где-то в загрузчике у меня естьОшибка компилятора при указании на функцию
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
Могу ли я споткнуться о некоторой варильности синтаксиса C здесь?
Эта ошибка не относится к какой-либо конкретной строке, но если я прокомментирую звонок user_main()
, она исчезнет. (Это может быть компилятор удаления избыточного кода ветви, но HiTech PICC32 не особенно умный в режиме Lite, так что, возможно, нет.)
Update: Я заметил также, что если я использую
void (*user_main) (void);
unsigned int x = 0x9D003000;
user_main = (void (*) (void)) x;
user_main();
У меня такая же ошибка.
Кстати, независимо от того, как вы в конечном итоге убедите своего компилятора понять ваш код, я бы сделал несвязанное изменение, чтобы помочь людям понять ваш код. typedef void (* user_main_t) (void); user_main = (user_main_t) 0x9D003000; –
О да, у меня на самом деле есть 'typedef void (* MainFunction) (void)' в файле заголовка. Функция typedefs - одна из моих любимых функций C;) – detly