如何使两个本质相同的指针类型具备不兼容性?
哈佛架构下的存储空间专属指针(以MPLAB C18为例)
做嵌入式开发尤其是接触哈佛架构CPU的朋友,肯定碰到过这种情况:明明都是同类型的数据,却要给指针加不同的存储空间标记——毕竟哈佛架构把ROM(程序存储)和RAM(数据存储)物理分开了,编译器得靠不同的指针类型来区分访问的是哪块区域。
曾经针对PIC器件的MPLAB C18编译器(现已停用)就用了这种非常直观的自定义指针语法,比如常见的写法:
uint8_t const ram* data1; uint8_t const rom* data2;
这里的ram和rom是编译器扩展的关键字,用来明确指针指向的存储空间:
data1是一个指向RAM中常量uint8_t的指针data2是一个指向ROM中常量uint8_t的指针
更有意思的是它还支持多层嵌套的指针定义,比如这个看起来有点绕的写法:
char const rom* ram* ram strdptr;
咱们拆解一下它的含义,从外到内看:
- 最末尾的
ram表示strdptr本身是存放在RAM里的指针 - 中间的
ram*表示它指向的是另一个同样存放在RAM里的指针 - 最内层的
const rom*表示这个二级指针最终指向的是ROM里的常量字符串
简单总结就是:RAM中的指针 → RAM中的指针 → ROM中的字符串。
内容的提问来源于stack exchange,提问作者Jubatian
相关产品推荐
相关产品推荐

