реклама на сайте
подробности

 
 
> Разместить часть кода в прологе функции
Sergey_Aleksandr...
сообщение Nov 27 2012, 07:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Пишу SPI slave, платформа AVR. Обмен по прерываниям. Чтобы хоть как-то увеличить быстродействие, следующий байт передаваемых в мастер данных подготавливаю заранее, а в прерывании его первым делом загружаю в регистр данных SPDR. Т.е. передался байт -> прерывание -> загружаю очередной байт до прихода первого CLK. Но пролог у прерывания получился довольно большой и новая порция данных не успевает загрузиться до прихода первого синхроимпульса нового байта.


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 да, добавлю, собирал как без оптимизации, так и с максимальной оптимизацией по скорости, размер пролога не уменьшается.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th August 2025 - 14:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016