Цитата(jcxz @ Jun 27 2016, 07:57)

Обычно чтобы символьные имена из асм-файла были видимы в других исходных файлах (си и асм), нужно это символьное имя объявить в директиве PUBLIC.
Ну и, естественно, прописать прототип в си-хидере.
И наоборот: чтобы в асм-файле были видимы имена из других объектных файлов, нужно их указать в директиве EXTERN.
EXPORT я не использую нигде.
Тут случай особый. Это функция-обработчик прерывания. И её прототип указывается в ASM-файле начальной инициализации, который трогать нежелательно. Поэтому в определении функции необходимо директива EXPORT или её синоним GLOBAL.
Цитата(jcxz @ Jun 27 2016, 07:57)

Можно это квитирование прерывания просто поставить в начале ISR, сразу после входа. Я так и делаю обычно.
В моей ситуации необходимо как можно быстрее после входа в обработчик считать регистр порта в/в. Но в любом случае, это лишнее. Сброс флага внешнего прерывания нормально отрабатывает и непосредственно перед выходом из обработчика.
Написал обработчик на ASMе. Время входа в прерывание удалось сократить до 500 нс. Этого пока достаточно. Как сделать табличные переходы не соображу. Вот, что получилось:
CODE
EXTI_BASE EQU 0x40010400
GPIOA_BASE EQU 0x48000000
GPIOB_BASE EQU 0x48000400
GPIOC_BASE EQU 0x48000800
EXTI_PR_OFFSET EQU 0x14
GPIO_IDR_OFFSET EQU 0x10
GPIO_BSRR_OFFSET EQU 0x18
GPIO_BRR_OFFSET EQU 0x28
MACRO
asmexti_exit
LDR r0, =EXTI_BASE ; загрузить в регистр r0 адрес модуля EXTI
MOVS r1, #0x01 ; загрузить в регистр r1 значение 0x01
LSLS r1, #8 ; логический сдвиг влево на 8 бит значения в регистре r1
STR r1, [r0, #EXTI_PR_OFFSET] ; сохранить слово из регистра r1 в регистр EXTI->PR
BX lr ; возврат из функции
ALIGN
MEND
AREA ASMEXTI, CODE, READONLY
EXTI4_15_IRQHandler PROC
EXPORT EXTI4_15_IRQHandler
LDR r0, =GPIOC_BASE ; загрузить в регистр r0 адрес порта GPIOC
LDRH r0, [r0, #GPIO_IDR_OFFSET] ; загрузить в регистр r0 полуслово из регистра GPIOC->IDR
LSRS r1, r0, #9 ; логический сдвиг вправо на 9 бит значения в регистре r0 и сохранение результата в регистр r1
MOVS r2, #0x0B ; загрузить в регистр r2 значение 0x0B
ANDS r1, r2 ; побитовое И регистра r1 с регистром r2
CMP r1, #0x02 ; сравнить вычитанием из регистра r1 значения 0x02
BEQ C ; условный переход на метку C, если результат операции нулевой
CMP r1, #0x00 ; сравнить вычитанием из регистра r1 значения 0x00
BEQ A ; условный переход на метку A, если результат операции нулевой
CMP r1, #0x01 ; сравнить вычитанием из регистра r1 значения 0x01
BEQ B ; условный переход на метку B, если результат операции нулевой
asmexti_exit
A
MOVS r1, #0xFF ; загрузить в регистр r1 значение 0xFF
ANDS r0, r1 ; побитовое И регистра r0 с регистром r1
LSLS r1, #16 ; логический сдвиг влево на 16 бит значения в регистре r1
ORRS r0, r1 ; побитовое ИЛИ регистра r0 с регистром r1
LDR r2, =GPIOA_BASE ; загрузить в регистр r2 адрес порта GPIOA
STR r0, [r2, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r0 в регистр GPIOA->BSRR
asmexti_exit
B
MOVS r1, #0x60 ; загрузить в регистр r1 значение 0x60
ANDS r0, r1 ; побитовое И регистра r0 с регистром r1
LSLS r1, #16 ; логический сдвиг влево на 16 бит значения в регистре r1
ORRS r0, r1 ; побитовое ИЛИ регистра r0 с регистром r1
LDR r2, =GPIOB_BASE ; загрузить в регистр r2 адрес порта GPIOB
STR r0, [r2, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r0 в регистр GPIOB->BSRR
asmexti_exit
C
MOVS r1, #0x0F ; загрузить в регистр r1 значение 0x0F
LSLS r2, r1, #4 ; логический сдвиг влево на 4 бита значения в регистре r1 и сохранение результата в регистр r2
ANDS r2, r0 ; побитовое И регистра r2 с регистром r0
LSLS r2, #4 ; логический сдвиг влево на 4 бита значения в регистре r2
LSLS r3, r1, #24 ; логический сдвиг влево на 24 бита значения в регистре r0 и сохранение результата в регистр r3
ORRS r2, r3 ; побитовое ИЛИ регистра r2 с регистром r3
LDR r3, =GPIOA_BASE ; загрузить в регистр r2 адрес порта GPIOA
STR r2, [r3, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r2 в регистр GPIOA->BSRR
ANDS r0, r1 ; побитовое И регистра r0 с регистром r1
LSLS r0, #8 ; логический сдвиг влево на 8 бит значения в регистре r0
LSLS r2, r1, #24 ; логический сдвиг влево на 24 бита значения в регистре r0 и сохранение результата в регистр r3
ORRS r0, r2 ; побитовое ИЛИ регистра r0 с регистром r2
LDR r1, =GPIOB_BASE ; загрузить в регистр r1 адрес порта GPIOB
STR r0, [r1, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r0 в регистр GPIOB->BSRR
asmexti_exit
ENDP
END