This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:.map 文件和 RAM/ROM 管理

Guru**** 2460850 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/649713/tm4c123gh6pm-map-file-and-ram-rom-management

器件型号:TM4C123GH6PM

您好!

我正在进行一个项目、我希望使用剩下的 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 文件中进行说明?

请您回答所有这些疑问、因为我无法在网上找到答案。 谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没有人可以帮助我?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    向上向上
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请说明您使用的编译器和链接器。 输出看起来与来自 TI 编译器/链接器的输出不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用的是 Keil man、但我认为.map 文件在任何地方都具有相同的概念  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查看您的初始帖子:

    您会问:"为什么 RAM 具有(0大小)"-但您的粘贴(上面)未显示大小为0x0000.0060?     您知道/意识到 MCU 的 SRAM 起始值@ 0x2000.0000  -您不知道吗?

    对您的问题6 -这肯定是一个有效的问题-但您不能设计一个小型、简单的程序-并自行制定答案?

    您会注意到、"无法在线查找"-但您搜索的"在线方式和地点"将被保留。    Keil 的论坛是否可以证明是一个值得审查的场所-甚至是问题?

    不同供应商之间的映射文件可能不会如您所希望的那样完全相同和一致...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    映射文件的概念实际上是相同的、但我无法评论 Keil 工具为什么报告 rw-data=0。 我使用 TI 工具构建了相同的简单程序、并获得了以下内存使用情况:

    名称 原点长度 已使用 未使用的属性填充
    --- ---- ------ ---- ---- --------
    闪存 00000000 00040000 00000538 0003fac8 R X
    SRAM 20000000 00008000 00000218 00007de8 RW X
    

    在0x218字节 RAM 中、0x200是栈、其他0x18字节来自运行时支持库、该库支持器件初始化和任何函数的注册、以便在退出时执行。 没有为您提供的简单代码分配任何 RAM。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user5175619"]我使用的是 Keil man,但我认为.map 文件在任何地方都具有相同的概念 

    概念 相同、实际输出格式和所用术语不一定相同。

    更重要的是、映射文件是一个输出、它不控制链接和定位过程。 这将由不同的文件完成、并且因供应商而异、其格式可能差异很大。 查找文件的复杂性和功能尤其不同。 链接文件也各不相同、但也不尽相同。

    Robert