第三章 单片机软件开发基础_第1页
第三章 单片机软件开发基础_第2页
第三章 单片机软件开发基础_第3页
第三章 单片机软件开发基础_第4页
第三章 单片机软件开发基础_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章单片机软件开发基础

何宾2023.07KeilμVision应用程序开发本节通过一个简单的C语言程序,对C语言程序框架,以及开发流程进行详细说明。内容包括:建立新的设计工程添加新的C语言文件建立设计下载程序到目标系统硬件在线调试

KeilμVision应用程序开发

--建立新的设计工程启动μVision5(C251版本)集成开发环境在KeilμVision5集成开发环境(下面简称Keil)主界面主菜单下,选择Project->NewμVisionProject...。弹出CreateNewProject对话框界面。在该界面中:将路径定位到E:\stc32_example\example_3_1在文件名(N)右侧的文本框中输入demo(该设计的工程名为demo,uvproj)单击保存按钮KeilμVision应用程序开发

--建立新的设计工程出现SelectaCPUDataBaseFile对话框界面。在该界面中的下拉框中,选择STCMCUDatabase选项。单击OK按钮。出现SelectDeviceforTarget’Target1’...对话框界面。在该界面的Device标签页面下,通过下拉框选择STCMCUDatabase在下面的左侧窗口的器件列表中,找到并展开STC前面的“+”。以列表的形式给出了可用的STC单片机型号。在展开项中,找到并选择STC3232G12K128SeriesKeilμVision应用程序开发

--建立新的设计工程KeilμVision应用程序开发

--建立新的设计工程单击OK按钮。在KeilμVision主界面左侧的Project窗口中,给出了工程信息,如下图所示。包括工程的名字、活动的目标文件,以及组和依赖文件。其中:KeilμVision应用程序开发

--建立新的设计工程工程目标(ProjectTarget)表示配置设置的集合可以创建工程目标以使用不同的工具设置来运行相同的应用程序例如,创建一个用于测试的目标和另一个用于发布应用的目标。活动的目标显示在Project窗口中工程名字的下方KeilμVision应用程序开发

--建立新的设计工程在Keil主界面工具栏中单击

按钮,弹出ManageProjectItems对话框界面在该界面左侧的ProjectTargets窗口中,通过执

行单击New按钮和输入

新的目标名字来添加新

的目标。KeilμVision应用程序开发

--建立新的设计工程添加一个新的ProjectTargets-Target2KeilμVision应用程序开发

--建立新的设计工程在Target1和Target2之间切换KeilμVision应用程序开发

--建立新的设计工程文件组(FileGroup)将文件排列成逻辑块根据文件的功能排列文件,或创建表示软件团队的组类似的,在下图中间

的Group窗口中,通

过执行单击New按钮

和输入新的文件组名

字来添加新的文件组单击New按钮输入新的Group名字KeilμVision应用程序开发

--建立新的设计工程(1)右键单击Target

1(2)出现浮动菜单(3)选择OptionsforTarget‘Target1’…KeilμVision应用程序开发

--建立新的设计工程(1)单击Target标签(2)设置CPUMode(3)设置MemoryModel(4)设置CodeRomSizeKeilμVision应用程序开发

--建立新的设计工程通过下面的设计实例,分析MemoryModel设置对编译结果的影响voidmain(){volatileinta=1000,b=5000;volatileint*d,*e;volatileint*f;d=&a;e=&b;*f=a+b;}建立新的设计工程

--MemoryModelTiny在微型存储器模型中。默认,所有变量都驻留在MCS-251ISA兼容单片机的内部数据存储器中,就好像它们是使用数据存储器类型说明符显式声明的一样在该存储器模型中,变量和指针访问非常有效。默认,指针大小仅为2个字节,表示近(near)存储器的指针。常数保存在NCONST存储器类中。使用HOLD命令,可以将指定对象大小以上的变量定向到其他存储器区域。通常,如果将链接器/定位器配置为覆盖内部数据存储器的变量,则Tiny模型是最好的模型建立新的设计工程

--MemoryModelMemoryModel设置为Tiny时的编译结果建立新的设计工程

