DSP芯片CMD文件中各段的实验验证(下)

来源:互联网 发布:算法研究员是做什么 编辑:程序博客网 时间:2024/05/16 00:49

接上文。
4、验证.const段和.econst段(因为两个段基本上是一样的,所以只验证.econst一个段。)
.const 显式初始化的全局和静态的const变量和字符串常量 不超过64K长度
.econst长调用的常量 数据中的任何地方
定义字符串常量数组str[]、全局const变量c、局部static const变量c_static_local。
指针p和字符变量ccc是实验辅助变量。
这里写图片描述
编译并查看map文件及仿真窗口,如下:
这里写图片描述
这里写图片描述
分析:
可以看到辅助变量p和ccc都是放在.stack上的。
字符串”string”,全局const变量c和局部static const变量c_static_local都是放在.econst上的。
即.econst上的大小为 7 + 2 = 9。
结论:const定义的全局变量、static const 局部变量、字符串常量都是存放在.econst或.const段上的。
注意:const定义的变量必须初始化。
5、验证.pinit (这个测试是在另外一个工程文件中测试的)
.pinit:全局构造器(C++)程序列表
在main文件中编写如下测试程序:注意是全局构造器程序列表,所以要定义一个全局对象才行。
这里写图片描述
编译并查看map文件,如下:可以看到确实生成了.pinit段,段上有数据。
这里写图片描述
6、验证.switch
.switch switch语句产生的表
在main文件中编写如下测试程序:
这里写图片描述
编译并查看map文件,如下:可以看到确实生成了.switch段,段上有数据,而且.switch段是属于初始化段。
这里写图片描述
注意:Jump tables for large switch statements。如果switch表很小的话,在map文件中是不会生成switch段的。
经过我实际测试发现,小于12个case时map文件不会生成switch段。
7、验证.sysmem段和.esysmem段(因为两个段基本上是一样的,所以只验证.esysmem一个段。)
.sysmem malloc函数产生的内存 不超过64K长度
.esysmem far_malloc函数产生的内存 数据中的任何地方
在main文件中编写如下测试程序:
这里写图片描述
编译并查看map文件,如下:可以看到确实生成了.esyemem段。但是malloc出来的内存空间是属于动态存储区,
所以在map文件无法体现出大小及数据,需要运行程序才能看到结果。
这里写图片描述
编译运行程序如下:
这里写图片描述
可以看到0x008c00是.esysmem段的起始地址,第一个存储单元的4代表有4个存储数据,第2个数据是0,由系统预留的。
第3到第5个数据都是0061,而’a’的ASCII码正好是0x0061=97。即第3到第5个数据都是’a’。