【Allwinner ClassA20类库分析】 2.free pascal语法及结构简析

上一节介绍了Lazarus一般的开发操作流程,对于不熟悉pascal语言的朋友可能看的还是不大明白,不知道pascal代码里都应该包含什么或起什么作用,这回就简单地介绍下语法及代码文件的结构。当然,只是描述一下通常会用到的东西,如果想深入了解pascal,请参考本节最后推荐的书。

free pascal的代码文件一般只有两种,.lpr和.pas(或.pp);lpr文件是工程文件,pas或pp是单元文件。一个完整的pascal工程必须包括一个lpr文件。来看一下Lazarus默认创建的工程都包括些什么。打开Lazarus后点击全部保存,选择路径并确定,保存为默认的文件名。

project1.lpr - 工程文件,整个程序的入口,一般情况下不需要手动修改;

project1.res - 工程资源文件,保存版本、字符串等,不需要手动修改;

project1.lpi - 工程管理文件,保存工程的信息,Lazarus靠此文件管理所有的文件为一个工程,不需要手动修改;

project1.lps - IDE环境关闭时的信息,包括各种编辑窗体最后的位置等信息,不需要手动修改;

project1.ico - 图标文件,编译为可执行文件后显示的图标,不需要手动修改;

unit1.pas - 窗体源代码文件,可手动添加代码;

unit1.lfm - 窗体属性代码文件,不需要手动修改;

可以看到,真正需要编写代码的地方只有一个文件,unit1.pas。后面我们就着重分析一下这个文件的结构。

注:unit文件保存的时候也可以选择扩展名为.pp。.pp和.pas文件的关系:.pp就是.pas文件。Delphi默认的源代码文件为.pas,而Lazarus的源代码文件为.pp。Lazarus为了兼容Delphi,可以支持这两种扩展名,所以除了扩展名不同意外它们没有任何区别。

下面是一个pas文件的代码,我做了些注释,可以很清晰地看出各个部分的作用。

pascal的代码文件不分.h或.c,都包含在了.pas文件中,使文件结构更加简洁。需要对外开放的函数或定义,只要写在implementation之上就可以了,代码编辑器在写入.后会自动提示可见的东西,不可见的则不会被显示。

结构说的差不多了,还是来看看pascal的语法吧。语法和C语言大同小异,只是把C里的{、}换成了begin、end,变量定义的名称和类型调换一下位置就算是会pascal了。呵呵,这样说法未免太不负责任,会遭到鄙视的。不过在语法上真的差别不大,差别最大的地方是pascal有类这个东西。而类的说明我希望留在下一节,结合ClassA20的类库来讲解,这样更容易接受。本节还是继续基础的东

西吧。

pascal不区分大小写,以下为本人的习惯写法,仅供参考。

1.数据类型:

C pascal
int Integer
short ShortInt
long LongInt
unsigned char Byte
unsigned short Word
unsigned long LongWord或DWORD
float Single
double Double或Real
  Boolean
*p Pointer
&p @p或Pointer(p);

想起来多少写多少,也许有错误,欢迎补充和指正。

2.操作符:

C pascal
= :=
+ +
- -
* *
/ div
% mod
<< shl
>> shr
& and
| or
! not
^ xor

想起来多少写多少,也许有错误,欢迎补充和指正。

3.循环语句:

c pascal
for (i = 0; i < 10; i++) for i:=0 to 9 do
while (1) ...; while (1) do ...;
do ... while (1); repeat ... until (1);

想起来多少写多少,也许有错误,欢迎补充和指正。

4.比较语句:

c pascal //有没有括号都可以
if (A == B) ... ; if A = B then ... ;
if (A || B) ... ; if A or B then ... ;
if (A && B) ... ; if A and B then ...;
switch (A)

{

case 1:

break;

case 2:

break;

default:

break;

}

case A of

1: ;

2: ;

else

end;

想起来多少写多少,也许有错误,欢迎补充和指正。

5.函数定义:

c pascal
void fun(); procedure fun;
int fun(); function fun:Integer;

想起来多少写多少,也许有错误,欢迎补充和指正。

6.着重说一下String:

C中没有字符串这个类型,只有字符数组char[],以‘\0‘结束。

pascal对字符串操作要强大很多,可以定义数组array of Char或array of Byte;

还有一个String类型。String即可以当错数组使用,也可以当成字符串使用,可以随时改变长度SetLength(String, 10),并且不需要手动释放当所在的函数生命周期结束后也就随之自动释放了(结构体中除外)。

数组转字符串:String(Byte数组或Char数组)

字符串转数组:String = @Byte数组[0];

取下标:Char:= String[1]; 或 Byte:= Ord(String[1]);

字符串相加:String:= String1 + String2;

字符串插入:Insert(String, SubString, Index);

字符串删除:Delete(String, Index, Count);

...

所以我一般在程序中都以String类型作为Buffer来进行传输或处理,操作很方便。

想起来多少写多少,也许有错误,欢迎补充和指正。

7.着重说一下异常处理:

C中没有异常处理。

pascal有try,try有两种:

try

//执行的代码部分

except

//异常处理部分

end;

当执行代码部分发生了任何执行失败,使用try可以不至于使整个程序崩溃停止运行,而是可以跳转到异常处理部分进行错误处理,或可以友好地提示用户。

try

//执行代码部分

finally

//强制执行部分

end;

无论在代码执行部分执行任何的打断或退出等语句,finally部分都会被执行到,一般用于释放资源或其他必要的处理。

两者可以结合使用:

try

try

//代码

except

//异常处理

end;

//代码

finally

//强制执行

end;

