嵌入式系统程序设计实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、系统架构
系统总体结构
初始化模块 电梯控制模块 按键输入模块 LCD显示模块
系统架构(续)
系统总体结构图
系统架构(续)
初始化模块
基础模块,负责初始化电梯算法的数据结 构,同时初始化显示界面,给用户提示信 息和操作说明:
系统架构(续)
电梯控制模块
关键模块,负责电梯当前状态,根据电梯 状态派遣电梯执行停止、运行、开门、关 门等任务;
系统架构(续)
LCD显示模块
本模块通过LCD显示电梯目前的运行信 息
电梯状态 当前位置 电梯内部和外部请求信息 电梯运行的动态效果 乘客请求的英文缩写解释
系统架构(续)
系统运行界面
系统架构(续)
程序主界面按照显示功能被划分为四 大区域,从左到右依次为:
电梯信息显示区域,这个区域位于显示屏 最左侧,显示电梯状态、电梯方向、电梯 位置等信息; 乘客请求信息显示区域,这个区域位于屏 幕中部,该栏的字母和数字具体代表意义 参照下表;
返回
Fra Baidu bibliotek
电梯开门状态流程图
开始 改变状态为关门 Y 向上和向下都 有外部请求? Y 外部请求置为向下 N N 只有向上或向 下外部请求? Y 外部请求置为空 N 电梯当前状态 为向上运行? N 电梯当前状态 为向下运行? Y 向上和向下都 有外部请求? Y 外部请求置为向上 外部请求置为空 N
开始
电梯关门状态流程图
流程图
系统架构(续)
按键输入模块
4X5小键盘作为输入端,乘客通过按键 模拟的电梯按钮向系统输入请求信息。系 统使用0-7这8个按键模拟八个楼层按 钮,+和-这2个按键模拟电梯外部的上、 下行请求按钮,A和B按键用于指示发出 的请求来自于电梯内部还是外部,E代表 输入确认键,*键代表程序结束。按键定 义如下表所示:
REQUEST Request[MAX_FLOOR]; }ELEVATORINFO;
B. 按键输入模块数据结构
/* 当前乘客按键请求结构类型 typedef struct key { int judge; //按键类型:取值可为内部按键(A)、外部按键(B) //确认按键(E)、退出按键(*) */
int floor;
char direction;
//内部按键请求到达的楼层:(0-7)
//外部按键确定的电梯运行方向:上行 //(+)、下行(-)
int location;
}KEY;
//外部按键所处在的楼层:(0-7)
C. LCD显示模块数据结构
typedef struct fbdev { int fb; unsigned long fb_mem_offset; unsigned long fb_mem;
输入输出部分设计(续)
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)。
系统功能:
每层电梯入口处设有上行、下行请求按钮,电梯 内设有乘客请求停战的楼层呼叫按钮 有电梯所处位置指示设置,电梯上行、下行状态 指示装置,所有系统请求信息指示装置 每隔一段时间,电梯上升或是下降一层楼,同时 显示电梯上升和下降的信息 电梯到达有停站的楼层后,该楼层有指示装置表 明到达了停站请求楼层,电梯切换为开门状态 系统能够记忆电梯内、外部的所有请求信号,并 按照电梯运行规则依次相应这些请求,每个请求 信号保留至执行后撤除
背景介绍(续)
0 5 A F 1 6 B + 2 7 C 3 8 D * 4 0 E FUN
背景介绍(续)
本程序模拟8层楼间(地下1层, 地上7层)单部电梯运送乘客的整 个工作过程。 利用实验设备的键盘模拟电梯内部 和外部的按键,利用LCD显示器 绘制电梯运行过程以及状态和提示 信息
背景介绍(续)
{ switch(电梯运行状态) {
case 停止状态: 停止处理函数; break; case 运行状态: 运行处理函数;
break;
case 开门状态: 开门处理函数;
break;
case 关门状态: 关门处理函数; break; default: break; } }
电梯停止状态流程图
开始 当前楼层 有请求? N 上方楼层 有请求? N 向上扫描 到顶? Y 定位到底层 改变方向为向 上,状态为运行 改变状态 为开门 Y Y
A. 电梯状态算法模块数据结构
/* Elevator.h */ */ /* 电梯状态:开、关、运行、停止 typedef enum Status { open,
close,
run, stop
}STATUS;
/* 电梯外部请求:向上、向下、向上并且向下、无请求 */ typedef enum OUTReqType { up_request, down_request,
开始 上 当前层上层有内 部请求?外部向 上请求?外部向 上和向下请求? N 当前运行 方向? Y Y 下 当前层下层有内 部请求?外部向 下请求?外部向 下和向上请求? N
改变状态为运行 改变状态为运行
Y
当前层下层有 内部请求?外 部向下请求? 外部向下和向 上请求? N 改变状态为无方 向、停止
电梯控制状态转移图(续)
电梯处于开门状态一段时间后必然迁 移到关门状态。 电梯处于关门状态时可以根据是否有 请求迁移到运行状态或者迁移到停止 状态。
电梯状态处理伪代码
电梯各个状态的处理过程,可以依靠 电梯派遣函数,根据通过判定电梯信 息结构体中的电梯状态,调用相应控 制状态的函数来控制电梯的运行,伪 代码如下: 派遣函数(void)
struct fb_fix_screeninfo fb_fix;
char dev[20];
//设备无关的常值信息
struct fb_var_screeninfo fb_var; //设备无关的数据信息
} FBDEV, *PFBDEV;
C. 其他数据结构
const uint8_t title[]; 面 const uint8_t g_auc_hzk24[]; //存放系统提示界面背景图片的数组 //存放系统欢迎界面和退出界 //图片的数组 //存放一个汉字24×24点阵字 //模的数组 extern const uint8_t frame[];
const uint8_t fontdata_8x8[];
//存放一个ASC码8×8点阵字
//模的数组
2. 电梯运行算法设计
根据电梯运行流程,把电梯分为停止、 运行、开门、关门四种控制状态,如 下图所示。停止状态是指电梯在没有 任何请求的情况下的静止状态,而不 是指电梯在运行过程中开门前的停顿 状况。我们忽略停顿状况,把电梯从 运行状态直接迁移为开门状态。
both_request,
no_request, }OUTREQTYPE;
/* 电梯运行方向:向上、向下、无
typedef enum dir { upward, downward, still, }DIRECTION;
*/
/* 当前电梯请求结构类型:内部请求、外部请求 */ typedef struct Request { int inReq; OUTREQTYPE outReq;
当前层有内部请 求?外部向下请 求?外部向下和 向上请求? N 当前层下方有 内外请求? N 当前层有外部 向上请求? N 当前层上方有 内外请求? N
改变状态为开门 Y 当前层上移一层 Y 改变状态为开门 Y 改变状态为向下
改变状态为开门 Y 当前层下移一层 Y 改变状态为开门 Y 改变状态为向上
电梯控制状态转移图
有呼叫请求 电梯所在楼层 有呼叫请求 有呼叫请求 关门状态 乘客进入电梯
运行状态 到达请 求楼层
停止状态
无呼叫请求
开门状态
电梯控制状态转移图(续)
系统初始时,电梯处于停止状态。 电梯处于停止状态时,根据发出请求 的楼层不同可以分别迁移到运行或者 开门两个不同状态。 电梯处于运行状态时,如果没有到达 请求楼层发生自迁移,即保持运行状 态不变;当到达请求楼层时,迁移到 开门状态。
背景介绍(续)
为了实现电梯运行的正确逻辑,制定以下规则:
电梯接通电源时,电梯必须停留在最底层 电梯可以到达所在楼宇的每一层,但是电梯只能在该楼 宇的最低层至最高层之间运行 严格规定电梯内部的信号优先级高于电梯外部的请求信 号 电梯处于上升模式时,只响应比电梯所在位置高的楼层 的上楼请求信号,而保留下楼信号,由下而上逐个执行; 直到最后一个执行完毕,再执行下楼请求信号 电梯处于下降模式时与上升模式相反 电梯执行完所有请求后,应保留在所在的楼层保持不动, 等待新的请求
系统架构(续)
系统架构(续)
电梯动态效果图,本图紧邻请求信息显示 区域,图中方块代表一个楼层,当电梯运 行时,方块位置会发生相应的动态变化。 主界面信息说明区域,这个区域位于屏幕 最右侧,列出了乘客请求信息显示区中字 母简写对应的英文单词。
三、详细设计
数据结构描述 电梯运行算法设计 输入输出部分设计
}REQUEST;
/* 电梯信息结构类型:运行方向、当前层数、运行状态、长度为楼层数的 请求数组*/
typedef struct ElevatorInfo
{ DIRECTION Direction; int Floor; STATUS Status; //电梯方向 //电梯状态 //楼层请求数组 //电梯楼层
N
Y
上方楼层 有请求? N 向上扫描 N 到当前层? Y 返回
改变方向为向 下,状态为运行
电梯运行状态流程图
开始 上 当前运行 方向? 下
当前层有内部请 求?外部向上请 求?外部向上和 向下请求? N 当前层上方有 内外请求? N 当前层有外部 向下请求? N 当前层下方有 内外请求? N
N Y Y
系统架构(续)
系统架构(续)
电梯内部 电梯外部
除地下一层和顶层之外,每层都有一个上 行按钮和一个下行按钮; 0-7八个按键,模拟8个楼层,不设置开 门和关门按钮;
特殊使用规则
系统用按键A和B判断乘客发出的请求是 来自电梯内部还是电梯外部。
系统架构(续)
使用步骤:
输入A或是B; 输入0-7:如果输入A,0-7表示内部乘 客请求到达的楼层;如果输入B,表示外 部乘客发出请求时位于的楼层; 第2步中如输入B,需要接着输入+或-, 表示外部乘客的上下行方向情况,第2步 输入0时不能输入-,输入7时不能输入 +; 输入E确认。
当前层上层有 内部请求?外 部向上请求? 外部向下和向 上请求? N 改变状态为无方 向、停止
Y
改变状态为向上 运行
改变状态为向下 运行
返回
3. 输入输出部分设计
LCD输出模块负责显示系统的4个图形 界面:系统欢迎界面、系统提示界面、 系统运行界面和系统退出界面。
系统欢迎界面和系统退出界面分别显示一 幅图片及相关文字; 系统主要工作在系统运行界面下。
嵌入式系统程序设计
嵌入式系统程序设计实例
本章旨在使用英倍特Embest Edukit-Ⅲ型教学实验平台和嵌入式 Linux操作系统完成自动电梯模拟控 制系统的设计和实现
嵌入式系统程序设计实例
背景介绍 系统架构 详细设计 系统函数说明 系统演示
一、背景介绍
系统目标机硬件采用Embest EduKitIII型开发板,S3C2410X处理器,目标 机系统软件采用mizi Linux操作系统。方 便起见,宿主机软件使用Cygwin模拟 Linux系统,交叉编译工具链采用armlinux-gcc,版本号为2.95.3。Embest EduKit-III型开发板有分辨率为 320×240的LCD显示器,以及4行5列小 键盘,键盘布局如下图所示: