maleon (03.10.2018 08:54, просмотров: 4768)
STM32 Bit-Band, с портами работает нормально, а с переменными всё вычисляет ассемблером. Можно обяснить компилятору (Keil), что-бы адрес flags испльзовал на этапе компиляции? Может какой другой компилятор работает оптимальнее? Макрос:
#define BBB(var, bit) (*(u32*)((bit) << 2 | 0x2000000U | \
(uc32)&(var) & 0xFFF00000U | \
((uc32)&(var) & 0xFFFFFU) << 5))
код:
static u32 flags;
BBB(GPIOA->ODR, 5) ^= 1;
BBB(flags, 15) ^= 1;
результат:
43: BBB(GPIOA->ODR, 5) ^= 1;
0x08000422 481E LDR r0,[pc,#120] ; @0x0800049C
0x08000424 6800 LDR r0,[r0,#0x00]
0x08000426 F0800001 EOR r0,r0,#0x01
0x0800042A 491D LDR r1,[pc,#116] ; @0x080004A0
0x0800042C F8C10194 STR r0,[r1,#0x194]
44: BBB(flags, 15) ^= 1;
0x08000430 481C LDR r0,[pc,#112] ; @0x080004A4
0x08000432 F36F0013 BFC r0,#0,#20
0x08000436 491C LDR r1,[pc,#112] ; @0x080004A8
0x08000438 4308 ORRS r0,r0,r1
0x0800043A 491A LDR r1,[pc,#104] ; @0x080004A4
0x0800043C F3C10113 UBFX r1,r1,#0,#20
0x08000440 EA401041 ORR r0,r0,r1,LSL #5
0x08000444 6800 LDR r0,[r0,#0x00]
0x08000446 F0800101 EOR r1,r0,#0x01
0x0800044A 4816 LDR r0,[pc,#88] ; @0x080004A4
0x0800044C F36F0013 BFC r0,#0,#20
0x08000450 4B15 LDR r3,[pc,#84] ; @0x080004A8
0x08000452 4318 ORRS r0,r0,r3
0x08000454 4B13 LDR r3,[pc,#76] ; @0x080004A4
0x08000456 F3C30313 UBFX r3,r3,#0,#20
0x0800045A EA401043 ORR r0,r0,r3,LSL #5
0x0800045E 6001 STR r1,[r0,#0x00]
</c>