常用的东西基本上就是这些,下一节开始正式讲解ClassA20类库,敬请期待。

如果想下载ClassA20的封装类库文件,请访问:https://github.com/tjCFeng/ClassA20。

时间: 2024-10-27 00:51:14

【Allwinner ClassA20类库分析】 2.free pascal语法及结构简析的相关文章

【Allwinner ClassA20类库分析】9.WatchDog类的使用

WatchDog大家比较熟悉了,主要用于系统崩溃后的自动复位或主动复位的一种方式,在无人职守的系统中必不可少.但是一般的人机交互的系统中,它默认是被关闭的,要使用之前就要先打开它,下面就来看看它的使用方法.在使用之前,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. 特别要注意一下,要使用WatchDog,需要先打开OSC24M的时钟源,因为WatchDog就是靠它来计算时间的.好在系统默认已经是打开的不用重复操作,当然也可以手动指定一下.

【Allwinner ClassA20类库分析】3.ClassA20功能及结构

经过前两节的铺垫,在语法上估计没有问题了吧,现在正式进入ClassA20类库的环节. 首先先下载文件:https://github.com/tjCFeng/ClassA20,推荐直接下载zip文件.解压... A20.pas - 整个类库的基础,为计算映射地址的单元,不需要直接使用 Clock.pas - 打开关闭部分外设的时钟控制,不需要直接使用 GP.pas - 备份寄存器控制单元 GPIO.pas - GPIO控制单元 LRADC.pas - LRADC低精度ADC控制单元 PWM.pas

【Allwinner ClassA20类库分析】5.PWM类的使用

这一节讲述PWM类的使用方法,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. PWM,又一个典型的输出功能,是利用处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.它主要包括周期.脉冲宽度和占空比这几个概念.脉冲宽度就是高电平输出的时间,占空比就是低电平所占的百分比.而高电平与低电平时间的总和就是周期,所以我们主要设置脉冲宽度和占空比这两个数值(当然,一些基本的设置已经被封装好或使用默认值). 还是先来看一下类的定义,请打开PWM单

【Allwinner ClassA20类库分析】7.RTC类的使用

这一节要说的是RTC类的使用,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. RTC,实时时钟控制,如果有备份电池的存在,那么在系统关机断电后时间是不丢失的,并且还在走时.开机后可以直接读取出当前值,并设置为系统时间,这也是嵌入式开发中常常用到的东西.不过由于有了网络的介入,为了节省成本,一般也就使用网络的时间同步功能而忽略RTC了.不过在某些场合下还是可能会用到. RTC中一般会分为两个部分:一是日期时间的设置和读取,二是闹钟的设置和中断

【Allwinner ClassA20类库分析】8.GP类的使用

提到RTC,就不能不说备份寄存器的作用.一般情况下,在设置了RTC的时间后,都会在备份寄存器中做一个标志,表明当前时间已经被设置过,不需要重新设置:当没有检测到这个标志,则证明RTC曾经断过电,时间是不正确的.今天就来说已说备份寄存器类的用法.在使用之前,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. 备份寄存器,在Allwinner中叫做General Purpose.它具有和RTC一样的特性,就是断电后寄存器中的内容不消失,可以依靠RT

【Allwinner ClassA20类库分析】4.GPIO类的使用

从本节起,开始使用ClassA20类库完成操作外设的功能,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. 封装的目的就是简化操作,试想一下,如果想在Linux中直接设置GPIO寄存器需要做什么工作?基本上计算物理地址.获取映射地址.了解每个寄存器的作用.设置对应的位......很是繁琐.而使用了封装的类库之后,只需要这样做: 只要从原理图上找到了对应的IO口,其他的可以不必考虑,这种开发效率我就不多说了(说的这段时间IO口已经操作完了,呵呵

【Allwinner ClassA20类库分析】10.Temperature类的使用

有一段时间没有继续了,这几天一直在折腾BPI-R1和D1,暂时停了一下.不过应该继续写了,再不写我都想不起来了. 本来这篇打算作为一个小结的,结果尝试着把温度获取到了,所以插入一篇温度获取类,下一篇再当作暂时的结尾吧. 在使用之前,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. 这次要说的是温度获取类,调用的方法很简单,一句话就够了,直接写出来下面的文章就没法写了,还是先看看类的定义吧 同样是两个类,不过第一个是TouchPanel类寄存器

【Allwinner ClassA20类库分析】11.TWI类的使用

本篇作为ClassA20类库使用说明的一个小结,讲述一下TWI类的使用.相对于前面所有的类,TWI比较复杂一点.不过在封装之后,也还是直接调用即可.在使用之前,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. 为了突出实用性,还是制作一个应用程序当作示例,其功能是香蕉派电源管理程序. 香蕉派的电源管理芯片采用的是AXP209,通过TWI来控制.控制时需要指定AXP209的地址,并对AXP209中的寄存器赋值来获取或设置参数.如果没有十分的把握

【Allwinner ClassA20类库分析】 1.ARM上的Delphi - Lazarus

提起上位机上的Delphi,在以前可能熟悉的人很多,虽然前几年随着Borland公司的倒闭,使用Delphi的人越来越少,但是这并不能掩盖她先进的VCL框架.全能选手的光芒.在Windows平台上,无论从Win95,还是到Win8.1,编译过一次的exe文件可以在无需安装任何运行时库的情况下直接运行,曾经也是病毒编写优先考虑的语言:而在各种管理系统的开发中,Delphi也是开发效率运.行效率极其优秀的语言.只是由于Borland公司过度捆绑Windows的策略,使其应用于其他平台的机会大大减少.