Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
А CV позволяет копировать 16-битные регистры в переменные целиком?...
Отправлено
Dikoy 17 апреля 2008 г. 17:10
(пользую 1.25.5 pro и ATtiny2313). Он позволяет копировать в переменные 16-и битные регистры целиком?
То есть вместо:
unsigned int Int_Stop_Time;
Int_Stop_Time = ((TCNT1H<<8) | TCNT1L);
написать:
Int_Stop_Time = TCNT1;
Компилятор это пропускает, но если на первый вариант в ассемблерном листинге вполне понятные сдвиги/копирования, то на второй он генерит что-то мне непонятное... Сначала думал, что он только младший байт копирует, но не похоже... Кто-нибудь так делал когда-нибудь? Я и раньше замечал, что он пропускает такие конструкции, но предпочитал пользоваться провереным способом. А сейчас время выполнения жмёть...
Вот что он генерит на оба варианта:
; 47 // External Interrupt 1 service routine
; 48 interrupt [EXT_INT1] void ext_int1_isr(void)
; 49 {
.CSEG
_ext_int1_isr:
ST -Y,R0
ST -Y,R26
ST -Y,R30
IN R30,SREG
ST -Y,R30
; 50 if(Int_Marker != OCCUPIED) {
LDI R30,LOW(252)
CP R30,R2
BREQ _0x3
; 51 Int_Start_Time = TCNT1;
__INWR 4,5,44
; 52 MCUCR &= ~(1<<ISC10); // to falling mode
IN R30,0x35
ANDI R30,0xFB
OUT 0x35,R30
; 53 Int_Marker = OCCUPIED;
LDI R30,LOW(252)
RJMP _0x9
; 54 } else {
_0x3:
; 55 Int_Stop_Time = ((TCNT1H<<8) | TCNT1L);
IN R30,0x2D
MOV R26,R30
LDI R30,LOW(8)
RCALL __LSLB12
MOV R26,R30
IN R30,0x2C
OR R30,R26
MOV R6,R30
CLR R7
; 56 // Int_Stop_Time = TCNT1;
; 57 MCUCR |= (1<<ISC10); // to rising mode
IN R30,0x35
ORI R30,4
OUT 0x35,R30
; 58 Int_Marker = SET;
LDI R30,LOW(238)
_0x9:
MOV R2,R30
; 59 }
; 60 }
LD R30,Y+
OUT SREG,R30
LD R30,Y+
LD R26,Y+
LD R0,Y+
RETI
; 61
Составить ответ | Вернуться на конференцию
Ответы