TDxxxV1.0
在完成代码编辑后,想要马上顺利运行基本上是不可能的,每一个程序都有经过调试的过程,程序的调试在IDS 中非常方便,IDS有全面的可视化的调试工具。你可以在程序中设置断点,在程序中按自己的需求来运行。可以根据不同的需求来进行调试。
1、 compile 和Build
完成代码的编辑后,首先要进行Compile,在菜单Build->Compile current file单击或在工具栏中单击Compile按钮和单击快捷键Ctrl+F7 均可以启动系统的Compile程序。Compile 程序会检查代码中存在的语法错误和软件设置错误,然后在Output窗口表列出来,用户可以根据表列出来的提示,对程序进行修改。若是语法错误,在列表中双击选项,系统会自动将光标移动到相对应的代码行,方便你的检查和修改。Compile 通过后,进行Build,同样有3种方式可以启动Build程序,Build程序生成运行所需要的一些文件,同时检查硬件配置和连接错误,用户必须根据提示对程序进行修改才能顺利通过。
2、 选择仿真方式
单击进入Project->setting,出现我们前面已经熟悉的project setting对话框,当前显示的是General 页,在primary setting组下面找到复选项use simulate。如果选中该选项,则程序就在系统提供的虚拟仿真器上仿真并显示相应结果;若不选中该选项,则程序必须在相应系列的仿真器上进行程序调试仿真。这里我们先选择它。
3、 进入调试模式
完成compile和build之后,进入菜单Debug->begin Debug,单击菜单项或直接按快捷键F5或在图标选项中选择按成如下图:
钮单击都可进入调试模式,进入调试模式后,系统界面变
图2-11 调试程序界面
系统界面出现Ram window、Watch window、variable window、Register window、call stack window和Disassembly window ,这些窗口都是调试程序要用到的。程序的指针指向程序的入口处,即Main()函数的第一条语句。
11
TDxxxV1.0
4、 应用Watch window:
在调试过程中如何应用watch window?Watch window用在调试工程中对定义的变量进行监视,将需要进行监视的Variable 在编辑窗口中双击,然后拖放到Watch Window当中,运行程序就可以在watch window中看到Variable的存放地点和值的变化。如图:
图2-12 watch window窗口
系统会将产生了变化的项置成红色。
为方便观察,你最多可以将Variable分别放到3个Watch window当中进行观察,他们的显示效果是一样的!
5、 应用Variable window
Variable window显示格式和watch window 的显示格式一样,但是variable window里面的项无法自己设定。它是以Auto的状态显示当前运行过程中被改变的Local Variable,同样系统会将最近改变的量置成红色。 6、 应用Register Window:
Register window里面显示的项是根据芯片的资源而定的,它显示的是当前母体芯片Ram中0x80~0xFF空间中专用存储器在当前运行状态下的值,单击前面的“+”号,将扩展项目展开,可以得到每一个bit的当前值。同样,在运行过程中,系统会将刚改变的项的值置为红色高亮显示,便于我们观察跟踪。
图2-13 Register 窗口
7、 应用Call stack window
Call stack window 显示当前运行状态下,stack的使用状况和入栈的函数,用户可以根据显示来判断程序的调用状况,进而判断当前的状态是否正确,有没有函数调用出错。
12
TDxxxV1.0
图2-14 call stack 窗口
8、 应用Memory window:
在程序运行当中,当你想从具体的Ram 地址而得到它的值的时候,你可以通过Memory窗口中实现,你可以直接在Go to后面的编辑框中输入地址,按Enter键确认,窗口会自动跳转到相应的位置显示该位置的值,方便我们在使用过程中的查找。
9、 应用Disassembly window:
如果调试过程中,你需要知道程序的直接汇编码,你可以在这个窗口中观察。
10、 设置断点:
程序调试的时候,往往需要知道程序运行过程中某个变量的运行状态,或者想知道某段程序是否执行,还有执行后的结果;或者,需要知道某段程序的运行过程是否正确。这时,就必须在程序的正确位置设置断点。
将光标移到正确位置,在相应的行,单击设置断点的按钮或按快捷键F9 或者从菜单项中设置都可以使该行程序被设置成为断点,被设置成断点后,运行程序,程序就会运行到断点处停下来,以便于用户控制程序的执行和观察执行的结果。如图:
图2-15 断点执行状态
11、 跟踪程序执行:
应用系统提供的debug工具,用户可以很方便地对程序的执行效果进行跟踪。你可以单步,也可越过一段程序往下执行,这要看你的需要!调试工具同样可以以3种方式打开:Debug菜单、工具栏按钮和快捷键。 六、程序输出
1、 仿真程序结果:
将仿真器与主机连接好,在project setting中清除use simulate选项的选中状态。将需要仿真的硬件系统目标板连接好。单击Debug 按钮或者按快捷键进入调试状态,就可以在实际硬件上看到程序运行的结果,对程序进行修改直到得到正确结果。我们就得到一个正确运行的可以烧录到实际芯片的程序。
2、 输出烧录文档
在完成程序的调试仿真后,我们就需要将程序输出。系统已经在默认目录下生成程序的烧录档XXX.sn8,默认目录为当前工程文件的目录下。
13
TDxxxV1.0
三、数据类型与运算
SN8 C 支持标准C的所有数据类型。具体有无符号字符(unsigned char)、有符号字符(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长型(unsigned long)、有符号长型(signed long)、浮点(float)和指针类型。还支持所有的构造类型。
字符型(char) 整型(int)
基本类型 长整型(long) 浮点型(float) 数组(array)
数据类型 构造类型 结构体(struct) 共用体(union)
指针类型 空类型 图3-1 数据类型
枚举(enum)
3.1 专有数据类型
虽然SN8 C支持C的所有数据类型,但是由于它面对的是8-bit单片机,所以必然会考虑数据类型的定义方法和长度。在这些方面,SN8 C有它自己的专有的定义特征和数据长度,在使用时一定要加于区分。请看下表:
数据类型 Signed char(short、int) Unsigned char(short、int) Signed long Unsigned long float、double Size(Byte) 1 1 2 2 4 14
数据取值范围 -128~+127 0~255 -32768~+32767 0~65535
TDxxxV1.0
Pointer enum 2 1 表3-1、数据类型长度定义表
3.2 常量与变量
在程序设计的过程中,我们有些量可能是参考值,也可能是预设的值。总之,我们希望它在整个程序中保持不变,并且在程序的任何地方可以提供我们调用,用来比对某些条件是否成立等等。
对于这样的值,我们可以不去定义它,而直接参考数值,这在汇编编程过程中,经常会有一些缺乏经验的程序员这样用。但这就需要程序员把程序中的这些值都牢牢记住,并且要将他们的值前后统一,这是一个非常容易出错的过程,而且也会影响了程序的可读性,这样,程序的修改和维护都非常艰难,必须处处小心翼翼,一处不慎就全盘错误!这是任何人不想看到的后果。因此,建议对于程序中用到的不会改变的参考值或其他预设的值都进行一个预先的定义,给它取一个有意义的或与其相关的名字。这个过程就是常量定义,自然,这个不变的量就称为常量。
在标准C中,由于面对的是功能强大的CPU系统和大内存,用户可以不去管它放置的地方。但是,面对一个单片机系统,它的Ram非常小,有时会显得很紧张。所以系统为了节省空间会将一些表格等放在系统的ROM中。而我们直接命名的常量,则由编译器自动将其替换为所需要的值,这些工作就由计算机来完成好了。
我们先来看看我们用汇编编写程序时是怎么来定义常量的: 如:
door_service_c t0int_c
equ
equ
#80 #224
;80ms去门抖动 ;t0中断时间
segment_c equ #3 ;最多3段烹调
注:上面数值前的#号,是SN8ASM的符号,用于提示后面的是立即数。
上面定义了3个程序中会用到的参考值,顺便提一下,在定义的时候加上注释是有必要的,要不然时间久了你就又不知道你定义的到底是什么了。在上面的定义中,用的是汇编EQU关键字,在编译过程中,程序里但凡出现了EQU前面的字段都会被其后面的值直接代替,因此,很方便地减轻了程序员的工作。
我们再来看看用SN8 C是如何定义这些相同的常量的:
如:
#define door_service_c #define t0int_c
80 //80ms去门抖动
//t0中断时间
224
#define segment_c 3 //;最多3段烹调
上面定义的3个量是与前面汇编当中定义的3个常量是完全相同的。在进行编译预处理时,这些量就会被数值代替。 还有一个特殊的地方,那就是一些数值列表,在汇编当中,查表项都是放在Code 当中的,作为Code 来处理,其实这些值也是常量,只不过他们的处理不同于一般常量而已,并且它们共用一个入口。下面是一个汇编的表:
disp_automenu: ;显示菜单用第二数字表格
15