C語(yǔ)言實(shí)現(xiàn)自動(dòng)分配地址的示例
一.背景介紹
在我們嵌入式軟件開(kāi)發(fā)工作中,地址分配是很重要的一部分內(nèi)容,而本文要介紹的自動(dòng)分配地址方法的優(yōu)點(diǎn)有兩個(gè)。
(1)在兩個(gè)已分配地址的數(shù)據(jù)中給新數(shù)據(jù)分配地址時(shí)修改點(diǎn)較少。
(2)被分配的地址之間不易沖突,不會(huì)產(chǎn)生越界的錯(cuò)誤。
二.應(yīng)用舉例
比如我們當(dāng)前想實(shí)現(xiàn)的功能是是把幾個(gè)不同的數(shù)據(jù)存儲(chǔ)到EEPROM里面,存儲(chǔ)的數(shù)據(jù)分別叫做數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3。它們3個(gè)數(shù)據(jù)分別占用100個(gè)字節(jié)的大小。存儲(chǔ)的基地址是0,那么常規(guī)思路如下:
//數(shù)據(jù)長(zhǎng)度 #define LEN_FIRST_DATA 100 #define LEN_SECOND_DATA 100 #define LEN_THIRD_DATA 100 //數(shù)據(jù)地址 #define ADR_FIRST_DATA 0 #define ADR_SECOND_DATA 100 #define ADR_THIRD_DATA 200
如果我們想在在兩個(gè)數(shù)據(jù)的中插入新的數(shù)據(jù),那么就需要修改插入新數(shù)據(jù)之后的所有宏,這樣處理造成的問(wèn)題是當(dāng)宏的數(shù)量過(guò)多會(huì)極大地浪費(fèi)時(shí)間,因此我們實(shí)際工作中采用自動(dòng)分配地址的寫法來(lái)避免這種問(wèn)題。
1. 自動(dòng)分配地址寫法一
我們可以在宏定義時(shí)讓第一個(gè)的數(shù)據(jù)的地址 = 基地址 ,第二個(gè)的數(shù)據(jù)的地址 = 第一個(gè)數(shù)據(jù)的地址 + 第一個(gè)數(shù)據(jù)的長(zhǎng)度,第三個(gè)的數(shù)據(jù)的地址 = 第二個(gè)數(shù)據(jù)的地址 + 第二個(gè)數(shù)據(jù)的長(zhǎng)度,依次類推。這樣在插入新元素時(shí)就只需修改兩處即可。
//數(shù)據(jù)長(zhǎng)度 #define LEN_FIRST_DATA 100 #define LEN_SECOND_DATA 100 #define LEN_THIRD_DATA 100 //數(shù)據(jù)地址 #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. 自動(dòng)分配地址寫法二
還有一種更加明智的寫法,就是將EE地址整體作為一個(gè)結(jié)構(gòu)體,然后使用強(qiáng)制轉(zhuǎn)換的技巧就可以直接獲取分配好的數(shù)據(jù)地址數(shù)據(jù),具體寫法如下。
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地址只需要調(diào)用GET_ADDR(data)即可,這個(gè)宏的作用就是通過(guò)數(shù)據(jù)直接返回一個(gè)4字節(jié)unsigned int類型的地址,比如我們想獲取第一個(gè)數(shù)據(jù)的EE地址,就可以直接調(diào)用GET_ADDR(_FirstData)。
從我個(gè)人來(lái)說(shuō)的話第二種方法更好,不僅省去了大量的宏定義,而且插入新元素時(shí)的修改點(diǎn)只有一處,代碼的可讀性也更好。
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)自動(dòng)分配地址的示例的文章就介紹到這了,更多相關(guān)C語(yǔ)言 自動(dòng)分配地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 實(shí)現(xiàn)帶監(jiān)視哨的順序查找算法
這篇文章主要介紹了C++ 實(shí)現(xiàn)帶監(jiān)視哨的順序查找算法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明
這篇文章主要介紹了C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法
這篇文章主要介紹了Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法,分析了GDI貼圖閃爍的常見(jiàn)原因及其具體解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01C語(yǔ)言學(xué)習(xí)之條件和?if...else語(yǔ)句詳解
這篇文章主要給大家介紹了C語(yǔ)言中的條件和?if...else語(yǔ)句,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12C/C++編譯報(bào)錯(cuò)printf was not declared in 
這篇文章主要介紹了C/C++編譯報(bào)錯(cuò)printf was not declared in this scope問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04