通过KeilμVision集成开发环境开发STC 8051单片机软件程序的流程如图3.10所示。从STC单片机应用的角度而言,程序开发的任务包含两个方面:
(1)编写硬件驱动,并提供应用程序接口函数API。
(2)基于API编写应用程序,使得单片机系统能满足应用要求。
传统情况下,8051单片机的程序开发都是直接面向于底层硬件的,即先编写硬件驱动,然后基于硬件驱动进行编写,也就是我们通常所说的“裸奔”。这种开发方法的最大局限性在于程序的可移植性较差、维护成本高。此外,由于这种开发方式没有使用操作系统进行支持,很难实现多任务的协同分时处理。
图3.10 通过KeilμVision集
随着单片机应用程序开发要求的不断提高,程序设计思想也发生了明显的变化,主要体现在:
(1)使用API函数封装底层具体的硬件,而应用程序开发者只需要调用这些API函数即可,这样就显著降低了应用程序对底层的依赖性,使得应用程序具有更好的可移植性。
(2)在单片机程序开发中,引入操作系统的支持,这样可以支持多任务的分时协同同步处理,显著提高了复杂应用程序的可靠性。
对于编写软件代码的程序员而言,在开始编写软件代码前,需要明确并完成下面的要求:
(1)了解所提供的硬件的性能。
(2)了解STC单片机的软件开发环境KeilμVision5所能实现的功能。
(3)明确软件代码所要实现的功能。
(4)绘制用于表示软件代码实现过程的数据流程图和程序流程图。
(5)进一步明确程序的概要设计和详细设计方案。
在使用KeilμVision集成开发环境创建设计工程时,需要完成下面的任务:
(1)指定工程所在的路径和文件夹。
(2)命名工程。
(3)从单片机元器件库中,找到STC单片机元器件库,并添加软件开发所使用的单片机型号。
在创建完设计工程后,需要编写汇编/C程序代码,包括:
(1)如果使用汇编语言开发软件代码,则添加汇编源文件;如果使用C语言开发软件代码,则添加C源文件。
(2)通过KeilμVision集成开发环境提供的编辑器,在源文件中输入汇编/C语言代码。
在程序设计中,软件代码是指与C/汇编语言相关的文件类型,包括:.h头文件、.c文件和.a51汇编文件等。
(3)编写完汇编/C程序代码后,保存设计源文件。
汇编器允许程序员使用MCU助记符指令编写程序代码。在一些对速度、代码长度和对硬件控制的精确程度有要求的应用中,必须使用汇编语言编写代码。Keil开发环境中的汇编器软件工具将汇编语言助记符翻译/转换为可执行的机器码,同时支持源码级符号调试,以及对宏处理的强大能力。
汇编器将汇编代码源文件翻译成可重定位的目标模块,以及可以创建带有符号表和交叉引用细节的列表文件。并且,将完整的行号、符号和类型信息写到所生成的文件中。通过这些信息,可以在调试器中准确地显示程序变量,行号则用于μVision调试器和第三方调试工具的源代码级调试。
Keil汇编器支持不同类型的宏处理器(取决于结构):
(1)标准宏处理器(Standard Macro Processor,SMP)。它是一种比较容易使用的宏处理器,允许在汇编程序中使用与其他汇编器兼容的语法规则来定义和使用宏。
(2)宏处理语言(Macro Processing Language,MPL)。它是字符串替换工具,与Intel的ASM-51宏处理器兼容。MPL包含一些预定义的宏处理器函数,它提供了一些有用的操作,比如:字符串操作和数字处理。
在程序设计中,使用宏减少了开发和维护时间。汇编器提供的宏处理器还具有其他特点,包括根据命令行命令对汇编程序进行有条件汇编。代码部分的有条件汇编可以帮助程序员设计出最短长度的代码,同时也允许从相同的汇编源文件中生成不同的应用程序代码。
Keil ANSI C编译器可以用于为STC 8051结构的单片产生快速压缩的代码。与通过汇编器转换的汇编语言相比,采用通过C编译器转换的C语言编程同样可以得到高效率的目标代码。对于程序员而言,与采用汇编语言编写代码相比,使用以C语言为代表的高级语言编写代码具有下面的优势:
(1)不要求掌握处理器指令集的知识,只要求最初级的处理器架构知识。
(2)由编译器负责寄存器的分配、不同存储器类型和数据类型的寻址。
(3)当程序接收到正规的结构时,可以将其分解成不同的函数,这样就有利于源代码的重用,使得应用程序结构更好。
(4)将带有指定操作的不同选择进行组合,可以提高程序的可读性。
(5)所使用的关键字和操作函数更接近人的思维习惯。
(6)极大地缩短了软件开发和调试的时间。
(7)C运行库包含很多标准的例程,比如:格式化输出、数字类型转换和浮点算术运算。
(8)由于采用了模块化的程序结构,因此很容易将已经存在的程序包含到新的程序中。
(9)由于C语言遵循ANSI标准,因此它非常容易移植,即很容易将应用从一个处理器架构移植到另一个处理器架构中。
库管理器创建和维护目标模块库,这些目标模块库由C编译器和汇编器创建。库文件提供了一个便捷的方式,用于引用和组合大量可以被链接器使用的模块。
通过使用库,链接器可以解析用于当前程序的外部变量和函数,提取库中的模块。如果需要的话,可以将其添加到当前的应用程序中。在应用程序中,没有被调用的那些模块中的例程不会出现在最终的输出文件中。链接器从库中所提取的目标模块可以像其他模块那样被正确地处理。
在程序设计中,使用库的好处主要包括安全、运行速度快以及能够将代码长度降到最小。库可以提供大量的函数和例程,不需要给出源代码。
程序员使用μVision工程管理器提供的库管理器建立的是库文件,而不是可执行程序。可以在Options for Target对话框的output标签页面下,选中Create Library前面的复选框,或者通过命令提示符调用库管理器。
链接器/定位器将目标模块组合为一个可执行程序,它解析外部和共同的引用,并且为可重定位的程序段分配绝对地址。链接器处理由编译器和汇编器所创建的目标模块,并且自动包含所需要的库模块。
程序员可以从命令行调用链接器,或者让μVision自动调用它。默认的链接器命令可以适配大多数的应用程序,无须使用额外的选项。但是,它也可以为应用程序指定设置。
注:在KeilμVision完成编译和链接,生成目标文件后,会生成下面的文件:
(1).lst:对应文件在编译器中的行号,占用的代码空间等。
(2).lnp:对应项目,包含了什么文件,生成什么文件等信息。
(3)无后缀文件:这个是最终生成的文件。
(4).obj:是编译器生成的目标文件。
(5).m51:这个文件很重要,可以用文本编辑器打开。当软件设计中出现问题时,必须通过这个文件才能分析这些问题,比如覆盖分析,混合编程时查看函数段名等,里面都是链接器的连接信息,例如有哪些代码段、数据段,都是多大,被定位到单片机哪个地址,哪个函数调用了哪个函数,没有调用哪个函数,工程代码总大小,内存使用总大小等。
目标到HEX转换器用于将链接器所创建的绝对目标模块转换为Intel十六进制文件。Intel十六进制文件是ASCII文件,它对应用程序的十六进制表示。通过STC公司提供的stc-isp软件,可以将Intel十六进制文件写到STC单片机的程序存储器Flash中。
μVision集成开发环境中集成了图形化的调试器,它提供的特性包括:
(1)不同单步模式的C源代码级或者汇编代码级的程序执行。
(2)访问复杂断点的多重断点选项。
(3)用于查看和修改存储器、变量和MCU寄存器的窗口。
(4)列出了用于调用栈窗口的程序调用树。
(5)用于查看片上控制器外设状态细节的外设对话框。
(6)用于调试命令入口的命令提示符和类似C的脚本语言。
(7)记录了运行程序时间统计信息的执行统计。
(8)用于安全性比较苛刻的应用测试的代码覆盖统计。
(9)记录和显示变量和外设I/O信号值的逻辑分析仪。
该调试器提供了下面两种工作模式,包括仿真器模式和目标模式。
仿真器模式将调试器配置为只用于软件产品,即精确的模拟目标系统,包括指令和片上外设。这允许在有可用的真实硬件平台之前,提前对应用程序代码进行测试,这样可以加速嵌入式系统的软件开发过程。在仿真器模式下,调试器提供的特性包括:
(1)允许在没有实际硬件平台的情况下,在计算机上对代码进行测试。
(2)软件进行早期的功能调试,改善软件整体可靠性。
(3)允许设置硬件调试器不允许的断点。
(4)相对于添加了噪声的硬件调试器仿真可以提供优化的输入信号。
(5)允许贯穿信号处理算法的单步运行。当MCU停止时,会阻止外部信号。
(6)使对会破坏真实外设的失败场景的检查更加容易。
在目标模式下,调试器将与真实的STC单片机硬件系统进行连接。使用调试界面下已经提供的STC Monitor-51 Driver驱动程序对STC单片机系统进行调试。通过USB-串口电缆,将PC的USB口和STC单片机的串口进行连接,通过STC单片机串口对实际硬件目标系统进行调试。
思考与练习3-1: 在对编程语言(汇编/C)的处理过程中,编译器/汇编器的作用是 。
思考与练习3-2: 在对所生成的目标代码处理时,链接器的作用是 。
思考与练习3-3: 对单片机进行的调试,分为 模式和 模式,它们各自的作用。(提示:分为仿真器模式和目标模式,也称为软件仿真模式和硬件调试模式,有些也称之为脱机调试和连机调试模式。)