一个单片机调试小工具的编程思路

发布者:innovator7最新更新时间:2024-03-20 来源: elecfans关键字:单片机  编程思路 手机看文章 扫描二维码
随时随地手机看文章


  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。知道了这些地址,我们只需将其感兴趣的函数与变量地址发送给单片机,单片机通过指针就可以执行相应的函数了。整个上位机正是基于这个原理而编写的。具体流程如下图所示:


d62e8d46a1143a3e9e3bb9e63c87fc1f_wKgZomTm_kuAGNm4AAFNNQlfYms541.png


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;

[1] [2] [3] [4] [5]
关键字:单片机  编程思路 引用地址:一个单片机调试小工具的编程思路

上一篇:MMC中断的特点及解决方案
下一篇:SAR ADC内部结构

推荐阅读最新更新时间:2024-11-14 09:31

MSP430单片机理论复习知识点
纵观微处理器的发展,一是朝着具有复杂数据运算、高速通信、信息处理等功能的高性能计算机系统方向发展;二是产生了一种将中央处理器,存储器,I/O接口电路以及连接他们的总线都集成一块芯片上的计算机。单片机在设计上主要突出了控制功能,调整了接口配置,在单一芯片上制成了结构完整的计算机。 目前最常用的3中可编程处理器:微控制器(MCU)、微处理器(MPU)、数字信号处理器(DSP); 单片机可应用的领域:工业控制(工业机器人)、智能化仪器仪表(温度湿度的测量)、日常生活钟的电器产品(MP3)、计算机网络与通信(以太网)、计算机外部设备(微型打印机); 单片机的结构特点:时钟频率比通用MPU和DSP低;功耗低;字长一般为8-32位;内
[单片机]
单片机的定时器中断0
定时器工作的流程可以按照这个顺序(以51为例用定时器0方式一产生50毫秒的定时) 1、确定使用哪个定时器,使用哪种方式,这一步通过TMOD设置,TMOD的低四位是设置定时器0的,高四位是用来设置定时器1的,其中的M0,M1是用来设置定时器工作在哪种方式,GATE一般用不要设置,C/T是选择计数模式还是定时模式的,如:TMOD = 0X01,就说明定时器0工作在方式1。 2、接下来就要设置定时的时间,用定时器定时50毫秒,可以用这种方式TH0 = (65535 - 50000) / 256,TL0 = (65535 - 50000) % 256;可以这样理解:因为这是定时器的初值,也就是说计数脉冲就是在这个数的基础上向上递增,到达65
[单片机]
<font color='red'>单片机</font>的定时器中断0
51单片机汇编语言数字时钟
数字时钟proteus+ 51单片机+LCD1602+汇编语言+1602器件资料,适合做单片机课程结课作品 单片机汇编源程序如下: ;/******************************************************************************** ; LCD1602 时钟显示Cekong time测控何小双 ;********************************************************************************/ RS EQU P2.0; //控制端接口 R_W
[单片机]
51<font color='red'>单片机</font>汇编语言数字时钟
51单片机IO口模拟串口通讯C源程
51 IO口模拟串口通讯C源程 #include reg51.h sbit BT_SND =P1^0; sbit BT_REC =P1^1; #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3; sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit ACC7= ACC^
[单片机]
单片机MCU内存分配
谈到内存,我们都会想到PC,对于单片机或者arm来说也是存在内存的,简单的理解是:内存嘛……就是存放东西的地方,只不过这个东西是数据而已,好了,还是把重点放在mcu上面,对于一款mcu来说,在性能描述的时候都会告诉sram,flash的容量大小,对于初学者来说,也不会去考虑和理会这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,仔细想想,代码为什么可以运行,代码量是多少,定义的int、short等等类型的变量究竟是怎么分配和存储的,这些问题都和内寸有关系。 首先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,
[单片机]
飞思卡尔推出面向软件工程师的汽车微控制器产品线S32K MCU
采用ARM Cortex 技术的新汽车架构实现了软件和硬件可扩展性,通过面向未来的特性和最佳的软件复用加快开发 2015年6月23日,德克萨斯州奥斯汀(2015年飞思卡尔技术论坛)讯-随着新汽车中芯片内容和复杂性的不断增加,未来的汽车发展对软件愈发依赖。新汽车通常集成了超过1亿行内置代码,比大多数民用客机的代码数量还要多。虽然软件带来了令人兴奋的创新机会,但同时也增加了复杂性,催生了大量的代码维护和上市速度挑战。因此,汽车电子供应商现在投入到软件领域的开发资源超过了在硬件方面的开发资源。 为了应对这些挑战,飞思卡尔半导体推出了首个旨在大大加快和简化软件开发的汽车微控制器产品线S32K。S32K基于广泛采用的
[单片机]
PIC单片机对清洁护理机的设计
引言 随着我国老龄化进程的加剧,当今社会中存在着一种因失去生活自理能力而“长期卧床的弱势群体”,特别是那些几乎无意识的弱势群体,他们需要被人长期照顾,特别是他们的大小便的清洁处理。然而由于该弱势群体数量大、护理人员紧缺和护理费用高等问题,导致这些弱势群体的家庭护理矛盾日益凸显。目前市场上的长期卧床病人大小便清洁护理机在“智能护理”方面己比较完善,已经具有大小便自动识别与回收、温水清洗与自动烘干等功能,达到了“人性化”护理的要求,但在使用过程中仍然需要专门的“陪护人员”,对于绝大多数现代家庭而言,无论从人力还是财力,这都将是一个沉重的负担,同时也限制了大小便清洁护理机在家庭中的推广使用,因此,社会迫切需要一种在现有护理功能的基础上能
[单片机]
PIC<font color='red'>单片机</font>对清洁护理机的设计
PIC单片机AD通道转换函数问题解析
  AD转换   D转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。   A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。   AD转换分类   1)积分型(如TLC7135)   积分型AD工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。其优点是用简单电路就能获得高分辨率, 但缺点是由于转换精度
[单片机]
PIC<font color='red'>单片机</font>AD通道转换函数问题解析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved