1、学会下载、安装Keil μVision集成开发环境;
2、了解Keil μVision软件开发流程;
3、学会使用Keil μVision集成开发环境进行软件开发,包括程序的编辑、编译、连接、生成目标代码。
4、学会使用Keil μVision集成开发环境进行程序的调试。
Keil软件是目前最流行开发MCS-51系列单片 机的软件,这从近年来各仿真机厂商纷纷宣布全面支持 Keil即可看出。Keil提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通 过一个集成开发环境(uVision)将这些部份组合在一起。
Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
具体去看《深入理解计算机系统》P3
2.为当前项目选择CPU,选择STC15W4K32S4
3.选择”是“
4.添加文件
程建立好以后,如果还要对工程进行进一步的设置,点击左边 Project 窗口的 Target 1,然后使用菜单“Project->Option for target ‘target1’” 即出现对工程设置的对话框,也可以直接使用默认值。
Xtal后面的数值是晶振频率值,默认值是所选目标 CPU 的最高可用频率值,在仿真的时候要让工作频率和实际频率一致。
Memory Model 用于设置RAM使用情况,有三个选择项,Small是所有变量都在单片机的内部 RAM 中;Compact 是可以使用一页外部扩展 RAM,而 Larget则是可以使用全部外部的扩展 RAM。
Code Model 用于设置 ROM 空间的使用,同样也有三个选择项,即 Small 模式,只用低于 2K 的程序空间;Compact 模式,单个函数的代码量不能超过 2K,整个程序可以使用 64K 程序空间;Larget模式,可用全部64K空间。
Use on-chip ROM 选择项,确认是否仅使用片内 ROM(注意:选中该项并不会影响最终生成的目标代码量)
Operating项是操作系统选择,Keil 提供了两种操作系统:Rtx tiny 和 Rtx full,关于操作系统是另外一个 很大的话题了,通常我们不使用任何操作系统,即使用该项的默认值:None(不使用任何 操作系统)
Creat Hex file 用于生成可执行代码文件(可以用编程器写入单片机芯片的 HEX 格式文件,文件的扩展名 为.HEX)
选中 Debug information 将会产生调试信息,这些信 息用于调试,如果需要对程序进行调试,应当选中该项
Name of Executable 用 于指定最终生成的目标文件的名字,默认与工程的名字相同,这两项一般不需要更改
下图是有关编译、设置的工具栏按钮,从左到右分别是:编译、编译连接、全部重建、停止编译。
选择菜单 Project->Build target(即第2个),对当前工程进行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码;
如果选择 Rebuild All target files(即第3个) 将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,
Translate … .(即第1个)项则仅 对该文件进行编译,不进行连接。
关于工程和target关系看这 传送门1
一个工程下可以有多个target,如果只编译当前选中的target即,那么就选第2个
如果要把所有的target都重新编译过,就按第3个。
第1个按钮,就是只编译不连接,那么exe文件就不会改变。
在对工程成功地进行汇编、连接以后,按 Ctrl+F5 或者使用菜单 Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真 CPU 用来模拟执行程序以模拟调试 功能。
从左到右依次是复位、全速执行,停止(用在全速时),单步执行,过程单步,跳出当前函数,跳到下一个断点出处。
**全速执行:**是指一行程序执行完以后紧接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难以确认错误出现在哪些程序行。
只有遇到断点才会停下来,否则会一直会循环main
**单步执行:**是每次执行一行程序,执行完该行程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以找到程序中问题所在。
**过程单步:**是指将汇编语言中的子程序或高级语言中的函数作为一个语句来全速执行。
Step Out of Current Function(单步执行到该函数外):使用该命令 后,即全速执行完调试光标所在的子程序或子函数并指向主程序中的下一行程序(这里是 JMP LOOP 行)
通过在 Address 后的编缉框内输入“字 母:数字”即可显示相应内存值,其中字母可以是 C、D、I、X,分别代表代码存储空间、 直接寻址的片内存储空间、间接寻址的片内存储空间、扩展的外部 RAM 空间,数字代表想 要查看的地址。
寄存器页包括了当前的工作寄存器组和系统寄存器,系统寄存器组有一些是实际存在的寄存器如 A、B、DPTR、SP、PSW 等,有一些是实际中 并不存在或虽然存在却不能对其操作的如PC、Status等
观察特定变量的变化
这个是用来当示波器看的,可以看某个引脚的波形
debug界面如下,通过看右下角堆栈窗口内值的变化知道变量都是什么值。
而可以按F11,单步执行停下来观察。
调试代码如下
void fu(int* a)
{
int pp=3;
*a=pp;
}
void main()
{
int a,b,k;
bit c,d;
a=2;
b=40;
c=3; //观察它值是为3还是1.
c=ab;
d=0;
d=ab;
fu(&a);
for(k=1;k<=10;++k)b=k;
}
运行到以下行时
a=2; 可以看到a=0x0002
b=40; b变成0x0028
c=3; c变成0x0001,而不是0x0003,因为他是bit
d=ab; 这时d由0变1
而跳到函数里时,是这样子的
注意观察窗口里的变量只能在特定的函数里有效
因此如果这一次debug里的a如果在下一个debug里再用,而不是删除再新增,这时它的类型会错乱。比如int类型的a,再使用就变成uchar了
好用的原因是在这里可以让变量显示为十进制数
如果是函数里的局部变量加到观察窗口里去,在下一次的debug里就会自动消失
局部变量在硬件仿真的时候不能添加到watch
好用的原因是在这里可以让变量显示为十进制数
全步运行会直到断点才停下来,如果没有设置断点会一直循环main
在使用前要把寄存器添加进去,从watch窗口中,
详细可以看这里 传送门2
利用断点
全步运行会直到断点才停下来,如果没有设置断点会一直循环main
[外链图片转存中…(img-nb1a3SY3-1586058520478)]
在使用前要把寄存器添加进去,从watch窗口中,
详细可以看这里 传送门2