我想了解arduino函数digitalWrite
的实际工作原理。但是当我查找该函数的源代码时,发现它充满了宏定义,而这些宏定义本身又是基于其他宏定义。为什么会以这种方式构建代码,而不是使用一个函数?这是编程风格不佳还是在C语言中正确的做法?
例如,digitalWrite
包含宏定义digitalPinToPort
。
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
而 pgm_read_byte
是一个宏:
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
而pgm_read_byte_near
是一个宏:
#define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))
而 __LPM
是一个宏:
#define __LPM(addr) __LPM_classic__(addr)
而 __LPM_classic__
是一个宏:
#define __LPM_classic__(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint8_t __result; \
__asm__ __volatile__ \
( \
"lpm" "\n\t" \
"mov %0, r0" "\n\t" \
: "=r" (__result) \
: "z" (__addr16) \
: "r0" \
); \
__result; \
}))
虽然不是直接相关的内容,但我认为双下划线应该只由编译器使用。在 LPM
前缀加上 __
是否妥当?