1 / 57

嵌入式系统程序设计

嵌入式系统程序设计. 大连理工大学软件学院 嵌入式系统工程系 赖晓晨. 嵌入式系统程序设计实例. 本章旨在使用英倍特 Embest Edukit-Ⅲ 型教学实验平台和嵌入式 Linux 操作系统完成自动电梯模拟控制系统的设计和实现. 嵌入式系统程序设计实例. 背景介绍 系统架构 详细设计 系统函数说明 系统演示. 一、背景介绍.

jason
Download Presentation

嵌入式系统程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 嵌入式系统程序设计 大连理工大学软件学院 嵌入式系统工程系 赖晓晨

  2. 嵌入式系统程序设计实例 • 本章旨在使用英倍特Embest Edukit-Ⅲ型教学实验平台和嵌入式Linux操作系统完成自动电梯模拟控制系统的设计和实现

  3. 嵌入式系统程序设计实例 • 背景介绍 • 系统架构 • 详细设计 • 系统函数说明 • 系统演示

  4. 一、背景介绍 • 系统目标机硬件采用Embest EduKit-III型开发板,S3C2410X处理器,目标机系统软件采用mizi Linux操作系统。方便起见,宿主机软件使用Cygwin模拟Linux系统,交叉编译工具链采用arm-linux-gcc,版本号为2.95.3。Embest EduKit-III型开发板有分辨率为320×240的LCD显示器,以及4行5列小键盘,键盘布局如下图所示:

  5. 背景介绍(续)

  6. 背景介绍(续) • 本程序模拟8层楼间(地下1层,地上7层)单部电梯运送乘客的整个工作过程。 • 利用实验设备的键盘模拟电梯内部和外部的按键,利用LCD显示器绘制电梯运行过程以及状态和提示信息

  7. 背景介绍(续) • 系统功能: • 每层电梯入口处设有上行、下行请求按钮,电梯内设有乘客请求停战的楼层呼叫按钮 • 有电梯所处位置指示设置,电梯上行、下行状态指示装置,所有系统请求信息指示装置 • 每隔一段时间,电梯上升或是下降一层楼,同时显示电梯上升和下降的信息 • 电梯到达有停站的楼层后,该楼层有指示装置表明到达了停站请求楼层,电梯切换为开门状态 • 系统能够记忆电梯内、外部的所有请求信号,并按照电梯运行规则依次相应这些请求,每个请求信号保留至执行后撤除

  8. 背景介绍(续) • 为了实现电梯运行的正确逻辑,制定以下规则: • 电梯接通电源时,电梯必须停留在最底层 • 电梯可以到达所在楼宇的每一层,但是电梯只能在该楼宇的最低层至最高层之间运行 • 严格规定电梯内部的信号优先级高于电梯外部的请求信号 • 电梯处于上升模式时,只响应比电梯所在位置高的楼层的上楼请求信号,而保留下楼信号,由下而上逐个执行;直到最后一个执行完毕,再执行下楼请求信号 • 电梯处于下降模式时与上升模式相反 • 电梯执行完所有请求后,应保留在所在的楼层保持不动,等待新的请求

  9. 二、系统架构 • 系统总体结构 • 初始化模块 • 电梯控制模块 • 按键输入模块 • LCD显示模块

  10. 系统架构(续) • 系统总体结构图

  11. 系统架构(续) • 初始化模块 • 基础模块,负责初始化电梯算法的数据结构,同时初始化显示界面,给用户提示信息和操作说明:

  12. 系统架构(续) • 电梯控制模块 • 关键模块,负责电梯当前状态,根据电梯状态派遣电梯执行停止、运行、开门、关门等任务; • 流程图

  13. 系统架构(续) • 按键输入模块 • 4X5小键盘作为输入端,乘客通过按键模拟的电梯按钮向系统输入请求信息。系统使用0-7这8个按键模拟八个楼层按钮,+和-这2个按键模拟电梯外部的上、下行请求按钮,A和B按键用于指示发出的请求来自于电梯内部还是外部,E代表输入确认键,*键代表程序结束。按键定义如下表所示:

  14. 系统架构(续)

  15. 系统架构(续) • 电梯内部 • 0-7八个按键,模拟8个楼层,不设置开门和关门按钮; • 电梯外部 • 除地下一层和顶层之外,每层都有一个上行按钮和一个下行按钮; • 特殊使用规则 • 系统用按键A和B判断乘客发出的请求是来自电梯内部还是电梯外部。

  16. 系统架构(续) • 使用步骤: • 输入A或是B; • 输入0-7:如果输入A,0-7表示内部乘客请求到达的楼层;如果输入B,表示外部乘客发出请求时位于的楼层; • 第2步中如输入B,需要接着输入+或-,表示外部乘客的上下行方向情况,第2步输入0时不能输入-,输入7时不能输入+; • 输入E确认。

  17. 系统架构(续) • LCD显示模块 • 本模块通过LCD显示电梯目前的运行信息 • 电梯状态 • 当前位置 • 电梯内部和外部请求信息 • 电梯运行的动态效果 • 乘客请求的英文缩写解释

  18. 系统架构(续) • 系统运行界面

  19. 系统架构(续) • 程序主界面按照显示功能被划分为四大区域,从左到右依次为: • 电梯信息显示区域,这个区域位于显示屏最左侧,显示电梯状态、电梯方向、电梯位置等信息; • 乘客请求信息显示区域,这个区域位于屏幕中部,该栏的字母和数字具体代表意义参照下表;

  20. 系统架构(续)

  21. 系统架构(续) • 电梯动态效果图,本图紧邻请求信息显示区域,图中方块代表一个楼层,当电梯运行时,方块位置会发生相应的动态变化。 • 主界面信息说明区域,这个区域位于屏幕最右侧,列出了乘客请求信息显示区中字母简写对应的英文单词。

  22. 三、详细设计 • 数据结构描述 • 电梯运行算法设计 • 输入输出部分设计

  23. 1. 数据结构描述 • 自动电梯控制系统的4个模块中,因为初始化部分工作较少,可以把它和算法模块合并在一起,即包含主函数的模块(Elevator.c、Elevator.h);系统还包括按键输入模块(Key.c、Key.h)、LCD显示模块(Lcd.c、Lcd.h),以及几个资源文件,分别为:24×24点阵字模文件(Hzk24.c)、ASC码8×8点阵字模文件(Font.c)、开机初始图片资源文件(Frame.c)、启动界面背景图片资源文件(Title.c)。

  24. A. 电梯状态算法模块数据结构 /* Elevator.h */ /* 电梯状态:开、关、运行、停止 */ typedef enum Status { open, close, run, stop }STATUS;

  25. /* 电梯外部请求:向上、向下、向上并且向下、无请求 *//* 电梯外部请求:向上、向下、向上并且向下、无请求 */ typedef enum OUTReqType { up_request, down_request, both_request, no_request, }OUTREQTYPE; /* 电梯运行方向:向上、向下、无 */ typedef enum dir { upward, downward, still, }DIRECTION;

  26. /* 当前电梯请求结构类型:内部请求、外部请求 *//* 当前电梯请求结构类型:内部请求、外部请求 */ typedef struct Request { int inReq; OUTREQTYPE outReq; }REQUEST; /* 电梯信息结构类型:运行方向、当前层数、运行状态、长度为楼层数的请求数组*/ typedef struct ElevatorInfo { DIRECTION Direction; //电梯方向 int Floor; //电梯楼层 STATUS Status; //电梯状态 REQUEST Request[MAX_FLOOR]; //楼层请求数组 }ELEVATORINFO;

  27. B. 按键输入模块数据结构 /* 当前乘客按键请求结构类型 */ typedef struct key { int judge; //按键类型:取值可为内部按键(A)、外部按键(B) //确认按键(E)、退出按键(*) int floor; //内部按键请求到达的楼层:(0-7) char direction; //外部按键确定的电梯运行方向:上行 //(+)、下行(-) int location; //外部按键所处在的楼层:(0-7) }KEY;

  28. C. LCD显示模块数据结构 typedef struct fbdev { int fb; unsigned long fb_mem_offset; unsigned long fb_mem; struct fb_fix_screeninfo fb_fix; //设备无关的常值信息 struct fb_var_screeninfo fb_var; //设备无关的数据信息 char dev[20]; } FBDEV, *PFBDEV;

  29. C. 其他数据结构 const uint8_t title[]; //存放系统提示界面背景图片的数组 extern const uint8_t frame[]; //存放系统欢迎界面和退出界面 //图片的数组 const uint8_t g_auc_hzk24[]; //存放一个汉字24×24点阵字 //模的数组 const uint8_t fontdata_8x8[]; //存放一个ASC码8×8点阵字 //模的数组

  30. 2. 电梯运行算法设计 • 根据电梯运行流程,把电梯分为停止、运行、开门、关门四种控制状态,如下图所示。停止状态是指电梯在没有任何请求的情况下的静止状态,而不是指电梯在运行过程中开门前的停顿状况。我们忽略停顿状况,把电梯从运行状态直接迁移为开门状态。

  31. 电梯控制状态转移图

  32. 电梯控制状态转移图(续) • 系统初始时,电梯处于停止状态。 • 电梯处于停止状态时,根据发出请求的楼层不同可以分别迁移到运行或者开门两个不同状态。 • 电梯处于运行状态时,如果没有到达请求楼层发生自迁移,即保持运行状态不变;当到达请求楼层时,迁移到开门状态。

  33. 电梯控制状态转移图(续) • 电梯处于开门状态一段时间后必然迁移到关门状态。 • 电梯处于关门状态时可以根据是否有请求迁移到运行状态或者迁移到停止状态。

  34. 电梯状态处理伪代码 • 电梯各个状态的处理过程,可以依靠电梯派遣函数,根据通过判定电梯信息结构体中的电梯状态,调用相应控制状态的函数来控制电梯的运行,伪代码如下: • 派遣函数(void) • { • switch(电梯运行状态) • {

  35. case 停止状态: • 停止处理函数; • break; • case 运行状态: • 运行处理函数; • break; • case 开门状态: • 开门处理函数; • break; • case 关门状态: • 关门处理函数; • break; • default: break; • } • }

  36. 电梯停止状态流程图

  37. 电梯运行状态流程图

  38. 电梯开门状态流程图

  39. 电梯关门状态流程图

  40. 3. 输入输出部分设计 • LCD输出模块负责显示系统的4个图形界面:系统欢迎界面、系统提示界面、系统运行界面和系统退出界面。 • 系统欢迎界面和系统退出界面分别显示一幅图片及相关文字; • 系统主要工作在系统运行界面下。

  41. 输入输出部分设计(续) • 按键输入模块的主要功能有三个:设置键盘键值;扫描键盘,采集按键信息;获取乘客请求结构体信息,并对这些信息进行封装、判断、转换等一系列的处理。

  42. 输入输出部分设计(续) • 在设计当中,为了使键盘部分能够及时有效的响应,目标机上接有键盘专用芯片ZLG7290。键盘的动作由芯片ZLG7290检测,当键盘按下时,芯片检测到后在INT引脚产生中断触发电平通知处理器,处理器通过I2C总线读取芯片ZLG7290键值寄存器中保留的键值。

  43. 输入输出部分设计(续) • 在设计当中,为了使键盘部分能够及时有效的响应,目标机上接有键盘专用芯片ZLG7290。键盘的动作由芯片ZLG7290检测,当键盘按下时,芯片检测到后在INT引脚产生中断触发电平通知处理器,处理器通过I2C总线读取芯片ZLG7290键值寄存器中保留的键值。

  44. 输入输出部分设计(续) • 键盘获得的输入信息繁多而复杂,需要对这些信息进行处理,该过程分为两个步骤: • 首先,对信息进行筛选和封装。由于键盘信息扫描检测函数不断地等待按键被按下,而用户使用键盘输入信息是随机的,所以需要对按键信息进行筛选,保留用户有效按键值。 • 由于系统使用规则的限制,每次用户发出的请求,并不能由单个按键完成,需要组合使用按键,所以需要把筛选出的多个有效键值一一封装在乘客请求信息结构体中存储。

  45. 四、系统函数说明 • 电梯控制算法模块 • 按键输入模块 • LCD输出模块 • 其他函数

  46. 1. 电梯控制算法模块 • main():主函数。首先完成设备初始化,包括打开Framebuffer和i2c设备,调用InitSystem()函数初始化系统数据结构和LCD,然后在循环中不断检测按键组合,如有乘客请求则通过派遣函数处理请求,然后完成显示,当用户输入*时循环结束,显示系统退出界面,完成系统清理工作退出程序。 • InitSystem():系统初始化函数。调用InitElevator()函数初始化电梯信息结构类型数据结构,调用InitLcd()函数初始化LCD。

  47. 电梯控制算法模块(续) • InitElevator():电梯信息结构初始化函数。初始化电梯信息结构类型变量ElevatorInfo。 • InitLcd():LCD初始化函数。通过写Framebuffer在LCD绘制系统提示界面。 • Dispatch():状态派遣函数。根据电梯当前状态,调用不同状态处理函数。

  48. 电梯控制算法模块(续) • ElevatorStop():电梯停止状态处理函数。 • ElevatorRun():电梯运行状态处理函数。 • ElevatorOpen():电梯开门状态处理函数。 • ElevatorClose():电梯关门状态处理函数。

  49. 电梯控制算法模块(续) • KeyCheck():用户信息转换函数。把乘客按键请求信息结构体key中的信息映射至电梯信息结构体ElevatorInfo,设置电梯运行状态。 • Display():运行界面显示函数。显示系统运行界面。 • ExitShow():退出界面显示函数。显示系统退出界面。

More Related