C语言实现自动分配地址的示例

 更新时间:2024年11月26日 10:26:07   作者:电脑玩家饮水机  
本文介绍了两种自动分配地址的方法,包括通过宏定义实现地址分配和将EE地址作为一个结构体,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.背景介绍

在我们嵌入式软件开发工作中,地址分配是很重要的一部分内容,而本文要介绍的自动分配地址方法的优点有两个。

(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语言 自动分配地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言驱动开发之内核通过PEB获取进程参数

    C语言驱动开发之内核通过PEB获取进程参数

    PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息。本文将通过PEB实现获取进程参数,感兴趣的小伙伴可以了解一下
    2022-10-10
  • QML与C++几种交互方式

    QML与C++几种交互方式

    QML作为构建界面的语言是非常简洁的,但是界面的后台有些时候是经常要与C++交互的,本文主要介绍了QML与C++几种交互方式,感兴趣的可以了解一下
    2024-04-04
  • c语言中main函数用法及知识点总结

    c语言中main函数用法及知识点总结

    在本篇文章里小编给大家分享的是一篇关于c语言中main函数用法及知识点总结内容,有需要的朋友们可以跟着学习参考下。
    2021-10-10
  • c语言实现找最大值最小值位置查找

    c语言实现找最大值最小值位置查找

    这篇文章主要介绍了c语言实现找最大值最小值位置查找,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C++ Boost EnableIf函数使用介绍

    C++ Boost EnableIf函数使用介绍

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言实现数据结构迷宫实验

    C语言实现数据结构迷宫实验

    这篇文章主要为大家详细介绍了C语言实现数据结构迷宫实验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C语言实现学生信息管理系统开发

    C语言实现学生信息管理系统开发

    这篇文章主要为大家详细介绍了C语言实现学生信息管理系统开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 一文详解C++中运算符的使用

    一文详解C++中运算符的使用

    这篇文章主要为大家详细介绍了C++中运算符的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-05-05
  • Opencv LBPH人脸识别算法详解

    Opencv LBPH人脸识别算法详解

    这篇文章主要为大家详细介绍了Opencv LBPH人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 一起来学习C++的动态内存管理

    一起来学习C++的动态内存管理

    这篇文章主要为大家详细介绍了C++的动态内存管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论