52 8 0 0 0 0 __scatter.o
28 0 0 0 0 0 __scatter_zi.o
18 0 0 0 0 80 exit.o
6 0 0 0 0 152 heapauxi.o
0 0 0 0 0 0 indicate_semi.o
2 0 0 0 0 0 libinit.o
2 0 0 0 0 0 libinit2.o
2 0 0 0 0 0 libshutdown.o
2 0 0 0 0 0 libshutdown2.o
8 4 0 0 96 68 libspace.o
78 0 0 0 0 80 rt_memclr_w.o
2 0 0 0 0 0 rtexit.o
10 0 0 0 0 0 rtexit2.o
12 4 0 0 0 68 sys_exit.o
74 0 0 0 0 80 sys_stackheap_outer.o
2 0 0 0 0 68 use_no_semi.o
804 16 0 0 0 272 daddsub_clz.o
90 4 0 0 0 92 dfixu.o
156 4 0 0 0 92 dnaninf.o
12 0 0 0 0 68 dretinf.o
430 8 0 0 0 168 faddsub_clz.o
62 4 0 0 0 84 ffixu.o
140 4 0 0 0 84 fnaninf.o
10 0 0 0 0 68 fretinf.o
0 0 0 0 0 0 usenofp.o
----------------------------------------------------------------------
2092 56 0 0 96 1592 Library Totals
6 0 0 0 0 0 (incl. Padding)
----------------------------------------------------------------------
Code (inc. data) RO Data RW Data ZI Data Debug Library Name
382 16 0 0 96 664 c_w.l
1704 40 0 0 0 928 fz_ws.l
----------------------------------------------------------------------
2092 56 0 0 96 1592 Library Totals
----------------------------------------------------------------------
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
10794 578 362 596 35164 577922 Grand Totals
10794 578 362 532 35164 577922 ELF Image Totals (compressed)
10794 578 362 532 0 0 ROM Totals
==============================================================================
Total ROSize (Code + RO Data) 11156 (10.89kB)
Total RWSize (RW Data + ZI Data) 35760 (34.92kB)
Total ROM Size (Code + RO Data + RW Data) 11688 (11.41kB)
仔细观察可以发现.map文件主要由以下几个部分组成:
Component: ARM Compiler 5.06 update 6 (build 750) Tool: armlink [4d35ed]
==============================================================================
Section Cross References
==============================================================================
Removing Unused input sections from the image.
==============================================================================
Image Symbol Table
Local Symbols
Symbol Name Value Ov Type SizeObject(Section)
Global Symbols
Symbol Name Value Ov Type SizeObject(Section)
==============================================================================
Memory Map of the image
==============================================================================
Image component sizes
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
==============================================================================
Total ROSize (Code + RO Data)
Total RWSize (RW Data + ZI Data)
TotalROMSize(Code+ROData+RWData)
而我们最关注的信息如函数和全局变量的地址与大小都在.map文件中的Image Symbol Table->Global Symbols。知道了这些地址,我们只需将其感兴趣的函数与变量地址发送给单片机,单片机通过指针就可以执行相应的函数了。整个上位机正是基于这个原理而编写的。具体流程如下图所示:
2.2 class Get_Map_Address_And_Size_Table的实现——————.map中函数和全局变量的地址与大小等信息提取
函数和全局变量的地址与大小都在.map文件中的Image Symbol Table->Global Symbols,由Symbol Name、Value、Ov Type、Size、Object(Section)组成,所以先定义一个public struct Symbol来包含上述信息:
public struct Symbol
{
public String Symbol_Name;
public uint Symbol_Address;
public SymbolType Symbol_Type;
public ushort Symbol_Size;
public String Symbol_Section;
};
接下来就是通过FileStream获取.map文件中的信息,并定位至Image Symbol Table->Global Symbols,读取Symbol Name、Value、Ov Type、Size、Object(Section)并赋值给symbol_table:
public void Create_Address_And_Size_Table(String filename){
try
{
uint i;
FileStream file_read = new FileStream(filename, FileMode.Open, FileAccess.Read);//新建文件流
filelist = File.ReadAllLines(filename, Encoding.Default);//读取文件内容所有行保存到字符串数组中。
for (i = 0; i <= filelist.Length - 1; i++) //定位到感兴趣的位置
{
if (filelist[i].Contains('Global Symbols'))
{
break;
}
}
for (uint j = i; j <= filelist.Length - 1; j++)
{
if (filelist[j].Contains('Object(Section)'))
{
i = j + 1;
break;
}
}
if (i < filelist.Length - 1) //获取信息
{
//Table_DeInit();
Get_Symbol_Data(i);
}
file_read.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Get_Symbol_Data(i);就是负责将Image Symbol Table->Global Symbols中的Symbol Name、Value、Ov Type、Size、Object(Section)赋值给symbol_table。有两点需要说明一下:
1)由于在Global Symbols中,
xxxxxx-UndefinedWeakReference
不包含有用信息,是需要被排除的,可以通过Contains('- Undefined Weak Reference')方法将其排除。
2)Image Symbol Table->Global Symbols中的Symbol Name、Value、Ov Type、Size、Object(Section)是通过空格将数据进行分割,所以可以通过
Split(newChar[]{''},StringSplitOptions.RemoveEmptyEntries);
就可以得到数据集。
void Get_Symbol_Data(uint index)函数如下:
private void Get_Symbol_Data(uint index)
{
table_length = 0;
while (index <= filelist.Length - 1)
{
if (filelist[index].Equals(''))
{
index++;
continue;
}
if(filelist[index].Contains('=') == false)
{
if (filelist[index].Contains('- Undefined Weak Reference'))//排除- Undefined Weak Reference
{
index++;
continue;
}
else
{
int str_index = 0;
string[] split_str = filelist[index].Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//获取数据集
symbol_table[table_length].Symbol_Name = split_str[str_index];
str_index++;
symbol_table[table_length].Symbol_Address = Convert.ToUInt32(split_str[str_index], 16);
str_index++;
if (split_str[str_index].Equals('Thumb'))
{
symbol_table[table_length].Symbol_Type = SymbolType.Thumb_Code;
}
else if (split_str[str_index].Equals('Section'))
{
symbol_table[table_length].Symbol_Type = SymbolType.Section;
}
else if (split_str[str_index].Equals('Number'))
{
symbol_table[table_length].Symbol_Type = SymbolType.Number;
}
else if (split_str[str_index].Equals('Data'))
{
symbol_table[table_length].Symbol_Type = SymbolType.Data;
}
str_index++;
if (split_str[str_index].Equals('Code'))
{
str_index++;
symbol_table[table_length].Symbol_Size = Convert.ToUInt16(split_str[str_index], 10);
str_index++;
symbol_table[table_length].Symbol_Section = split_str[str_index];
}
else
{
symbol_table[table_length].Symbol_Size = Convert.ToUInt16(split_str[str_index], 10);
str_index++;
symbol_table[table_length].Symbol_Section = split_str[str_index];
}
table_length = table_length + 1;
index++;
if (table_length >= table_len)
{
break;
上一篇:MMC中断的特点及解决方案
下一篇:SAR ADC内部结构
推荐阅读最新更新时间:2024-11-14 09:31
设计资源 培训 开发板 精华推荐
- LT3091HT7 并联器件使用 IMONN 消除镇流器电阻压降的典型应用
- 使用 Cypress Semiconductor 的 MB39C022L 的参考设计
- 使用 TC7117A 模数转换器实现 +5V 单电源的典型应用
- LTC2242-12、12 位、250Msps 模数转换器的典型应用
- 【训练营】鸿蒙BigDog
- 使用 ROHM Semiconductor 的 BD49K47G-TL 的参考设计
- EVAL-ADM1041EB,评估板允许在开关电源应用中快速评估 ADM1041
- 一种用于LCD背光测量的精密宽带电流探头设计电路
- TS19730 单级低 THD 降压-升压 PWM 控制 LED 驱动器的典型应用
- DC187A-A,基于 LT1374、4.5A、500kHz 降压型开关稳压器的演示板