--MemoryModelXtinyXTiny存储器模型与Tiny相同,只是默认情况下所有变量类型都使用存储器类型near,称为EDATA存储器类。对于具有中等数据需求的应用程序,XTiny存储器模型是一个不错的选择建立新的设计工程

--MemoryModelMemoryModel设置为Xtiny时的编译结果建立新的设计工程

--MemoryModelSmall在小存储器模型中。默认,所有变量都驻留在兼容MCS-251ISA单片机的内部数据存储器中,就像它们是使用数据存储器类型说明符显式声明一样在这个存储器模型中,变量访问非常有效,可以将指定对象大小以上的变量定向到其他存储器区域。数据指针是4字节指针,允许对整个16MB地址空间进行寻址建立新的设计工程

--MemoryModelMemoryModel设置为Small时的编译结果建立新的设计工程

--MemoryModelXsmallXSmall存储器模型与Small相同,只是默认情况下所有变量都使用存储器类型near,称为EDATA存储器类通常,XSmall模型是具有巨大需求的应用程序的正确选择建立新的设计工程

--MemoryModelMemoryModel设置为Xsmall时的编译结果建立新的设计工程

--MemoryModelLarge在Large模型中,默认,所有变量都驻留在外部数据存储器中(最多64KB)这与使用XDATA存储器类型说明符显式声明它们相同KeilμVision应用程序开发

--硬件在线调试数据指针(DPTR)用于寻址外部存储器需要注意的是,通过数据指针访问存储器效率低且速度慢。特别是对于长度为两个或更多字节的变量。这种类型的数据访问机制生成的代码比XTiny模型或XSmall模型要多建立新的设计工程

--MemoryModelMemoryModel设置为Large时的编译结果DR56=DPX建立新的设计工程

--MemoryModel因此,应尝试使用XTiny或XSmall存储器模型,而不是Large。使用HOLD命令,可以将指定对象大小以上的变量定向到其他存储器区域KeilμVision应用程序开发

--添加新的C语言文件(1)右键单击SourceGroup1(2)出现浮动菜单(3)选择“AddNewItemtoGroup‘SourceGroup1’…KeilμVision应用程序开发

--添加新的C语言文件(1)选择文件类型为CFile(.c)(2)输入文件名(3)单击Add按钮KeilμVision应用程序开发

--添加新的C语言文件添加设计代码,并保存文件KeilμVision应用程序开发

--编译器优化选项设置C251编译器是一个优化编译器这意味着编译器采取某些少量步骤来确保生成并输出到目标文件的代码可能是最高效(代码长度更短和/或速度更快)的代码通过OptionsforTarget‘Target1’对话框中的C251标签,程序开发人员可以设置C编译器的优化级别从下图可知,通过十进制数指定优化级别(Level)。有效值为[0..9]。字符串指定优化重点(Emphasis),无论是代码长度还是执行速度。有效值为[SIZE|SPEED]默认,优化级别设置为7,SPEED。KeilμVision应用程序开发

--编译器优化选项设置KeilμVision应用程序开发

--编译器优化选项设置级别功能0ConstantFolding:编译器执行计算,在可能的情况下将表达式减少为数值常数。这包括运行时地址的计算。SimpleAccessOptimizing:编译器优化251系统中内部数据和位地址的访问JumpOptimizing:编译器总是将跳转扩展到最终的目标。跳转到跳转将被删除1DeadCodeElimination:删除未使用的代码片段JumpNegation:对条件跳转进行仔细检查,以确定它们是否可以通过测试逻辑的反转来简化或消除2DataOverlaying:内部识别并标记适合静态覆盖的数据和位段。L251链接器/定位器具有通过全局数据流分析来选择段的能力,然后可以覆盖这些段PeepholeOptimizing:删除冗余MOV指令。这包括从存储器中不必要地加载对象以及使用常数的加载操作。当可以节省存储器空间或执行时间时,简单操作将代替复杂操作KeilμVision应用程序开发

