减小code体积的书写习惯
1. 减少使用switch
2. 函数内部尽量使用内部变量,减少使用全局变量的次数
void func(void){ uint32_t sysclk;
... // 其他代码
rccClocks.SYSCLK = sysclk; #if 1 // Code (inc. data) RO Data RW Data ZI Data Debug Object Name // 416 34 40 0 28 289466 rcc.o rccClocks.AHBCLK = sysclk / rccGetAHB_DIV(); #else // Code (inc. data) RO Data RW Data ZI Data Debug Object Name // 420 36 40 0 28 289466 rcc.o rccClocks.AHBCLK = rccClocks.SYSCLK / rccGetAHB_DIV(); #endif }
3. 尽量使用memset复位较多的数据:
#if 1 //Code (inc. data) RO Data RW Data ZI Data Debug Object Name // 416 34 40 0 28 289474 rcc.o memset(&rccClocks, 0, sizeof(rccClocks)); // 与size无关
// 416 34 40 0 28 289474 rcc.o
// memset(&rccClocks, 0, 32);
// 416 34 40 0 28 289474 rcc.o
// memset(&rccClocks, 0, 100); #else // Code (inc. data) RO Data RW Data ZI Data Debug Object Name // 440 36 40 0 28 289486 rcc.o rccClocks.PLLCLK = 0; rccClocks.APBCLK[0] = 0; rccClocks.AHBCLK = 0; rccClocks.TIMCLK[0] = 0; rccClocks.APBCLK[1] = 0; rccClocks.SYSCLK = 0; rccClocks.TIMCLK[1] = 0; #endif
// 416 36 40 0 28 289486 rcc.o
rccClocks.PLLCLK = 0;
rccClocks.AHBCLK = 0;
4. 避免使用do-while(0)
#if 0 // 416 34 40 0 28 289470 rcc.o rccClocks.APBCLK[1] = apbclk; #elif 0 // 424 36 40 0 28 289482 rcc.o do { rccClocks.APBCLK[1] = apbclk; } while (0); #elif 0 // 416 34 40 0 28 289478 rcc.o rccClocks.APBCLK[1] = apbclk; struct empty { }; #else // 416 34 40 0 28 289474 rcc.o { rccClocks.APBCLK[1] = apbclk; }; #endif
可用inline函数替代:
#if 1 // 408 34 40 0 28 289422 rcc.o static inline uint32_t APB_DIV_SEL(uint32_t n) { if (n & 0x04) { n ^= 0x04; return (1 << (1 + n)); } else { return 1; } } #else // 408 34 40 0 28 289358 rcc.o # define APB_DIV_SEL(n) (((n)&0x04) ? (1 << (1 + (n ^ 0x04))) : 1) #endif
#if 0 // 416 34 40 0 28 289466 rcc.o return (1 << (1 + index)); } else { return 1; } #else // 416 36 40 0 28 289466 rcc.o index += 1; } else { index = 0; } return (1 << index); #endif
#if 0 // 416 34 40 0 28 289466 rcc.o index ^= 0x04; #else // 420 34 40 0 28 289466 rcc.o index &= ~0x04; #endif