I write two codes for generating greq at PA0-Pa7: Diff in code 1 & code 2 is that only BSSR register is moved to define macro.
code1
#define WRITE_TFT_DATA_PINS(VALUE) { \ GPIOA->BSRRL = (uint16_t)( VALUE & 0x000000ff); \ GPIOA->BSRRH = (uint16_t)(~VALUE & 0x000000ff); \ } void main() { for( i = 8; i < 255; i++ ) { WRITE_TFT_DATA_PINS(i); } }
code2
void main() { for( i = 8; i < 255; i++ ) { GPIOA->BSRRL = (uint16_t)( VALUE & 0x000000ff); GPIOA->BSRRH = (uint16_t)(~VALUE & 0x000000ff); } }
Now on checking freq on PA7 pin for code 1 = 55Khz & for code 2 = 65Khz (approx.)
I checked the preprocessor file of both code, both are almost same code1
while(1) { uint32_t i; for( i = 8; i < 255; i++ ) { { ((GPIO_TypeDef *) ((((uint32_t)0x40000000) + 0x00020000) + 0x0000))->BSRRL = (uint16_t)( i & 0x000000ff); (GPIO_TypeDef *) ((((uint32_t)0x40000000) + 0x00020000) + 0x0000))->BSRRH = (uint16_t)(~i & 0x000000ff); }; } }
while(1) { uint32_t i; for( i = 8; i < 255; i++ ) { ((GPIO_TypeDef *) ((((uint32_t)0x40000000) + 0x00020000) + 0x0000))->BSRRL = (uint16_t)( i & 0x000000ff); ((GPIO_TypeDef *) ((((uint32_t)0x40000000) + 0x00020000) + 0x0000))->BSRRH = (uint16_t)(~i & 0x000000ff); } }
Then i checked its disassembly , after for loop:
0x0800020E 2008 MOVS r0,#0x08 0x08000210 B2C2 UXTB r2,r0 0x08000212 830A STRH r2,[r1,#0x18] 0x08000214 43C2 MVNS r2,r0 0x08000216 B2D2 UXTB r2,r2 0x08000218 834A STRH r2,[r1,#0x1A] 0x0800021A 1C40 ADDS r0,r0,#1 0x0800021C 28FF CMP r0,#0xFF 0x0800021E D3F7 BCC 0x08000210 0x08000220 E7F5 B 0x0800020E
0x0800021A 2109 MOVS r1,#0x09 0x0800021C B2CA UXTB r2,r1 0x0800021E 8302 STRH r2,[r0,#0x18] 0x08000220 43CA MVNS r2,r1 0x08000222 B2D2 UXTB r2,r2 0x08000224 8342 STRH r2,[r0,#0x1A] 0x08000226 1C4A ADDS r2,r1,#1 0x08000228 B2D4 UXTB r4,r2 0x0800022A 8304 STRH r4,[r0,#0x18] 0x0800022C 43D2 MVNS r2,r2 0x0800022E B2D2 UXTB r2,r2 0x08000230 8342 STRH r2,[r0,#0x1A] 0x08000232 1C89 ADDS r1,r1,#2 0x08000234 29FF CMP r1,#0xFF 0x08000236 D3F1 BCC 0x0800021C 0x08000238 E7EC B 0x08000214
My question is when both coeds are same except define which I don't think should change the code assembly. Also optimzation and other parameter are same for both