Thumb Assembler прерывание в пользовательском разделе SRAM


Я хотел бы иметь процедуру прерывания в SRAM на LPC1768. Я использую набор инструментов GCC, подобный Yagarto. В настоящее время я могу сделать следующее из C:

NVIC_SetVector(TIMER0_IRQn, interruptTest);

...Затем в моем файле сборки:

    .text
/* .section    .fastcode */
    .global     interruptTest
    .func       interruptTest
    .thumb_func
interruptTest:
    ldr         r0,=(LPC_TIM0 + IR)    /* point to Timer 0's Interrupt Register */
    mov         r1,#(1 << 0)           /* Interrupt Pending bit for MR0 int */
    str         r1,[r0]                /* Clear it */

    bx          lr

    .size       interruptTest, . - interruptTest
    .endfunc

Теперь это работает просто отлично, указатель на функцию 'interruptTest' являетсянечетным . Однако, когда я включу'.раздел.fastcode ' бит, то указатель на прерывание становится четным вместо нечетным.

Мой вопрос: Как я правильно делаю рутину прерывания можно распознать как функцию большого пальца ?

1 2

1 ответ:

Понял!

Вставка '.тип interruptTest,%function ' заставляет его работать.

Таким образом, конечный источник должен быть:

    .section    .fastcode,"ax",%progbits
    .global     interruptTest
    .func       interruptTest
    .type       interruptTest,%function
    .thumb_func
interruptTest:
    ldr         r0,=(LPC_TIM0 + IR)    /* point to Timer 0's Interrupt Register */
    mov         r1,#(1 << 0)           /* Interrupt Pending bit for MR0 int */
    str         r1,[r0]                /* Clear it */

    bx          lr

    .size       interruptTest, . - interruptTest
    .endfunc

Важно: "ax",%progbits были добавлены к .директива раздела, потому что в противном случае раздел иногда будет игнорироваться.