MicroBlaze中C代码编译后文件elf过大问题

在设计Microblaze时,C代码太大,导致使用外部1Mbit(即128KB)的SRAM也放不下。

查看编译结果的代码段:

dec表示text、data和bss的总大小的十进制表示,

dec表示text、data和bss的总大小的十六进制表示;

先通过查看资料学习text、data和bss的各个意义:《text段、data段和bss段介绍》。

程序编译后生成的目标文件至少含有三个段,分别为:.text、.data和.bss。这三个段的大致结构图如下所示:

text即为代码段,为只读。

bss段包含程序中未初始化的全局变量和static变量。

data段包含三个部分:heap(堆)、stack(栈)和静态数据区。

当程序在执行时动态分配空间(C中的malloc函数),所分配的空间就属于heap。其概念与数据结构中“堆”的概念不同。

stack段存放函数内部的变量、参数和返回地址,其在函数被调用时自动分配,访问方式就是标准栈中的LIFO方式。(因为函数的局部变量存放在此,因此其访问方式应该是栈指针加偏移的方式,否则若通过push、pop操作来访问相当麻烦)

data段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。

通过对text、data和bss的了解,自己的Microblaze代码bss段比较大,解决的思路从“bss段包含程序中未初始化的全局变量和static变量”来查找。

另外,将printf该用xil_printf可以再很大程度上减少代码编译后的大小。

 

未经允许不得转载:TacuLee » MicroBlaze中C代码编译后文件elf过大问题

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址