Да уж... Прикольно конечно, но в данном случае применение ассемблера - бессмысленно. Так как применён он в таком месте, где в этом нет нужды.
Вот если-б автор реализовал на нём какой-то алгоритм, требующий максимального быстродействия... Скажем - модулятор или демодулятор. Или фильтр какой. Или какой-то нестандартный алгоритм, нереализуемый на си. Например - какой-то алгоритм с самомодифицирующимся кодом или что-то подобное. Или хотя бы просто - алгоритм требующий активного использования редких команд или каких-то особенностей CPU.
А так....
PS: По тексту видно не очень эффективное программирование на ассемблере:
1. Использование задержек NOP-ами. Имхо - такое на процессорах типа ARM - вообще не комильфо.
2. Функции оформлены без следования стандартным соглашениям вызова. Из-за этого - их нельзя использовать совместно с си-кодом.
3. Неоправданное повсеместное использование MOV32, вместо загрузки констант с адресацией по PC.
4. Использование команд без суффикса 'S' (более длинные команды).
5. Вообще автор выполняет в коде много странных, бессмысленных действий. Типа сохранения LR в начале функции и восстановления в конце. Непонятно с какой целью. Для обучения это явно не гуд.
Например тут:
Код: Выделить всё
lnter_DMA1_Channel5 PROC ;- любое немаскированное прерывание от канала 5 модуля DMA1
PUSH {LR}
MOV32 R0, #DMA1
LDR R1, [R0,#DMA_INTF1]
STR R1, [R0,#DMA_INTC1] ;Очистка прерывания
MOV32 R0, #NVIC_ICPR2 ; Сбрсить признаки отложенных прерываний 64...96
MOV R1, #(1<<(DMA1_Channel5_IRQn - 64))
STR R1, [R0]
MOV32 R0, #GPIOA
MOV32 R1, #CS_off ; CS_off: 1
STR R1, [R0,#GPIO_BOP]
POP {LR}
BX LR
ENDP
Зачем тут делается PUSH/POP LR?
Также - зачем тут делается очистка запроса прерывания в NVIC? Он уже был очищен, когда CPU перешёл на этот ISR. А такая повторная очистка уже после сброса флагов в регистре периферии (DMA) имхо может привести в какой-то момент к багам: Если новый запрос прерывания успеет прийти между очисткой флагов в регистре DMA и сбросом нового флага запроса в NVIC. Флаг запроса будет стоять в регистре DMA, но не будет вызывать вызова ISR, так как в NVIC запрос уже сброшен.
Также в конце процедуры не выполняются требований Errata2.1.3 Cortex-M3/M4 (отсутствует инструкция барьера).
PPS: Вобщем имхо - код написан весьма грязно.