--编译器优化选项设置级别功能3RegisterVariable:如果可能,将自动变量和函数参数放在寄存器中。删除为这些变量保留的数据存储器4ExtendedAccessOptimizing:将来自IDATA、XDATA、PDATA和CODE区域的变量直接包含在操作中。在大多数情况下,不需要使用中间寄存器LocalandGlobalCommonSubexpressionElimination:在可能的情况下,函数中相同的子表达式只计算一次。中间结果保存在存储器中,并用于替换新的计算Case/SwitchOptimizing:涉及Switch和Case语句的代码在跳转表或跳转字符串中进行优化5LifeVariableAnalysis:删除对自动变量的冗余操作和死保存操作KeilμVision应用程序开发

--编译器优化选项设置级别功能6ConstantPropagation:跟踪表达式的值,如果可能,插入常数值而不是变量访问PeepholeOptimizing:删除冗余MOV指令。这包括从存储器中不必要地加载对象以及使用常数的加载操作。当可以节省存储器空间或执行时间时,简单操作将代替复杂操作7CommonTailMergingandInstructionSimplification:编译器逐个函数分析生成的代码,并尝试找到公共的头部和尾部。如果编译器检测到公共的代码序列,那么它将用跳转指令将一个代码序列替换为另一个等效的代码序列。例如,在switch/case语句中。在分析代码的同时,编译器还尝试使用更廉价的指令替换指令序列8CommonBlockSubroutines(LinkOptimization):检测重复指令序列并将其转换为子程序。C251编译器重新排列代码已获得更大的重复序列9RearrangeCode(LinkOptimization):当检测到公共块子程序时,重新排列代码以获得更大的重复序列KeilμVision应用程序开发

--编译器优化选项设置对于表中的优化级8和优化级9,需要勾选“LinkerCodePacking”前面的复选框该选项调用命令OBJECTADVANCED每个优化级别都包含前面较低优化级别的所有特征例如,优化级别9包含从级别0到级别8的所有优化KeilμVision应用程序开发

--编译器优化选项设置开发人员可以基于函数到函数来更改优化级别,如下所示:#pragmaOT(3)voidfunct_1(void){...}#pragmaOT(9)voidfunc_2(void){...}注:目前,在SIZE和SPEED强调之间没有区别KeilμVision应用程序开发

--编译器优化选项设置在C251编译器中提供了RegisterColoring(寄存器着色)选项。全局寄存器着色适用于整个应用当使能后,其中包含每个函数使用的寄存器表编译器使用该表优化寄存器的使用。迭代地重新编译工程,直到无法进行进一步地寄存器优化当使能全局寄存器着色时,编译器知道每个函数使用的寄存器外部函数中未更改的寄存器可用于保存寄存器变量。编译器生成的代码需要更少的数据和代码空间,执行速度更快要使能全局寄存器着色,需要勾选RegisterColoring前面的复选框KeilμVision应用程序开发

--设计编译和链接采用下面给出的其中一种方法,运行Build过程(1)主菜单中选择Project(2)浮动菜单中选择BuildTarget(1)鼠标右键单击Target1(2)出现浮动菜单(3)浮动菜单中,选择BuildTargetKeilμVision应用程序开发

--设计编译和链接在Keil主界面底部的BuildOutput窗口中给出了建立过程的信息查看生成的文件

--目标文件C251编译器以OMF251对象格式生成目标(.OBJ)文件,以响应各种C语言语句和其他命令OBJECT命令指定目标文件的名字,而NOOBJECT命令禁止输出目标文件目标文件不仅仅是为C源代码生成的汇编二进制表示,它是一个特殊格式的文件包含符号信息、目标代码、调试信息、库引用等查看生成的文件

--目标文件下面给出了保存在目标文件中的一些细节为全局变量保留的存储器公共(public)符号(变量和函数)的名字外部符号(变量和函数)的引用要链接的库文件用于帮助将源代码行与目标代码同步的调试信息查看生成的文件

--目标文件保存在目标文件中的大部分目标代码都不是“绝对的”链接器可以将其定位在任何适当的地址编译器将外部变量和函数的引用设置为地址0,链接器恢复所有引用。由于这些原因,编译器生成的目标代码不能按原样执行。必须先将其链接,然后才能执行!!!查看生成的文件

