有没有一种宏定义,可以实现每次使用后其定义的值能增加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条回答
落叶知秋
1楼-- · 2019-12-21 02:31
宏定义嵌套:
#define Addr_m   (0)
#define Addr_n    (Addr_m+m)
#define Addr_z    (Addr_n+n)
#define Addr_i    (Addr_z+z)
在中间插入比如p的地址,则
#define Addr_m   (0)
#define Addr_n    (Addr_m+m)
#define Addr_p    (Addr_n+n)
#define Addr_z    (Addr_p+p)
#define Addr_i    (Addr_z+z)
然后,直接
{MemAdr_m,  &u8EERam[Addr_m],         m},
{MemAdr_n,  &u8EERam[Addr_n],          n},
{MemAdr_p,  &u8EERam[Addr_p],          p},
{MemAdr_z,  &u8EERam[Addr_z],          z},
{MemAdr_i,  &u8EERam[Addr_i],           i},
hefq
2楼-- · 2019-12-21 08:27
 精彩回答 2  元偷偷看……
gushuailove
3楼-- · 2019-12-21 12:45
我们公司用excel自动生成的
擦鞋匠
4楼-- · 2019-12-21 15:18
我尝试写了一个,似乎可以使用,您看看:

000.png (26.54 KB, 下载次数: 0)

下载附件

2018-3-28 19:47 上传

擦鞋匠
5楼-- · 2019-12-21 17:49
擦鞋匠 发表于 2018-3-28 19:48
我尝试写了一个,似乎可以使用,您看看:

似乎去掉##也可以,如下
  1. #define ADDR(incr) ((uint8_t *)(&mem[(width+=incr, width)]))
复制代码
q457344370
6楼-- · 2019-12-21 21:30
楼上的是在运行时计算的,想要编译时计算可以先定义一个结构体,然后用offsetof计算偏移地址,这个可以在编译的时候就算出来了

一周热门 更多>