SDCC可从http://sdcc.sourceforge.net下载得到。本文使用的版本为sdcc-win32 2.8.0,具体安装方法和步骤参考sdccman.pdf手册。安装完后,在C8051F340平台上编译FreeRTOS的SDCC选项,如表2所列。
3 在门禁系统中使用FreeRTOS
FreeRTOS移植完成后,成功地在开发的门禁系统中得到了应用验证。该门禁系统实现的功能主要有:实现刷ID卡开门,利用键盘输入住户号和密码开门,住户数据使用GPRS服务通信实现数据远程管理等。
硬件系统主要由C8051F340单片机、ID卡读卡模块、GPRS模块、键盘/显示模块和存储器模块等组成,系统结构如图3所示。
系统软件上如果使用传统的前后台程序设计思路,则程序结构复杂,设计周期长,测试困难。使用实时操作系统,可将系统按功能和设备依赖性的原则划分为不同的任务,各个任务可以看作是并行执行,任务之间使用实时操作系统提供的API实现存储器互斥访问和其他资源的同步等,可以较好地满足该系统的需求。
根据系统的功能,建立3个任务:ID卡读卡处理任务、键盘/显示任务和GPRS数据通信处理任务。各个任务的功能如下:
①ID卡读卡处理任务vIdTask。ID卡读卡任务主要完成ID卡卡号的读取和识别等功能,优先级最高。
②键盘/显示任务vKeyDispTask。键盘/显示模块主要完成人机交互和日期的显示,错误信息的提示等,优先级次之。
③GPRS数据通信处理任务vG-PRSTask。GPRS数据通信任务主要完成与管理端GPRS模块的通信连接和GPRS协议数据的处理等,优先级最低。
另外,GPRS模块使用串行通信口与C8051F340通信,串口的接收程序采用中断服务程序,不受操作系统的管理。当收到对应的信息时,向GPRS数据通信处理任务发送消息,GPRS数据通信处理任务再进行处理。建立的三个任务都有可能同时读写存储器,因此建立一个互斥信号量,当需要操作存储器时,先得到这个信号量,存储器操作完毕后再释放这个信号量。ID卡读卡处理任务的代码中互斥信号量的使用如下:
系统主函数主要完成硬件初始化,建立信号量、任务和各个任务的启动等。部分代码实现如下:
4 结 论
使用SDCC编译器和FreeRTOS操作系统等免费资源开发系统程序,能够减少工作量,降低开发成本,具有很大的优势。SDCC编译器应用灵活,配置方便,FreeRTOS经过修改裁减后,代码精简,结构紧凑,适合于小型嵌入式系统应用。作者在门禁系统中应用得到成功的验证;但是SDCC和 FreeRTOS仍有许多缺点,如SDCC没有IDE,编译配置选项复杂,FreeRTOS提供的服务功能有限等。