--列表文件编译器列表文件包含大量的有关编译过程的信息它由多个部分组成,下面将按照文件中出现的顺序对每个部分进行描述查看生成的文件

--列表文件在OptionsforTarget‘Target1’对话框中,通过单击Listing标签,进入列表输出参数设置界面中查看生成的文件

--列表文件通过勾选Conditional前面的复选框,程序开发人员可以在源代码行中包含所有的条件代码(#if块中的代码)当不勾选该复选框时,指令可用于从列表文件中排除未编译的条件代码块查看生成的文件

--列表文件通过勾选#includeFiles前面的复选框,程序开发人员可以在源文件列表中包含#include文件的内容当默认不勾选该复选框时,包含文件内容不会输出到列表文件中查看生成的文件

--列表文件勾选Symbols前面的复选框时,符号列表将输出包含有关编译源文件中程序符号的符号信息包括符号名字(Name)、分类(Class),包括:SFR、structure、typedef、static、public、auto和extern)、存储器空间(Space)、数据类型(Type)、偏移(Offset)和字节大小(Size)当默认不勾选该复选框时,符号的内容不会输出到列表文件中查看生成的文件

--列表文件通过勾选AssemblyCode前面的复选框,在列表文件中将输出编译器为C源代码生成的汇编代码当默认不勾选该复选框时,汇编代码的内容不会输出到列表文件中查看生成的文件

--main.lst文件定位到\stc32_example\example_3_1\Listings目录下,打开main.lst文件查看生成的文件

--main.lst文件页面标题每个列表页都包含一个标题其中包含编译器版本号、源文件名、日期、时间和页码查看生成的文件

--main.lst文件命令行用于调用编译器的整个命令行包含在列表文件中。这通常有助于诊断命令行的问题查看生成的文件

--main.lst文件源代码源代码列表输出行号以及该行上的源代码查看生成的文件

--main.lst文件汇编程序列表汇编程序列表中包含编译器为C源文件生成的汇编代码查看生成的文件

--main.lst文件符号列表查看生成的文件

--main.lst文件模块信息模块信息提供了由源文件定义的初始化和未初始化存储器区域的大小查看生成的文件

--demo.map文件页面标题每个列表页面都包含一个标题,其中包含链接器版本号、日期和页码查看生成的文件

--demo.map文件命令行用于调用链接器的整个命令行包含在映射文件中。这通常有助于诊断命令行的问题查看生成的文件

--demo.map文件MCU详细信息包括所选MCU、模式和存储器模型的详细信息。这些表示链接中包含的默认存储器模型库。如果使用浮点数学,则还包含了浮点库查看生成的文件

--demo.map文件输入模块输入模块部分包括链接中包含的所有目标模块、库文件和模块的名字。这是检查链接某些目标文件是否有问题的好地方查看生成的文件

--demo.map文件存储器类活动的存储器类部分包括程序中每个存储器类使用的基地址、起始地址、结束地址和字节数查看生成的文件

--demo.map文件存储器映射存储器映射列出了程序中每个部分的起始和结束地址、类型、重定位类型、对齐方式、组、组合类型、类和名字查看生成的文件

--demo.map文件覆盖图覆盖图(overlay-map)显示程序的结构,以及每个函数的bit、data、idata、pdata和xdata段的位置。它是程序调用树的文本表示查看生成的文件

--demo.map文件bit、data、idata、pdata和xdata变量分别是BIT_GROUP、DATA_GROUP、IDATA_GROUP、PDATA_GROUP和XDATA_GROUP的一部分整个?C_C51STARTUP段是启动引导代码。它不需要bit、data或idata变量空间查看生成的文件

--demo.map文件当发现新的程序根时,它们将显示在覆盖图中在该图中,?C_C51STARTUP?3是启动引导代码,它将要调用main主程序查看生成的文件

--demo.map文件公共符号公共符号(publicsymbol)表显示了公共符号的值、名字、类和类型查看生成的文件

--demo.map文件符号表符号表包括从输入模块得到

的符号信息。包括所有符号

的值、表示、类、类型和名

字。查看生成的文件

--demo.map文件程序大小程序大小信息在列表文件的末尾附近输出。输出各种存储器区域的大小以及常数和代码空间查看生成的文件

