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


person Saneesh A T    schedule 02.02.2013    source источник
comment
Пожалуйста, уточните, поскольку вас несколько раз спрашивали, действительно ли материал в файле .s является кодом или данными; пожалуйста, определите «функция неверна»; и, пожалуйста, продолжайте весь разговор здесь, а не на electronics.stackexchange.com, откуда он взялся. В противном случае я вообще не вижу смысла писать здесь.   -  person user207421    schedule 06.02.2013


Ответы (2)


Как я писал на 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.

person user207421    schedule 03.02.2013
comment
@downvoter Пожалуйста, объясните. Расскажите нам, почему указатель на функцию не должен быть типизирован с использованием синтаксиса, предназначенного для этой цели, и почему лучше преобразовать его в unsigned long и обратно. - person user207421; 03.02.2013

Размер флэш-памяти dspic может превышать 16 бит. Ваша часть имеет флэш-код 128 КБ. Как вы хотите поместить это в 16-битный int?

person Marco van de Voort    schedule 31.05.2016