CODE
#pragma vector=SPI_STC_vect
__interrupt void SPI_TransferComplete_ISR(void)
{
SPDR = SPI_NextDataByte; //Без промедление загрузить очередной байт. Если не хотели передавать данные,
//......................
//......................
//......................
}
CODE
SPI_TransferComplete_ISR:
/* Пролог */
00042C 93BA ST -Y,R27
00042E 93AA ST -Y,R26
000430 93FA ST -Y,R31
000432 93EA ST -Y,R30
000434 933A ST -Y,R19
000436 932A ST -Y,R18
000438 931A ST -Y,R17
00043A 930A ST -Y,R16
00043C B73F IN R19,SREG
/* ----Пролог */
/* Загрузка данных */
SPDR = SPI_NextDataByte; //Без промедление загрузить очередной байт.
000440 EBE4 LDI R30,0xB4
000442 E0F1 LDI R31,0x01
000444 8103 LDD R16,Z+3
000446 BD0E OUT SPDR,R16
/* ----Загрузка данных */
/* остальная менее критичная к скорости выполнения рутина */
Как видно пролог составляет 17 тактов. Это очень много. Два пути решения в лоб: уменьшить частоту тактирования SPI (точнее увеличить интервал между отправкой байт) или оптимизировать код стараясь уменьшить число используемых регистров. Но хотелось бы получить на выходе что-то такое
CODE
SPI_TransferComplete_ISR:
/* Пролог, сохраняю регистры, которые изменят состояния при загрузке байта в SPDR */
00043A 930A ST -Y,R16
000430 93FA ST -Y,R31
000432 93EA ST -Y,R30
/* Мой критичный к скорости выполнения код */
000440 EBE4 LDI R30,0xB4
000442 E0F1 LDI R31,0x01
000444 8103 LDD R16,Z+3
000446 BD0E OUT SPDR,R16
/* Остаток пролога */
00042C 93BA ST -Y,R27
00042E 93AA ST -Y,R26
000430 93FA ST -Y,R31
000432 93EA ST -Y,R30
000434 933A ST -Y,R19
000436 932A ST -Y,R18
000438 931A ST -Y,R17
00043C B73F IN R19,SREG
/* остальная менее критичная к скорости выполнения рутина */
Можно ли это реализовать в IAR?
PS да, добавлю, собирал как без оптимизации, так и с максимальной оптимизацией по скорости, размер пролога не уменьшается.