|
偶然间翻看 Arduino 访问 AVR-EEPROM 库源码,发现其 C++ 运算符重载封装非常巧妙,特来分享之。
从 Arduino IDE 当中拷贝出源码如下(C++):
对比几种常见的 EEPROM 访问方式,可以看到封装的魔力。
假定有需求:读取 EEPROM-04H 的字节,加 1 以后存入 EEPROM-08H 位置。
访问方式1(C寄存器),对于 AVR 来说就是 EEAR EEDR EECR 三个寄存器转来转去:
EEAR= 0x04;
EECR= ...;
unsigned char tmp= EEDR;
EEAR= 0x08;
EEDR= tmp+1;
EECR= ...;
访问方式2(C库),C库封装屏蔽了寄存器内容,但是引入了读写函数:
EEPROMwrite(0x08, EEPROMread(0x04) +1);
访问方式3(C++库),C++库连读写函数都屏蔽了,只剩下 C 样子的运算符:
EEPROM[0x08]= EEPROM[0x04] +1;
上述访问方式 3,就是 Arduino 进行 C++ 封装后的样子,全局出现了一个 EEPROM 数组,可以使用 [ ] 对其元素进行赋值、运算、比较。
C指针无法解决的问题(EEPROM 地址空间与 RAM 不通用),放在 C++ 里配合运算符重载,分分钟把 EEPROM 抽象成一个广义数组。
说是封装的过程晦涩难懂(可以去看源码,一眼望去简直天书),但用起来简直返璞归真。
这里还只是 AVR 片上的 EEPROM 访问,从寄存器一路封装到原始运算符;
如果是 24C01 这样 I2C 器件,做成 C 库后再重载 C++ 运算符,直接就是硬件抽象层(HAL),应用层代码一行不改。
-------------------------------------------------------------------------------------------------------------------------
以上,分享 Arduino 访问 AVR-EEPROM 的 C++ 库,其运算符重载非常巧妙可供借鉴。个人一点愚见,欢迎大家指点。
最后祝大家身体健康,工作顺利!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|