2013-05-03 5 views
2

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

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» является нечетным. Однако, когда я включаю бит «.section .fastcode», указатель на прерывание становится даже вместо нечетным.

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

+1

Добавить '.thumb' где-нибудь? '.section .fastcode' - это некоторый раздел компоновщика. Я вижу, что это код с разными LMA/VMA от некоторого googling; но я не уверен, что вы говорите об этом. У вас есть дополнительная информация о '.fastcode'? Это как [этот вопрос] (http://stackoverflow.com/questions/13831462/understanding-the-location-counter-of-gnu-linker-scripts)? –

+0

Я уже пытался добавить «.thumb» прямо над «.thumb_func», но это не имело значения, поэтому я оставил его, чтобы избежать путаницы. Раздел .text все еще работает, не изменяя ничего другого. Сценарий компоновщика, который я использовал, приведен здесь: [link] (http://openlcb.sourceforge.net/trunk/scratchpads/dgoodman/OpenLCB_Template/makesection/LPC17xx.ld) – 2013-05-03 23:25:34

+0

Примечание: мне пришлось исправить компоновщик- сценарий, поэтому раздел BSS не перезаписывает разделы .fastcode и .data. Об этом я отправил автору сообщения об ошибках. – 2013-05-04 00:21:31

ответ

3

Получил!

Вставка '.Type 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 

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