C语言实现自动分配地址的示例
一.背景介绍
在我们嵌入式软件开发工作中,地址分配是很重要的一部分内容,而本文要介绍的自动分配地址方法的优点有两个。
(1)在两个已分配地址的数据中给新数据分配地址时修改点较少。
(2)被分配的地址之间不易冲突,不会产生越界的错误。
二.应用举例
比如我们当前想实现的功能是是把几个不同的数据存储到EEPROM里面,存储的数据分别叫做数据1,数据2,数据3。它们3个数据分别占用100个字节的大小。存储的基地址是0,那么常规思路如下:
//数据长度 #define LEN_FIRST_DATA 100 #define LEN_SECOND_DATA 100 #define LEN_THIRD_DATA 100 //数据地址 #define ADR_FIRST_DATA 0 #define ADR_SECOND_DATA 100 #define ADR_THIRD_DATA 200
如果我们想在在两个数据的中插入新的数据,那么就需要修改插入新数据之后的所有宏,这样处理造成的问题是当宏的数量过多会极大地浪费时间,因此我们实际工作中采用自动分配地址的写法来避免这种问题。
1. 自动分配地址写法一
我们可以在宏定义时让第一个的数据的地址 = 基地址 ,第二个的数据的地址 = 第一个数据的地址 + 第一个数据的长度,第三个的数据的地址 = 第二个数据的地址 + 第二个数据的长度,依次类推。这样在插入新元素时就只需修改两处即可。
//数据长度 #define LEN_FIRST_DATA 100 #define LEN_SECOND_DATA 100 #define LEN_THIRD_DATA 100 //数据地址 #define ADR_BASE_DATA 0 #define ADR_FIRST_DATA ADR_BASE_DATA #define ADR_SECOND_DATA ADR_FIRST_DATA + LEN_FIRST_DATA #define ADR_THIRD_DATA ADR_SECOND_DATAZ + LEN_SECOND_DATA
2. 自动分配地址写法二
还有一种更加明智的写法,就是将EE地址整体作为一个结构体,然后使用强制转换的技巧就可以直接获取分配好的数据地址数据,具体写法如下。
typedef struct { unsigned char _FirstData[100]; unsigned char _SecondData[100]; unsigned char _ThirdData[100]; }St_Data #define GET_ADDR(data) ((unsigned int)&((St_Data*)ADR_BASE_DATA)->data))
这样写的话读取EE地址只需要调用GET_ADDR(data)即可,这个宏的作用就是通过数据直接返回一个4字节unsigned int类型的地址,比如我们想获取第一个数据的EE地址,就可以直接调用GET_ADDR(_FirstData)。
从我个人来说的话第二种方法更好,不仅省去了大量的宏定义,而且插入新元素时的修改点只有一处,代码的可读性也更好。
到此这篇关于C语言实现自动分配地址的示例的文章就介绍到这了,更多相关C语言 自动分配地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论