в обработчике исп. 9 адресов (2 переменные, 3 рег. SPI, 4 рег. TIM1) компиль только для трех из них исп. обращение по смещению.
или альтернатива только вставка asm?
сейчас мне пока не критично, но на будущее заинтересовал этот вопрос.
(в рабочее время выхода в тырнет не имею, если что отвечу только вечером)
Спойлер
Код: Выделить всё
void SPI2_IRQHandler(void){
uint16_t h;
uint32_t w;
h = SPI2->DR;
if(wi) {
wi = wi|h;
TIM1->CR1 = 0; TIM1->SR = 0; TIM1->DIER = 0;
SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
// uint32_t z,s;
// z=w; s=0;
// while (z){if (z&1) {s++;} z>>=1;}
// if (s&1) break;
// wi=0;
status |= 1;
}else{
if (adri==(h>>8)) wi =(h<<16);
else { // stop restart
TIM1->CR1 = 0; TIM1->SR = 0;
SPI2->CR1 |= SPI_CR1_SSI; SPI2->CR2 = 0;
TIM1->EGR = TIM_EGR_UG;
TIM1->DIER = TIM_DIER_CC3IE;
TIM1->CR1 |= TIM_CR1_CEN;
}
}
}
листинг начало:
0x08001D86 B4F0 PUSH {r4-r7}
0x08001D88 4810 LDR r0,[pc,#64] ; @0x08001DCC
0x08001D8A F8B0C000 LDRH r12,[r0,#0x00]
0x08001D8E 481B LDR r0,[pc,#108] ; @0x08001DFC
0x08001D90 6887 LDR r7,[r0,#0x08]
0x08001D92 4E1E LDR r6,[pc,#120] ; @0x08001E0C
0x08001D94 4A0E LDR r2,[pc,#56] ; @0x08001DD0
0x08001D96 2100 MOVS r1,#0x00
0x08001D98 4B0A LDR r3,[pc,#40] ; @0x08001DC4
0x08001D9A 1F35 SUBS r5,r6,#4
0x08001D9C 1D14 ADDS r4,r2,#4
0x08001D9E B3CF CBZ r7,0x08001E14
0x08001DA0 6887 LDR r7,[r0,#0x08]
0x08001DA2 EA470C0C ORR r12,r7,r12
0x08001DA6 F8C0C008 STR r12,[r0,#0x08]
0x08001DAA 8019 STRH r1,[r3,#0x00]
0x08001DAC 8031 STRH r1,[r6,#0x00]
0x08001DAE 8029 STRH r1,[r5,#0x00]
0x08001DB0 8813 LDRH r3,[r2,#0x00]


