Абсолютный адрес функции в 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 бит.

Я разместил тот же вопрос на

https://electronics.stackexchange.com/questions/56858/absolute-address-of-a-function-in-microchip-xc16

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,

Другие вопросы по тегам