当前位置:文档之家› 《嵌入式软件开发》课程设计报告

《嵌入式软件开发》课程设计报告

《嵌入式软件开发》课程设计报告课题名称:基于ARM11开发平台小球碰撞设计与实现
专业班级:计算机科学与技术
目录
1、使用技术介绍 (1)
2、需求分析 (3)
3、概要设计 (4)
4、详细设计 (5)
5、成果展示 (11)
6、设计总结 (13)
7、附录 (16)
图1.2
1.3 五点校准法
为了方便理解,我们首先引入2个概念,坐标和逻辑坐标。

物理坐标就是触摸屏上点的实际位置,我们通常以液晶上点的个数来度量。

逻辑坐标就是触摸屏上这一点被触摸时A/D转换后的坐标值。

由于电阻式触摸屏的电压成线性均匀分布,那么A/D转换后的坐标也成线性。

假如我们将液晶最左下角点对应的解摸屏上的点定为物理坐标原点A其物理坐标记为(XA=0,YA=0),其逻辑坐标记为(XLA,YLA)(不一定为0)。

那么触摸屏上任意一点B的逻辑坐标可表达为:XLB=XLA+KXXB,YLB=YLA+KYYB。

其中KX、KY分别为触摸屏X方向和Y方向的因子系数,这就像弹簧一样,拉力与弹簧伸长正比。

KX、KY可能为正,也可能为负,这根据具体触摸屏安装的方向和特性。

每个液晶触摸屏,我们也应该单独计算每一个触摸屏的K系数。

如果A点不是坐标原点,也是任意一点可以表达成:XLB=XLA+KX(XB-XA),YLB=YLA+KY(YB-YA)。

我们可以推出计算K系统的公式:KX=(XLB-XLA)/(XB-XA),KY=(YLB-YLA)/(YB-YA)。

在液晶上固定的位置显示五个点,因为是固定的位置,所以这五个点的物理坐标是预知的。

这五个点不应太靠边,因为边缘点对应的触摸屏线性一般不太好。

(1)首先在ABCDE对应的位置逐步用尖状物触摸,得到五个点的逻辑坐标。

(2)分别比较A和C、B和D的横坐标,如果差值不在允许范围(你自己规定一个即可,比如5),则重复操作(1)(2)步。

(3)分别比较A和B、C和D的纵坐标,如果差值不在允许范围(你自己规定一个即可,比如5),则重复操作(1)(2)(3)步。

(4)用2组数据计算X向K系数平均值KX={(XLB-XLA)/(XB-XA)+(XLD-XLD)/(XD-XC)}/2(5)用2组数据计算Y系数平均值KY={(YLA-YLC)/(YA-YC)+(YLB-YLD)/(YB-YD)}/2(6)将C点逻辑坐标作为基坐标,根据式2-2则触摸屏上任意一点F逻辑坐标与基坐标的关系为:XLF=XLC+KX(XF-XC)
YLF=YLC+KY(YF-YC)
根据这个公式,我们也可逆推出F点的物理坐标XF=(XLF-XLC)/KX+XC
YF=(YLF-YLC)/KY+YC
(7)用公式2-4求出E点逻辑坐标,并与(1)步得到的E点坐标比较,如果差值不在允许范围(你自己规定一个即可,比如5),则重复操作以上步骤直到满足要求。

(8)将基坐标XLC、YLC、XC、YC和KX、KY记录在存储设备,触摸屏校正完成。

二、需求分析
2.1 功能需求
主要功能:实验设计在基于嵌入式Linux操作系统,arm11开发平台上进行相关操作,要求在LCD显示屏内,分别控制2个不同颜色的小球在LCD屏矩形显示区内不停地运动,当小球碰到边界时,反射改变运动方向,当两个小球相碰时,小球改变运动方向,并统计碰撞的次数。

图2.1 小球碰撞界面
2.2 界面需求
实验界面简洁,显示为一个矩形边框,界面中有两个个小球,小球通过撞击边框和相互碰撞不断运动。

开始碰撞:运行程序会出现小球碰撞程序主界面,如图2.2,点击开始碰撞进入小球碰撞程序;
退出:点击退出,返回退出小球碰撞界面,如图2.3
图2.2 程序主界面
图2.主界面
图2.3 退出小球碰撞界面
三、概要设计
3.1 系统组成
小球碰撞系统基于ARM11平台,利用Linux系统的调用和PC机的调试通过使用触摸屏在LED显示屏上显示两个小球相撞。

