您好!
我正在进行一个项目、我希望使用剩下的 RAM 块作为备用存储、用于表示我正在制作的物联网设备中的电气行为的数据。
下面的部分只是为了说明我的问题:
STACK_SIZE equ 0x00007830 区域堆栈、NOINIT、READWRITE、ALIGN=3 Stack_Mem Space Stack_size __initial_sp ; 堆配置 ; 堆大小(以字节为单位)<0x0-0xFFFFFFFF:8> ; heap_size equ 0x000007D0 区域堆、NOINIT、READWRITE、align=3 _heap_base
#include int x=5; void SystemInit (void) {} int main (void) { char d=5; }
程序大小:code=532 RO-data=636 RW-data=0 Zi-data=32864
所以我想使用 RAM 中的所有可用内容,所以在启动文件 i allocat3d (30768字节的堆栈(0x7830)... 堆中的2000字节(0x7D0))
1-第一个问题是这样告诉编译器我可以使用32k ram?
2–那么为什么 RW-DATA = 0? 我已经在这里定义并启动了一个局部变量和一个全局变量、该变量应该保存在堆栈中吗? RW 数据表示 RAM 中的数据、对吧?
3 -如果我在启动文件中分配0堆栈和0堆、我仍然会看到+500字节的 Zi 数据、它们来自哪里? 示例中的 Zi 数据如何超过32768的血管容积,即 RAM 的总容量? 也许编译器 Zero 会初始化闪存 ROM 中的一些数据?
基本而言、如何知道哪些数据代表 RAM、哪些数据代表 ROM? 我知道代码保存在 ROM 中、RO 数据也保存在 ROM 中、RW 数据全部保存在 RAM 中、我认为 Zi 数据可以保存在这两个文件中。 我在映射文件中也看到了这一点
" 总 RW 大小(RW 数据+ Zi 数据) 32864 ( 32.09kB)"
4 -这意味着可能可以将 RW 数据保存在闪存中? 当我声明 只有2个变量并且没有在启动文件中分配额外的 RAM 时、RW 数据如何超过32kB?
在下图中:
图像 入口点的存储器映射:0x000002ed 加载区域 LR_1 (基地址:0x00000000、大小:0x00000490、最大值:0xFFFFFFFF、绝对值) 执行区域 ER_RO (基地址:0x00000000、大小:0x00000490、最大值:0xFFFFFFFF、绝对值) 基本地址大小 键入 Attr IDX E 段名 物体 0x00000000 0x0000026c 数据 RO 3复位 startup_tm4c123.o 0x0000026c 0x00000008代码 RO 34 *!!!main c_w.l (_main.o) 0x00000274 0x00000034代码 RO 188!!!散射 c_w.l (__s散 射.o) 0x000002a8 0x0000001c 代码 RO 190!!handler_zi c_w.l (__s散 射_zi.o) 0x000002c4 0x00000002代码 RO 61 .arm.collect$libinIT$$00000000 c_w.l (libinIT.o) 0x000002c6 0x00000000代码 RO 68 .arm.collect$libinit$$00000002 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 71 .arm.collect$libinit$00000008 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 73 .arm.collect$libinit$0000000A c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 75 .arm.collect$libinit$0000000C c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 78 .arm.collect$libinit$0000000F c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 80 .arm.collect$libinit$00000011 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 82 .arm.collect$libinit$00000013 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 84 .arm.collect$libinit$00000015 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 86 .arm.collect$libinit$00000017 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 88 .arm.collect$libinit$00000019 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 90 .arm.collect$libinit$0000001B c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 92 .arm.collect$libinit$0000001D c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 94 .arm.collect$libinit$0000001F c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 96 .arm.collect$libinit$00000021 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 98 .arm.collect$libinit$00000023 c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 102 .arm.collect$libinit$0000002A c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 104 .arm.collect$libinit$0000002C c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 106 .arm.collect$libinit$0000002E c_w.l (libinit2.o) 0x000002c6 0x00000000代码 RO 108 .arm.collect$libinit$00000030 c_w.l (libinit2.o) 0x000002c6 0x00000002代码 RO 109 .arm.collect$libinit$00000031 c_w.l (libinit2.o) 0x000002c8 0x00000002代码 RO 129 .arm.collect$libshutdown $$00000000 c_w.l (libshutdown。o) 0x000002ca 0x00000000代码 RO 143 .arm.collect$libshutdown $00000003 c_w.l (libshutdown2.o) 0x000002ca 0x00000000代码 RO 146 .arm.collect$libshutdown $00000006 c_w.l (libshutdown2.o) 0x000002ca 0x00000000代码 RO 149 .arm.collect$libshutdown $00000009 c_w.l (libshutdown2.o) 0x000002ca 0x00000000代码 RO 151 .arm.collect$libshutdown $0000000B c_w.l (libshutdown2.o) 0x000002ca 0x00000000代码 RO 154 .arm.collect$libshutdown $0000000E c_w.l (libshutdown2.o) 0x000002ca 0x00000002代码 RO 155 .arm.collect$libshutdown $$0000000F c_w.l (libshutdown2.o) 0x000002cc 0x00000000代码 RO 36 .arm.collect$rtentry$$00000000 c_w.l (rtentry.o) 0x000002cc 0x00000000代码 RO 38 .arm.collect$rtentry$$00000002 c_w.l (rtentry2.o) 0x000002cc 0x00000006代码 RO 50 .arm.collect$rtentry$$00000004 c_w.l (rtentry4.o) 0x000002d2 0x00000000代码 RO 40 .arm.collect$rtentry$$00000009 c_w.l (rtentry2.o) 0x000002d2 0x00000004代码 RO 41 .arm.collect$rtentry$$0000000A c_w.l (rtentry2.o) 0x000002d6 0x00000000代码 RO 43 .arm.collect$rtentry$$0000000C c_w.l (rtentry2.o) 0x000002d6 0x00000008代码 RO 44 .arm.collect$rtentry$$0000000D c_w.l (rtentry2.o) 0x000002DE 0x00000002代码 RO 65 .arm.collect$rtexit$00000000 c_w.l (rtexit.o) 0x000002e0 0x00000000代码 RO 111 .arm.collect$rtexit$$00000002 c_w.l (rtit2.o) 0x000002e0 0x00000004代码 RO 112 .arm.collect$rtexit$$00000003 c_w.l (rtit2.o) 0x000002e4 0x00000006代码 RO 113 .arm.collect$rtexit$$00000004 c_w.l (rtit2.o) 0x000002ea 0x00000002焊盘 0x000002ec 0x00000118代码 RO 4 *.text startup_tm4c123.o 0x00000404 0x00000008代码 RO 10 .text main.o 0x0000040c 0x00000006代码 RO 32 .text c_w.l (heapauxi.o) 0x00000412 0x0000004a 代码 RO 52 .text c_w.l (sys_stackheap_exple.o) 0x0000045c 0x0000000c 代码 RO 54 .text c_w.l (exit.o) 0x00000468 0x00000008代码 RO 62 .text c_w.l (libspace.o) 0x00000470 0x0000000c 代码 RO 121.text c_w.l (sys_exit.o) 0x0000047c 0x00000002代码 RO 132.text c_w.l (use_no_semi) 0x0000047e 0x00000000代码 RO 134.text c_w.l (inding_semi) 0x0000047e 0x00000002焊盘 0x00000480 0x00000010数据 RO 186个地区$$表 Anon $obj.o
据我所知、ROM 从0x0开始、这里最后使用的地址是0x480 、大小是(0x490=1168字节)、这确认了.map 文件最后一节中提到的 ROM 的大小
那么、如果我们在这里遵循相同的概念
执行区域 ER_RW (基地址:0x20000000、大小:0x00000000、最大值:0xFFFFFFFF、绝对值) ****未将任何段分配给此执行区域**** 执行区域 ER_ZI (基地址:0x20000000、大小:0x00008060、最大值:0xFFFFFFFF、绝对值) 基本地址大小 键入 Attr IDX E 段名 物体 0x20000000 0x00000060 Zero RW 63.bss c_w.l (libspace.o) 0x20000060 0x000007d0零 RW 2个堆 startup_tm4c123.o 0x20000830 0x00007830零 RW 1个堆栈 startup_tm4c123.o
5-if RW 是 RAM 的大小、为什么即使我声明了变量、它也具有0大小? ER_Zi 数据位于何处? 正如我在上面解释的那样、它们基本上占据了比可用 RAM 更大的块。
6 -一旦有人在这里解释了 RAM 大小、这里的总 RAM 大小是否将包括嵌套在主函数中的那些函数、或者即使有一个函数调用5个其他函数、这个 RAM 大小是否包括所有可能在 RAM 中静态使用的数据? (现在不讨论动态分配)、因为据我所知、当函数结束时、它会释放 RAM 中的空间、但这将如何在.map 文件中进行说明?
请您回答所有这些疑问、因为我无法在网上找到答案。 谢谢