以下是一个MEMORY字段分配的设想:
将Memory的物理地址映射到自定义逻辑地址
逻辑地址按Memory的Block对齐,逻辑地址从0开始
用户数据按逻辑地址分配
应用接口按实际内容大小操作
底层接口根据逻辑地址对齐读写Memory
我想定义一些内容条目,这些条目分别对应不同的内存地址,不同的长度,以后有需要还可以继续从后面添加就这样:
entry name address
size
ID_DATA1 0
8
ID_DATA2 8
8
ID_DATA3 16
16
...
可以在一个头文件里面做这样的定义
- <p>// defines.h</p><p>#ifdef ENTRY_ID</p><p> #define ENTRY(id,addr,size) id,</p><p> #undef ENTRY</p><p> #undef ENTRY_ID</p><p>#endif</p><p>
- </p><p>#ifdef ENTRY_ADDR</p><p> #define ENTRY(id,addr,size) addr,</p><p> #undef ENTRY</p><p> #undef ENTRY_ADDR</p><p>#endif</p><p>
- </p><p>#ifdef ENTRY_SIZE</p><p> #define ENTRY(id,addr,size) size,</p><p> #undef ENTRY</p><p> #undef ENTRY_SIZE</p><p>#endif</p>
接着在C文件里面这么玩
- <p>// memory.c</p><p>#define ALL_ENTRIES() \</p><p> ENTRY(ID_DATA1, 0, 8) \</p><p> ENTRY(ID_DATA2, 8, 8) \</p><p> ENTRY(ID_DATA3, 16, 16) \</p><p> ENTRY(ID_DATA4, 32, 8)</p><p>
- </p><p>#define ENTRY_ID</p><p>#include "defines.h"</p><p>typedef enum</p><p>{</p><p> ALL_ENTRIES()</p><p> MEM_ID_MAX</p><p>} MEM_ID;</p><p>
- </p><p>#define ENTRY_ADDR</p><p>#include "defines.h"</p><p>const uint32_t mem_addr[] =</p><p>{</p><p> ALL_ENTRIES()</p><p>};</p><p>
- </p><p>#define ENTRY_SIZE</p><p>#include "defines.h"</p><p>const uint16_t mem_size[] =</p><p>{</p><p> ALL_ENTRIES()</p><p>};</p><p></p>
你也许会反问我,定义一个结构体不就搞定了吗?
别急,这样做的好处是enum的ID顺序跟addr和size是一一对应的,不会错乱,另一个好处是,可以随便在ALL_ENTRIES()下面扩展条目,也不影响ID的对应关系。
如果用结构体去定义的话,也很好,但是会增加数组遍历时间,如果是很庞大的条目数的话,这个效率问题就要考虑了。
|