如图3.1
图3.1 系统组成图
1.ARM11处理:采用real6410基于ARM11嵌入式处理器内核,主频800MHz;
2.LCD显示器:4.3寸,分辨率480ⅹ272,16位RGB565彩色;
3.触摸屏:电阻式,支持4096ⅹ4096;
4.网络:以太网,支持100Mbps,TCP/IP协议;
3.2 功能模块
工程文件夹:ball
头文件程序:gui.h;ts.h
主控模块:main.c
触摸校准模块:ts.c
通过主控模块main.c来调用图形库gui.h和校准模块ts.c,以及小球碰撞函数,来在显示屏上实现小球碰撞功能,如图3.2。

图3.2 功能模块图
图4.1 main函数流程图
4.2 ball_move()函数:
void ball_move()函数:实现画出小球并让小球运动,当两个小球碰壁或相撞时,小球向反方向弹开并计算碰撞次数,运动到初始位置时,小球停止。

如图4.2 函数原型:void ball_move(ball_t *b )
输入参数:b 结构体指针类型通过b的值来判断小球碰撞的次数
返回值:无返回值
小球运动算法:
1)初始化:
w=480; h=272;
x=old_x=100; y=old_y=100; r=16;
x_dir = 1; y_dir = -1;
2)如果x <= r,则x_dir = 1 碰到左边界,向右运动;
3)如果x+r >= w,则 x_dir = -1 碰到右边界,向左运动;
4)如果y<=r,则y_dir = 1 碰到上边界,向下运动;
5)如果y+r >= h则y_dir = -1 碰到下边界,向上运动;
6)更新圆心坐标:x += x_dir; y += y_dir;
7)在原来位置用背景色画(即清除);
8)在新位置用前景色画圆;
9)延时一段时间,使圆停留在屏幕上显示;
10)old_x = x; old_y = y;
11)如果运动到初始位置,则退出,否则跳转到2)
图4.2 ball_move函数流程图
4.3 get_hotpoint(int x, int y)函数:
get_hotpoint()函数:获得触摸屏幕上的热点,并判断是不是点击相应的位置,是返回一个值,不是返回-1,如图4.3
函数原型:get_hotpoint(int x, int y);
输入参数:x 整型,获得x坐标
y 整型,获得y坐标。

返回值:整型,返回r->v表示正常,返回-1表示异常
图4.3 获得热点函数流程图
4.4 小球函数所需要的相关函数
1)创建子进程fork():
一个进程,包括代码、数据和分配给进程的资源。

pid_t pid;
pid = fork(); //创建子进程
if (pid == -1) exit(-1); //创建失败
if (pid == 0)
{
//子进程
}
else
{
//父进程
}
2)延时函数usleep():
函数原型:
int usleep(useconds_t usec);
参数:
usec : 延时时间值,微秒。

包含头文件
#include <unistd.h>
3)进程之间共享内存通信:
创建或获取一个共享内存:
命令格式:
shmget(key,size,flag)
功能:
获得一个内部标识为shmid的共享存储区
语句格式:
Int shmid = int shmget(key_t key, int size, int flag );
参数说明:
key——共享存储区关键字,可以由用户指定,如果使用IPC_PRIVATE,其值由系统产生size——存储区的大小(字节数)。

如果存储区定义为字符型,则大小为定义的字符个数;如果存储区定义为整型,大小可以使用sizeof(int)加以定义。

flag——用户设置的标志或访问方式,与消息缓冲shmget中的含义相同,在实验中,可以使用0666|IPC_CREAT,表示任意进程可读写。

返回值:
正确返回:共享存储区的内部标识符shmid
错误返回:-1
4)将共享内存附接到进程虚拟地址空间:
五、成果展示
5.1 将相关的图片、驱动拷贝到用户目录下
图5.1 拷贝文件5.2 编译程序
图5.2 编译程序
5.3 连接目标机,运行程序
图5.3 运行程序5.4 登录界面展示
图5.4 登录界面5.5 小球碰撞界面展示
图5.5 小球碰撞界面
5.6 退出界面展示
图5.6 退出界面六、设计总结
七、附录
7.1 主函数程序
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "gui.h"
#include "ts.h"
#define K_SIZE 4
typedef struct{
int x,y,r,c;。

相关主题