有没有一种宏定义,可以实现每次使用后其定义的值能增加n

2019-12-20 21:37发布

想法是把RAM中的数据映射到外部存储器中,需要建立一个表来存储外设地址与RAM地址及数据宽度的关系。

uint8_t u8EERam[x];
Matrix[n] =
{
        //外设地址------RAM地址----------数据宽度
        {MemAdr0,  &u8EERam[0],         m},
        {MemAdr1,  &u8EERam[m],        n},
        {MemAdr2,  &u8EERam[m+n],     z},
        {MemAdr3,  &u8EERam[m+n+z],  i},
        .....
}

但是很多时候在关系表建立完成后,又需要在某个地址插入一个新的值,例如需要在{MemAdr0,  &u8EERam[0],         m}之后插入一个新的值,那这时候就需要把后面的所有地址计算都重写一遍,费时还容易出错。
有没有一种宏定义能够替代&u8EERam[m+n+z],每次使用这个宏后,其所定义的值能自动增加,就能省去了手工计算的过程。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
liansh2002
1楼-- · 2019-12-22 21:08
擦鞋匠 发表于 2018-3-28 19:48
我尝试写了一个,似乎可以使用,您看看:

感谢感谢,不过确实您的这个方法只能在执行时用,不能再编译时使用
liansh2002
2楼-- · 2019-12-22 21:35
canspider 发表于 2018-3-28 20:24
可以,用boost_pp里面的array和iterator就行

哈哈,boost_pp去google了一下,真是个神奇的东西,完全就是把宏当成了另外一种语言来使用,时间允许了要好好学习一下
liansh2002
3楼-- · 2019-12-23 03:24
经过7楼和9楼兄弟的提醒,既然关系表里面没法宏定义实现,那就曲线救国改RAM中的定义,成功实现功能,代码如下
typedef struct{
        uint16_t u16A;
        uint16_t u16B;
        ......
}VALUE;
VALUE var = {
        .u16A = 1,
        .u16B = 2,
        ......
};
Matrix[x] = {
        //外设地址--------------RAM地址----------------------------数据宽度
        {MemAdr0,  &var + offsetof(VALUE, u16A ),   sizeof(var.u16A)},
        {MemAdr1,  &var + offsetof(VALUE, u16B ),   sizeof(var.u16B)},
        ......
};
q457344370
4楼-- · 2019-12-23 05:29
liansh2002 发表于 2018-3-29 10:43
经过7楼和9楼兄弟的提醒,既然关系表里面没法宏定义实现,那就曲线救国改RAM中的定义,成功实现功能,代码 ...

你可以把offsetof(VALUE, u16A ),   sizeof(var.u16A)也改成宏,更不容易出错
shian0551
5楼-- · 2019-12-23 06:20
 精彩回答 2  元偷偷看……
落叶知秋
6楼-- · 2019-12-23 11:24
q457344370 发表于 2018-3-28 20:03
楼上的是在运行时计算的,想要编译时计算可以先定义一个结构体,然后用offsetof计算偏移地址,这个可以在编 ...

offsetof这个宏第一次接触,学到了,哈哈

一周热门 更多>