--demo.map文件警告和错误链接程序时如果遇到问题,则会生成错误和警告,并输出到屏幕和映射文件中查看生成的文件

--HEX文件:LLAAAARRDDDD………DDDDCCLL:

Lengthfield-长度段:数据段(D)的字节数AAAA:

Addressfield-地址段:数据段第一个字节的地址RR:

Recordtype-纪录类型,00代表数据,01代表纪录结束DD..:

Datafield-数据段CC:

CheckSumfield-校验和

KeilμVision应用程序开发

--设计下载使用STC公司专用的下载工具STC-ISP工具,将demo.hex文件下载到单片机的片内程序存储器中通过USB电缆,将STC公司官方STC32G系列单片机硬件开发平台的USB接口连接到PC/笔记本电脑的USB接口KeilμVision应用程序开发

--设计下载修改并保存修改后的C语言代码,并重新执行Build过程去掉注释标志“//”,使得这两行代码有效KeilμVision应用程序开发

--设计下载打开STC-ISP软件工具。在该界面左侧窗中,找到标题“芯片型号”,并通过右侧的下拉框选择STC32G12K128(1)展开芯片型号右侧的下拉框(2)展开STC32G12K128系列,选择STC32G12K128将芯片型号设置为STC32G12K128KeilμVision应用程序开发

--设计下载找到并同时按下实验箱上标记为P3.2/INT0的按键以及标记为ON/OFF的电源开关按键,保持该状态一段时间。然后,先释放标记为主控芯片电源开关的按键,然后释放标记为P3.2/INT0的按键如果stc-isp软件成功识别到STC官方提供的STC32G系列单片机实验箱,则会在图3.21的左侧窗口的“扫面串口”标题栏右侧下拉框中显示STCUSBWriter(HID1);否则重新执行上一步。KeilμVision应用程序开发

--设计下载单击下图中左侧窗口中的“打开程序文件”按钮KeilμVision应用程序开发

--设计下载弹出“打开程序代码文件”对话框界面(1)定位到当前工程目录的Objects子目录下(2)选中生成的HEX文件(3)单击打开按钮KeilμVision应用程序开发

--设计下载找到并单击STC-ISP软件左下方的下载/编程按钮STC-ISP软件自动地将demo.hex文件下载到单片机STC32G12K128的程序存储器中观察实验箱中LED灯的变化

单击下载/编程按钮KeilμVision应用程序开发

--硬件在线调试硬件在线调试(硬件仿真)是STC32G12K128提供的一个重要的功能。通过硬件在线调试使得程序开发人员能够发现软件仿真时不能探测到的一些更深层次的设计问题比如:当程序不能响应外部中断的时候,可能有以下几种情况,全局中断没有使能?对应的外部中断没有使能?中断服务程序代码有问题?(没有进入中断服务程序?没有从中断服务程序正常返回?),这些可能性只有通过硬件在线调试功能才能确认。软件仿真绝不能代替硬件在线调试!!!KeilμVision应用程序开发

--硬件在线调试步骤1:使用STC官方提供的STC-USBLink1D硬件工具,其中一侧的USB接头插入到PC/笔记本电脑的USB接口;另一头通过STC提供的专用的白色电缆连接到STC实验箱上左上角上标记为J5的四针白色插座上KeilμVision应用程序开发

--硬件在线调试KeilμVision应用程序开发

--硬件在线调试步骤2:在Keil中,再次打开main.c文件,将该程序中如下for语句全部注释掉即为了调试方便,将程序代码中的两条延迟语句全部用单行注释符注释掉

//for(i=0;i<100000UL;i++);步骤3:对修改后的代码重新进行编译和链接,并生成HEX文件KeilμVision应用程序开发

--硬件在线调试步骤4:设置参数,并加载hex文件通过标题”单片机型号”右侧的下拉框,

将单片机型号设置为STC32G12K128单击“打开程序文件”按钮,重新加载

生成的hex文件输入用户程序运行时的IRC频率设置为11.0592MhzKeilμVision应用程序开发

--硬件在线调试步骤5:设置仿真参数(1)单击Keil仿真设置标签(2)勾选”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论