Абсолютный адрес функции в Microchip XC16
Устройство: dsPIC33FJ128GP802
У меня есть некоторые *.s файлы следующим образом
.global _D1
.section .speex, code
_D1:
.pword 0x66C821, 0x1B0090, 0xD96C36, 0x9B60B0, 0xDD4E36, 0xBF4E53
.pword 0xD1098B, 0x719BD9, 0x873989, 0x003B69, 0x279035, 0xED4244
.pword 0xE1403C, 0x54D439, 0x826550, 0xC59627, 0xDD0432, 0x88FA29
Я объявил то же самое в *.h
extern void D1(void);
Теперь я передаю D1 в функцию чтения таблицы
nowPlaying.file1 = (unsigned long) D1;
function(nowPlaying.file1);
Моя проблема в том, что, если адрес D1 выше 0x8000, процедура не является правильной. Я пробовал большие и маленькие модели кода, но результат один и тот же. Я думаю, что это связано с 16-битным ограничением указателей. Есть ли способ доступа к абсолютному адресу D1 прямо из кода. Может быть, что-то вроде встроенной функции или макроса.
Обратите внимание, что в руководстве по компилятору написано:
Компилятор C MPLAB XC16 полностью поддерживает указатели на функции, что позволяет вызывать функции косвенно. Указатели на функции всегда имеют ширину 16 бит.
Я разместил тот же вопрос на
2 ответа
Размеры dspic flash могут быть больше 16 бит. Ваша часть имеет 128 КБ флэш-кода. Как вы хотите заполнить это в 16-битном int?
Как я писал на electronics.stackexchange.com, вы врете компилятору D1
, передавая это unsigned long
, когда это не без знака долго вообще. Это может вызвать проблемы в будущем.
Если материал, начинающийся с D1, является кодом, который может соответствовать соглашениям о вызовах C, D1
должен быть объявлен как extern void D1(void)
и все члены структуры и переменные и параметры, которые принимают его адрес, должны быть объявлены как void (*D1)(void)
и вы можете вызвать его через эти значения с синтаксисом (*var)()
, Я не знаю что nowPlaying.file1
переменная для: вы также можете просто позвонить function(D1)
если function()
объявлен правильно, т.е. как указано выше.
Если это данные, это должно быть const short D1[]
и вам не нужен ассемблер: вы можете указать значения в C как const short D1[] = {...};
, Компилятор должен поместить D1 в сегмент кода как есть const
,