ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
874806
maleon (03.10.2018 08:54, просмотров: 4763)
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>