Как мне получить функцию для компиляции по адресу 04 с GPLINK?(Для PIC16) - PullRequest
0 голосов
/ 27 августа 2011

У меня есть функция, которая предназначена для перехвата всех вызовов прерывания, которые произойдут, но я не могу запустить какую-либо функцию по адресу 04.

Примечание: я не хочуиспользовать функции, которые специфичны для типов прерываний, я не хочу, чтобы в коде возникали накладные расходы, которые они создают.

Я пробовал следующие коды с SDCC, возможно, не совсем связанные, но я оставлю их здесь на всякий случай.

__code __at (4) void handler() {

И

void __at (4) handler() {

Не повезло, что в руководстве также нет объяснения.

Ответы [ 4 ]

1 голос
/ 28 октября 2013

Я знаю, что прошло много времени после первоначального вопроса, но я искал тот же ответ и нашел эту полезную информацию, подтвердившую работу над SDCC 3.3.0: (Источник: http://www.mail-archive.com/sdcc-user@lists.sourceforge.net/msg00411.html)

Чтобы связать функцию с фиксированным, известным адресом, вы можете окружить функцию двумя другими функциями: См. Пример ниже. ПРИМЕЧАНИЕ: все символы _ являются двойными _ _! (Вы также можете определить макросы, как в приведенном выше примере, если вы собираетесь использовать это несколько раз в коде.

ЗАМЕНИТЕ #### с нужным адресом вашей функции ниже:

test.c

void begin_absolute_code(void) __naked
{
    __asm
          .area ABSCODE (ABS,CODE)
          .org 0x####        // YOUR FUNCTION'S DESIRED ADDRESS HERE.
    __endasm;
}

void your_function(...)
{
     // Do stuff here. This code will be placed at the specified address.
}

void end_absolute_code(void) __naked
{
    __asm
        .area CSEG (REL,CODE)
    __endasm;
}

void other_functions_here(...)
    // These functions will return to relative positions determined by the linker.

Надеюсь, это полезно!

1 голос
/ 27 августа 2011

Вы не хотите, чтобы функция начиналась с адреса 4. Вы хотите, чтобы компилятор сгенерировал переход в этом месте к вашей функции isr.

Быстрый просмотр документации SDCC дает такую ​​структуру:

void isr(void) interrupt n { /* your code goes here */ }

Где векторный слот 'n', где вы хотите использовать команду goto.

Другие компиляторы будут иметь аналогичные функции, вам нужно проверить документацию компилятора для точного заклинания.1009 * Например, используя HiTech C:

void interrupt isr(void) { /* code */ }
1 голос
/ 19 сентября 2011

Я нашел это в списке рассылки.

Компиляция с использованием sdcc --codeseg SEGNAME -c file.c
И ссылка делает это sdcc -Wl -bSEGNAME=0x7ff0 ...

1 голос
/ 27 августа 2011

Расположение функции зависит от компоновщика, а не от компилятора.

...