ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
240297 Топик полностью
maik-vs (22.02.2011 15:40 - 15:43, просмотров: 171) ответил mazur на Я поспорю. Vit правильно написал, это одна кастрированная задача. Если действовать по вашему, то тогда в других задачах выбывают из игры указанные вами регистры.
Речь шла о "добиться максимальной скорости". "добиться" это не "протянуть руку и взять", тут надо чем-то пожертвовать, чтобы добиться. Ну ладно, это всё лирика. Отвечаем кодом на код :). Здесь используется указатель на текущую позицию в буфере. Y не использовался и в исходном коде, он спокойно заменялся на Х который стал не нужен после записи в буфер приёма. SPI_Transfer_Int: push r16 ; 1 in r16,SREG ; 1 push r16 ; 1 ; push r17 ; 1 ; push CNT ; 1 push XL ; 1 push XH ; 1 ; push YL ; 1 ; push YH ; 1 ; ldix SPI_RECEIVE_BUFFER ; 2 X->r[0] ld2 Xh,Xl,SPI_RECEIVE_BUFFER_PTR ; 2 X->r[i] ; ldiy SPI_TRANSFER_BUFFER ; 2 Y->t[0] ; lds CNT,SPI_CNT_BYTES ; 1 cnt=i ; lds r17,SPI_BYTES_SIZE ; 1 17 Buf.len ; addw X,CNT,RCLR ; 2 X->r[i] in r16,SPDR ; 1 data in ; st X,r16 ; 1 r[i]=data st X+,r16 ; 1 r[i++]=data ; inc CNT ; 1 ; cp CNT,r17 ; 1 i+1 vs Blen? cp2i Xh,Xl,(SPI_RECEIVE_BUFFER+SPI_RECEIVE_BUFFER_LENGTH) brsh SPI_Transfer_Int_Off ; 1 ; sts SPI_CNT_BYTES,CNT ; 1 sav i++ st2 SPI_RECEIVE_BUFFER_PTR,Xh,Xl ; 2 sav r_ptr sbiw X,(SPI_TRANSMIT_BUFFER-SPI_RECEIVE_BUFFER) ; 2 X->t[i+1] ; addw Y,CNT,RCLR ; 2 Y->t[i+1] ld r16,Y ; 1 out SPDR,r16 ; 1 out t[i+1] rjmp SPI_Transfer_Int_End ; 1 SPI_Transfer_Int_Off: in r16,SPCR ; 1 cbr r16,1<<SPIE ; 1 out SPCR,r16 ; 1 cbr FLAGS,1<<SPITC_FLG ; 1 SPI_Transfer_Int_End: ; pop YH ; 1 ; pop YL ; 1 pop XH ; 1 pop XL ; 1 ; pop CNT ; 1 ; pop r17 ; 1 pop r16 ; 1 out SREG,r16 ; 1 pop r16 ; 1 reti ; 1