第一篇:嵌入式课程设计初稿
嵌入式课程设计报告
福建工程学院
《嵌入式系统》课程设计
报告书
题目:
基于S3C2440设备驱动及其界面设计
班级:
姓名:
学号:
指导老师:
陈靖,张平均,李光炀
目
录
一、设计课题 ............................................................................................................................... 4
二、设计目的 ............................................................................................................................... 4
三、设计任务及要求 ................................................................................................................... 4
四、设计内容 ............................................................................................................................... 5
五、操作界面的生成 ................................................................................................................... 7
六、操作界面调试 ....................................................................................................................... 9
七、设计总结 ............................................................................................................................. 10
八、设计参考书 ......................................................................................................................... 12
九、附件(程序) ..................................................................................................................... 13
一、设计课题
基于S3C2440的设备驱动及其界面设计
二、设计目的:
1.进一步巩固嵌入式系统的基本知识; 2.掌握嵌入式应用系统的基本结构; 3.掌握嵌入式系统开发环境建立和使用;
4.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法; 5.学会查阅有关专业资料及设计手册; 6.MiniGUI界面编程。
三、设计任务及要求:
1.掌握嵌入式系统开发环境建立和使用;
2.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
3、MiniGUI在PC上的安装、移植
4、Linux基本输入输出驱动程序设计编译与移植
5、基于MiniGUI的基本输入输出应用编程编译与移植
6、编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;
7、绘制有关图纸.
四、设计内容:
1、 基础知识准备
1)讲解设计任务; 2)熟悉ubuntu的使用; 3)熟悉TQ2440试验系统的使用; 4)掌握嵌入式系统开发环境建立和使用;
5)掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法.
2、界面设计环境构建:MiniGUI在PC上的安装、移植
2.1、MiniGUI在pc机上安装和运行
建立工作目录:mkdir /minigui-free
cd /minigui-free mkdir /src 复制源文件包到工作目录:cp /mnt/hgfs/D/src/* /minigui-free 解压文件到/minigui-free:
tar zxvf libminigui-1.6.10.tar.gz tar zxvf minigui-res-1.6.10.tar.gz tar zxvf mg-samples-1.6.10.tar.gz
2.2、MiniGUI库安装
(2)将libcross.sh考到minigui的lib库的解压文件夹中 (3)将rescross.sh 考到minigui的res资源解压文件夹中 (4)将samplecorss.sh 考到sample例子解压文件夹中 (5)依次运行libcross.sh,rescross.sh,samplecorss.sh (6)到nfsroot的,目录下,将libreduce.sh考到这个目录下,运行libreduce.sh 2.3、安装qvfb (1)解压qvfb1.1.tar.gz (2)./configure (3)make (4)make install 2.
4、配置MiniGUI.cfg vi /etc/MiniGUI.cfg 修改如下部分为 [system] # GAL engine and default options gal_engine=fbcon
defaultmode=800x480-16bpp # IAL engine ial_engine=fbcon mdev=/dev/mouse mtype=IMPS2 [fbcon] 6
defaultmode=800x480-16bpp [qvfb] defaultmode=800x480-16bpp display=0 1.5运行MiniGUI例子程序 (1)打开qvfb:qvfb & (2)运行helloword:
五、操作界面的生成
1、操作界面面执行文件的生成
1).在/minigui-free/mg-samples-1.6.10/src/修改源文件treeview.c 2).再次运行samplecorss.sh,生成执行文件treeview
2、利用nfs进行挂载
1).将本地PC机的网络方式设置成为桥接
2).查看/etc/exports下可以挂载的目录
3).启动服务/etc/init.d/nfs-kernel-server restart 4).查看本机和ARM上的IP地址,设置在同一网段,然后ping,使其能够互通。 5).在超级终端上,进行操作
Mount -o nolock,rsize=1024,wsize=1024 本机IP:/ /mnt
将虚拟机和ARM进行挂载,可以查看到虚拟机根目录下的文件。
3、在超级终端上将需要的文件从虚拟机上复制到ARM机上
1).重新烧写文件系统镜像文件
2).挂载成功后,将/mnt/minigui-free/nfsroot/lib/*复制到/usr/lib/ 3).将/mnt/minigui-free/nfsroot/usr/local/lib/*复制到/usr/local/lib/ 4).将/mnt/etc/MiniGUI.cfg复制到/etc/ 8
5).将/mnt/minigui-free/mg-samples-1.6.10/src/*复制到/usr/minigui/
4、在超级终端上运行执行文件
1).进入/usr/minigui/运行treeview文件 2).可以再操作界面上现实我们所设计的界面
六、操作界面调试
1、点击LED1LED2LED3LED4,分别控制四盏led灯的亮暗,调试界面如下:
2、输入频率值,点击START键控制四盏led灯闪烁,调试界面如下:
七、设计总结
1、设计过程中遇到的问题
错误1:
InitGUI: Can not initialize colors of window element! InitGUI failure when using /usr/local/etc/MiniGUI.cfg as cfg file. 解决方法:正确配置MiniGUI.cfg文件 错误2:
Permission denied 解决方法:权限不够,使用root用户登录。 错误3:
编译出错未找到jpeg,png等
解决方法:安装zlib,png,jpeg库。
错误4:
出现符号未找到等编译错误 解决方法:make clean 后在make 错误5:
在minigui创建和移植的过程中,出现lib库编译不成功的现象,这是由于minigui是基于qt3的,因此需要添加qt3所在路径至配置文件。 错误:6 在开发板上添加鼠标设备后,提示视频采集失败,这是因为/etc下的配置文件MiniGUI.cfg中对外设控制范围的控制过大,银将其修改为与界面统一大小800*480. 错误:7 在执行led灯控制程序之前应该首先停止开发板上原有的流水灯进程led-player。 错误:8 运行执行程序treeview后界面上出现两个光标,此时应该在/etc/init.d下的rcS文件中停用qt3的光标。
2、心得体会
本学期为期两周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件开发及学习上的一些不足之处。
两周的课程设计,在计算机这个博大深奥的领域我感觉自己还有好多东西要学,还有好多的东西不懂!嵌入式软件开发应用广泛而且前景很好,目前正处于人才紧缺的关口,嵌入式技术在未来能够得到更加广泛的应用。学好嵌入式,C语言很重要,所以感觉自己有必要在学习、积累一下这方面的知识。很多东西的学习不是一帆风顺也是比较耗时的,嵌入式也不例外,要想学好还必须下大力气,还必须坚持。这次的课程设计让我明确了一点:嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式
系统开发对于我们的知识面要求非常的广,且要有一定的深度。这次的课程设计因为是一个有针对性的训练,所以记的会非常牢固。跟平时上课不太一样,平时上完理论课很少有时间上机进行时间或者隔几天才上机练习,等到上机时一些东西可能遗忘了,比较耗费时间。在课上,有老师在前面演示我们感觉看得懂或感觉没问题,可轮到我们独立完成的时候,因为实际操作的少,其中的问题就来了!我很感谢学校特别是学院老师有实训这样的安排,把我们这一学期学的东西系统的集中的进行训练,让我们深刻明确的体验了一下软件开发的流程!还要感谢给我们实训的楚老师,感觉楚老师能力很强,也很有耐心,即使老师讲了很多遍的问题,我们不会,老师还是会走进我们给我们耐心的指导,还给我们讲一些学习计算机的方法,一些软件开发需要注意的细节,让我们知道自己在哪方面不足,需要加强,也让我们了解到哪些需要认真的学习,那些是重点,不是没有方向的乱学一通,什么也学不好!经过这次的实训,我真真确确的感受到了计算机在我们生活中工作中的运用,这些软件、程序能让我们提高工作的效率,更直观更便捷的切入主题。当然,在学习的过程中并不是一帆风顺的,在这之中,因为要操作的东西很多,有时错一步,后面的结果就无法显示,而自己的计算机水平还有待提高,根本检查不出来是哪里出了错!这时候,老师都会耐心的过来帮助我!在平时我们就需要好好的查阅书籍或者上网搜集相关资料去解决问题。
短短两周的课程设计很快结束了,我发现我对计算机这个专业、对嵌入式技术、对Linux都有了新的认识。通过这次的实训,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但真正掌握后,它带给我们的将是无穷的便捷与科技,我喜欢高端便捷的生活。我希望我能做计算机这个万能机器人的主人而不是奴隶,我会努力加油的!感谢学校,感谢老师给我的帮助,让我的思想、技能又上了一个台阶!感谢!加油!
八、设计参考书
1、《嵌入式系统接口设计与Linux驱动程序开发》
2、《ARM9嵌入式LINUX系统构建与应用》
4、MiniGUI编程手册
5、Linux应用程序编程
九、附件(程序)
#include
#include
/*包括 MiniGUI 常用的宏以及数据类型的定义*/ #include /*包含了全局的和通用的接口函数以及某些杂项函数的定义*/ #include
/*包含了
MiniGUI
绘图函数的接口定义*/ #include
/*包含了
libminigui 中所有内建控件的接口定义*/ #include #include #include
/*包含了许多UNIX系统服务的函数原型*/ #include
/*提供对I/O控制的函数*/
#define ID_LED1 101
/*定义各个控件与定时器的ID号*/ #define ID_LED2 102 #define ID_LED3 103 #define ID_LED4 104 #define ID_TEXT1 105 #define ID_TEXT2 106 #define ID_START 107 #define ID_STOP 108 #define ID_COMBOBOX 109 #define ID_TIMER 110
static int a,b,c,d=0;
/*定义LED灯的初始值*/ static int fd_led;
/*定义文件描述符*/
HWND hMainWnd;
/*定义主窗口句柄*/
static void draw_circular(HWND hdig,int x,int y,int r,int which)
/*自定义一个画圆函数,x、y、r、which分别表示圆心坐标、半径、颜色*/ {
HDC hdc;
/*定义设备上下文句柄*/ int color; color=((which==0)?PIXEL_green:PIXEL_red);
hdc=BeginPaint(hdig);
/*获得设备上下文句柄*/ SetBrushColor(hdc,color);
/*设置画刷颜色*/ FillCircle(hdc,x,y,r);
/*调用园填充函数*/ EndPaint(hdig,hdc);
/*释放设备上下文句柄*/ }
static DLGTEMPLATE DlgInitProgress=
/*定义对话框模板. 用static类型数据,使该数据的定义只在所在文件中有效,以免因为名字空间污染造成潜在的编译或连接错误*/ {
WS_BORDER|WS_CAPTION,
/*对话框风格,WS_BORDER创建有边框的窗口 ,WS_CAPTION创建含标题栏的主窗口*/
WS_EX_NONE,
/*对话框扩展风格,WS_EX_NONE表示无扩展风格*/
0,0,800,480,
/*对话框位置,左上角坐标(0,0),800、480分别为宽和高*/
"MY_LED_CONTROL",
/*对话框标题*/
0,
/*对话框图标*/
0,
/*对话框菜单*/
9,
/*对话框中控件个数。这个必须要匹配*/
NULL,
/*pointer to control array*/
0
/*附加值*/ };
static CTRLDATA CtrlInitData[]=
/*控件数组*/ {
{
"static",
/*控件类型*/
WS_VISIBLE|SS_SIMPLE,
/*控件风格,WS_VISIBLE创建初始可见的窗口,SS_SIMPLE显示单行文本*/
100,270,150,40,
/*控件位置*/
ID_TEXT1,
/*控件ID*/
"Please input frequency",
/*控件内容*/
0,
/*附加值*/
WS_EX_NONE
/*控件扩展风格*/
},
14 { "static", WS_VISIBLE|SS_SIMPLE, 605,270,150,40, ID_TEXT2, "HZ", 0, WS_EX_NONE
}, {
"button", WS_VISIBLE|WS_TABSTOP, 135,160,80,60, ID_LED1, "LED1", 0, WS_EX_NONE
}, {
"button", WS_VISIBLE|WS_TABSTOP, 285,160,80,60, ID_LED2, "LED2", 0, WS_EX_NONE
}, {
"button", WS_VISIBLE|WS_TABSTOP, 435,160,80,60, ID_LED3, "LED3", 0,
/*WS_TABSTOP支持Tab键*/
WS_EX_NONE
}, {
"button",
WS_VISIBLE|WS_TABSTOP,
585,160,80,60,
ID_LED4,
"LED4",
0,
WS_EX_NONE
}, {
"button",
WS_VISIBLE|WS_TABSTOP,
285,360,80,60,
ID_START,
"START",
0,
WS_EX_NONE
}, {
"button",
WS_VISIBLE|WS_TABSTOP,
435,360,80,60,
ID_STOP,
"STOP",
0,
WS_EX_NONE
}, {
CTRL_COMBOBOX,
WS_VISIBLE|WS_TABSTOP|CBS_AUTOSPIN|CBS_AUTOLOOP,
/*CBS_AUTOSPIN创建旋钮数字框,CBS_AUTOLOOP框中的数字将自动循 环显示*/
435,270,80,40,
ID_COMBOBOX,
"0",
/*旋钮数字框初始值*/
0,
WS_EX_NONE
} };
static int DialogBoxProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) /*对话框过程函数,用来接收和处理所有发送到该窗口的消息*/ {
int number;
/*用来存从旋钮数字框获得的数值*/
static int t=0;
int num;
/*存放定时时间*/
switch(message)
{
case MSG_INITDIALOG:
/*用户在定义自己的对话框回调函数时,需要处理
MSG_INITDIALOG消息,该消息是在
MiniGUI根据对话框模板建立对话框以及 控件之后 ,发送到对话框回调函数的 。*/
SendDlgItemMessage(hWnd, ID_COMBOBOX, CB_SETSPINRANGE, 0, 10000);
/*设置旋钮数字框的最大小值*/
return 1;
case MSG_PAINT:/*重绘消息*/
draw_circular(hWnd,175,90,30,1);
draw_circular(hWnd,325,90,30,1);
draw_circular(hWnd,475,90,30,1);
draw_circular(hWnd,625,90,30,1);
printf("*************************init draw_circular****************************** ");
case MSG_TIMER:t++;
/*定时器消息,这里完成LED灯的闪烁*/
if(t%2!=0)
{
ioctl(fd_led, 0,0);
ioctl(fd_led, 0, 1);
ioctl(fd_led, 0, 2);
ioctl(fd_led, 0, 3); printf("*************************time red****************************** ");
draw_circular(hWnd,175,90,30,1);
draw_circular(hWnd,325,90,30,1);
draw_circular(hWnd,475,90,30,1);
draw_circular(hWnd,625,90,30,1);
break;
}
else
{
ioctl(fd_led, 1,0);
ioctl(fd_led, 1, 1);
ioctl(fd_led, 1, 2);
ioctl(fd_led, 1, 3); printf("*************************time green****************************** ");
draw_circular(hWnd,175,90,30,0);
draw_circular(hWnd,325,90,30,0);
draw_circular(hWnd,475,90,30,0);
draw_circular(hWnd,625,90,30,0);
break;
}
case MSG_COMMAND: /*击键消息*/
switch (wParam)
{
case ID_LED1:a++;
/*控制LED灯亮暗*/
if(a%2!=0)
{
ioctl(fd_led,0,0);
draw_circular(hWnd,175,90,30,1);
}
else
{ /
ioctl(fd_led,1,0);
draw_circular(hWnd,175,90,30,0);
}
printf("******************led1******************************** ");
break;
case ID_LED2:b++;
if(b%2!=0)
{
ioctl(fd_led,0,1);
draw_circular(hWnd,325,90,30,1);
}
else
{
ioctl(fd_led,1,1);
draw_circular(hWnd,325,90,30,0);
}
printf("*******************led2******************************** ");
break;
case ID_LED3:c++;
if(c%2!=0)
{
ioctl(fd_led,0,2);
draw_circular(hWnd,475,90,30,1);
}
else
{
ioctl(fd_led,1,2);
draw_circular(hWnd,475,90,30,0);
}
printf("*******************led3******************************** ");
break;
case ID_LED4:d++;
if(d%2!=0)
{
ioctl(fd_led,0,3);
draw_circular(hWnd,625,90,30,1);
printf("*******************led33******************************** ");
}
else
{
ioctl(fd_led,1,3);
draw_circular(hWnd,625,90,30,0 );
}
printf("*******************led4******************************** ");
break;
case ID_START:printf("*******************start1********************* ");
number=SendMessage(GetDlgItem(hWnd,ID_COMBOBOX), CB_GETSPINVALUE, 0, 0);/*获取旋钮数字框的数值*/
printf("**********%d******************* ",number);
printf("*******************start2********************* ");
if(number!=0)
{
printf("*******************start3********************* ");
num=(int)(1000*(1.0/number));
/*将频率转换为时间*/
printf("*******************start4********************* ");
}
else
{
printf("*******************start5********************* ");
num=1000;
}
printf("*******************start6********************* ");
printf("*******************start7********************* ");
printf("*******************start8********************* ");
SetTimer(hWnd,ID_TIMER,num); /*创建定时器,时间为num*10ms*/ printf("*************************SetTimer OK****************************** ");
SendMessage(hWnd,BM_CLICK,0,0);
/*发送点击信息*/ printf("*************************SendMessage OK****************************** ");
//for(i=0;i++;i<10000)
/*当初用for循环时无法进入循环,也许是因为消息本身有循环机制,用for循环太多也许冲突,所以后来用了定时器*/
//{
//
printf("********%d********** ,i");
//
ioctl(fd_led, 1,0); //
ioctl(fd_led, 1, 1); //
ioctl(fd_led, 1, 2); //
ioctl(fd_led, 1, 3);
//
draw_circular(hWnd,175,90,30,0);
//
draw_circular(hWnd,325,90,30,0);
//
draw_circular(hWnd,475,90,30,0);
//
draw_circular(hWnd,625,90,30,0);
printf("*******************start9********************* ");
// usleep(number);
//usleep(num);
//
ioctl(fd_led, 0,0); //
ioctl(fd_led, 0, 1); //
ioctl(fd_led,0, 2); //
ioctl(fd_led, 0, 3);
// draw_circular(hWnd,175,90,30,1);
21
// draw_circular(hWnd,325,90,30,1);
// draw_circular(hWnd,475,90,30,1);
// draw_circular(hWnd,625,90,30,1);
// printf("*******************start10********************* ");
//usleep(number);
//usleep(num);
// }
printf("*******************start******************************** ");
break;
case ID_STOP:
KillTimer(hWnd,ID_TIMER);/*关闭定时器。下面的表示灯灭*/
ioctl(fd_led, 0,0);
ioctl(fd_led, 0, 1);
ioctl(fd_led, 0, 2);
ioctl(fd_led, 0, 3);
draw_circular(hWnd,175,90,30,1);
draw_circular(hWnd,325,90,30,1);
draw_circular(hWnd,475,90,30,1);
draw_circular(hWnd,625,90,30,1);
printf("**************stop****************** ");
break;
}
}
return(DefaultDialogProc(hWnd,message,wParam,lParam));
/*对话框的缺省消息处理由 DefaultDialogProc 函数完成*/ }
static void InitDialogBox(HWND hWnd) { DlgInitProgress.controls=CtrlInitData;
22
/*将对话框模板结构和控件结构数组关联起来*/ DialogBoxIndirectParam(&DlgInitProgress,hWnd,DialogBoxProc,0L);/*创建对话框*/
printf("*************create dialog********************** "); }
/*****************************************************************
主窗口的过程函数
static int LedWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
switch (message)
{
case MSG_PAINT:
hdc = BeginPaint (hWnd);
TextOut (hdc, 60, 60, "My leds control!");
EndPaint (hWnd, hdc);
return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
*********************************************************************/ int MiniGUIMain (int argc, const char* argv[])
{
// MSG Msg;
// MAINWINCREATE CreateInfo; /*描述主窗口的属性*/
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "led" , 0 , 0);
/*选择PROCESSES模式*/
#endif
printf("****************into main********************* ");
fd_led=open("/dev/GPIO-Control",0);
/*打开驱动设备*/
23
if (fd_led < 0)
{
perror("open device led");
exit(1);
}
ioctl(fd_led, 0, 0);
/*初始灯灭*/
ioctl(fd_led, 0, 1);
ioctl(fd_led, 0, 2);
ioctl(fd_led, 0, 3);
InitDialogBox( HWND_DESKTOP);
close(fd_led); /*********************************************************** CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; /窗口风格/
CreateInfo.dwExStyle=WS_EX_NONE;
/窗口扩展风格/
CreateInfo.spCaption="MY_LED_CONTROL_WIN";
/窗口标题/
CreateInfo.hMenu=0;
/菜单/
CreateInfo.hCursor= GetSystemCursor(0);
/光标/
CreateInfo.hIcon=0;
/图标/
CreateInfo.MainWindowProc=LedWinProc;
/设置主窗口的窗口函数,所用发往该窗口的消息由该函数处理/
CreateInfo.lx=0;
/窗口位置/
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 180;
CreateInfo.iBkColor=COLOR_lightwhite;
/设置背景颜色/
CreateInfo.dwAddData=0;
/附加数值/
CreateInfo.hHosting=HWND_DESKTOP;
/设置窗口的托管窗口为桌面窗口/
hMainWnd = CreateMainWindow (&CreateInfo);
/创建主窗口,返回创建窗口的句柄/
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd,SW_SHOWNORMAL);
/显示窗口的显示方式/
while(GetMessage(&Msg, hMainWnd)) /获取主窗口的句柄,指向MSG结构指针/
24
{
TranslateMessage(&Msg);
/将击键消息转换为MSG_CHAR消息,然后直接发送到窗口的过程函数/
DispatchMessage(&Msg);
/获取消息的目标窗口的窗口过程,然后直接调用 该窗口过程函数对消息进行处理/
}
MainWindowThreadCleanup (hMainWnd); /清除主窗口所使用消息队列的系统资源/ *****************************************************************************/
return 0;
}
#ifndef _MGRM_PROCESSES #include #endif
25
第二篇:嵌入式系统设计课程设计大纲(给学生)
《嵌入式系统设计》课程设计大纲
【课程编号】:11278131
【适用专业】:电子、电信
【学 分 数】:1
【总 学 时】:30
一、课程设计的目的
1、 通过“嵌入式系统”课程设计,学习、体会、熟悉嵌入式系统相关的项目研究开发的完整过程:课题的提出与论证、调研、文献阅读、方案比较与选择、嵌入式系统程序编写与调试,报告撰写、课题答辩。
2、 掌握综合运用所学知识分析、解决实际问题的一般方法。
3、 培养学生综合分析问题、解决问题和独立工作的能力。
4、通过课程设计及答辩全过程的训练,加强老师与学生之间学生与学生之间知识的相互交流,互相渗透,培养勤奋求实的良好学风。
二、课程设计要求
1、要求同学们以满腔的热情、科学的态度,严谨的作风、高度的责任感从事课程设计工作;不得敷衍了事、马马虎虎、得过且过;提倡周密思考、大胆创新,反对生搬硬套、墨守陈规;提倡共同研究,反对相互抄袭。
2、要求遵守作息时间,遵守学校的各项规章制度,确保设计顺利、高质量地完成。
三、课程设计安排
学生每人选择一个题目,每个题目为1个学分。
1. 题目1:基于嵌入式系统下的室内温度/湿度调节系统设计
2. 题目2:嵌入式智能家居系统:图像采集与存储
3. 题目3:嵌入式系统下的MP3制作
4. 题目4:嵌入式系统GPS定位系统
5. 题目5:嵌入式GPRS短信收发
6. 题目6:嵌入式IC卡读写系统设计
7. 题目7:蓝牙无线通信系统设计
8. 题目8:红外通信系统设计
9. 题目9:基于CAN总线的现场总线网络设计
10. Web远程监控系统1: -web嵌入式服务器设计
11. Web远程监控系统2: -远程控制接口
四、选题原则:学生根据自己的实际情况在给定题目中选一个题目(1学分)进行设计,或者自行选择感兴趣的课题。若题目相同,内容不可雷同。
五、成绩评定:
指导教师依课程设计说明书撰写情况及整个课程设计中学生的表现,综合给出成绩。
六、相关参考资料
教材:
Rick Grehan等.32位嵌入系统编程,中国电力出版社,2001.
参考书:
桑楠.嵌入式系统原理及应用开发技术,北航出版社,2002.
第三篇:嵌入式系统基础课程设计报告
河南机电高等专科学校
嵌入式系统基础课程设计报告
系 部: 电子通信工程系 专 业: 班 级: 学生姓名: 学 号:
2012年 06月
嵌入式系统基础课程设计任务书
1.时间:2012年06月11日~2012年06月15日 2. 课程设计单位:河南机电高等专科学校
3. 课程设计目的:深入学习单片机编程技巧,熟悉电子产品设计制作全过程。能够利用汇编语言完成十字路口交通灯的设计。 4. 课程设计任务:
按交通灯的具体要求来写
―――-红色文字为说明,写报告时请先删除!!!
2 嵌入式系统基础课程设计报告
前言:
××××××××××××××××××××××××××××××××××××××××××××××× ----- 宋体,小四,不加粗,单倍行距
实训报告: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
„„„„„„
×××××××××××××××××××××××××××××××
―――-红色文字为说明,写报告时请先删除!!!
心得体会: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
„„„„„„
××××××××××××××××××××××××××××××××××××××××××××××××××
参考文献:
„„„以下红色文字为“参考文献”的示例,写报告时请先删除!!!填写上你自己的“参考文献”
[1] 周小谦,丁功扬,郭日彩,三峡电力系统的形成和发展,电网技术。1998,88(3):p1-3 [2] ----- 宋体,小五,不加粗,单倍行距
第四篇:嵌入式系统课程设计教学大纲
课程名称:嵌入式系统A课程(Embedded Systems) 课程编号:1310778236 设计时数:1周 学
分:1 开课单位:信息电子技术学院通信工程教研室 适用专业:通信工程 适用对象:本科
一、课程的性质、类型、目的和任务
作为电子信息工程、通信工程专业本科生的必修实践环节,嵌入式系统课程设计要求学生有扎实的理论基础并具备一定动手能力。进入课程设计前要认真复习微处理器类课程中的相关知识和汇编语言、C语言的编程方法。课程设计采用课堂讲述、自学、分组实践相结合的方式,通过分析典型的例子,使学生熟悉并掌握嵌入式系统的开发流程和基本的编程方法。课程设计要求2—3人组成课设小组,在指定范围内选定题目,每组选一题,题目应侧重一个嵌入式系统的具体应用方面。题目选定后,在教师的指导下,学生理解设计原理,分析重要电路单元,计算必要的参数并在此基础上编写程序,最后,在课程设计结束时独立写出理论分析完善、文理通顺、字迹工整的课程设计报告并上交软件程序。教师可根据作品的难易程度、参数指标、编程水平等进行评分。
二、本课程与其它课程的联系与分工
学习该课程之前,学生应学习过《C语言程序设计》、《数字电子技术》,《单片机原理与应用》基础知识。嵌入式系统是它们的总结和提高。
三、课程内容及教学基本要求
[1]表示“了解”;[2]表示“理解”或“熟悉”;[3]表示“掌握”;
学生可从下列题目中任选一个作为嵌入式课程设计题目,也可以根据个人兴趣及实验室现有条件,自己确定题目经教师审核后作为课程设计题目。
(一)单片机控制数码管显示系统的设计
AVR单片机的工作原理[1],嵌入式系统实际开发过程[2],单片机控制数码管的方法[3],师编写程序[3],实现单片机控制数码管显示系统的设计[3]。
(二)矩阵式按键控制LED显示系统
AVR单片机的工作原理[1],嵌入式系统实际开发过程[2],矩阵式按键输入控制信号[3]、通过单片机控制LED显示的过程[3]。单片机定时/计数器的工作原理及使用[3],汇编程序的下载及固化的过程[3] ,
(三)汉字显示系统设计
了解AVR单片机的工作原理[1] ,液晶驱动芯片的工作原理[1],嵌入式系统实际开发过程[2],单片机控制液晶显示模块的方法[3],编写程序,单片机控制汉字显示系统的设计[3]。
(四)交通灯控制
AVR单片机的工作原理,嵌入式系统实际开发过程[2],ARM7核的LPC2106的管脚功能和特点[1], I/O控制寄存器的设置方法[3];ARM7应用系统编程开发方法[3],能用C语言编写应用程
序[3]; ADS1.2软件的使用以及PROTEUS仿真调试的方法[3];
(五) 交通灯设计
ARM芯片[1]; ARM芯片各个引脚的功能[2],工作方式[2],计数/定时[2],I/O口[2],中断[2];利用ARM芯片模拟实现交通灯控制[3]。,工作方式,计数/定时,I/O口,中断等相关原理,通过软硬件设计实现利用ARM芯片完成交通灯的模拟控制[3]
(六)温度采集系统
ARM芯片各个引脚功能[1],工作方式[1],计数/定时[1],I/O口[1],中断[1]。通过软硬件设计实现利用ARM芯片对周围环境温度信号的采集及显示[3] 其他课题见附录:
四、考核方式及要求
1.考核方式:考查;
2.考核方法:平时考勤+设计报告+ 设计答辩; 3.成绩评定:
平时成绩:应根据学习纪律、出勤、等方面综合评定,占10%;
设计报告:根据学生设计报告各部分的完整性和优劣情况评定,占70%; 设计答辩:应根据答辩结果评定,占20%. 按优、良、中、及格、不及格五级分制记分。 设计报告内容:
1.封面;2. 摘要;3. 目录;4. 总体方案设计分析 ;5. 软件框图及程序设计(汇编语言源程序必须加注释说明);6. 硬件原理图设计(最好使用电子设计CAD软件绘制);7. 设计总结和心得体会。
五、实验教材(指导书)及参考书(资料)
1.王田苗,《嵌入式系统设计与实例开发》,清华大学出版社 2.马忠梅,《ARM嵌入式微处理器体系结构》,北航出版社 3.陈章龙,《嵌入式技术与系统-Intel XScale 结构与开发》,北航出版社
第五篇:嵌入式操作系统程课程设计报告
目录
一、 实习任务和目的„„„„„„„„„„„„1
二、实习基本要求„„„„„„„„„„„„„1
三、实习题目„„„„„„„„„„„„„„„1
四、实习地点„„„„„„„„„„„„„„„1
五、实习内容„„„„„„„„„„„„„„„3
六、实习总结、心得体会„„„„„„„„„„8
七、参考资料„„„„„„„„„„„„„„„9
0
一、实习的任务和目的:
本次实习的目的是在学生已掌握了嵌入式操作系统的知识、对当前嵌入式操作系统的主要种类和应用领域有较清晰的概念的基础上,以嵌入式LINUX操作系统教学内容为指导,以S3C2410经典实验箱为平台,使学生掌握配置、裁剪、移植和维护嵌入式LINUX操作系统的技能和相关理论知识,具备一个初级嵌入式LINUX系统程序员的综合技能。
本次实习的任务是通过教师对嵌入式LINUX的配置、裁剪、移植以及文件系统的移植等内容的讲解,让学生掌握如何搭建嵌入式开发环境、嵌入式LINUX系统移植、文件系统移植以及简单的驱动程序的开发。
二、实习基本要求:
1、了解嵌入式操作系统技术前沿、应用领域、发展趋势及相关领域研究成果;
2、熟悉嵌入式操作系统的特点、分类、基本概念;
3、熟悉主流实时操作系统。深入了解嵌入式LINUX,包括系统配置、裁剪、移植;
4、熟悉并掌握嵌入式文件系统的建立、移植;
5、以嵌入式处理器器S3C2410为例,掌握嵌入式LINUX驱动程序开发的一般方法。
三、实习题目:
1、复习LINUX系统基本操作,常用命令;
2、嵌入式LINU开发基础知识;
3、嵌入式LINUX开发环境的建立;
4、Bootloader移植;
5、LINUX内核的配置、裁剪;
6、LINUX内核移植与编译;
7、建立根文件系统;
8、模块方式驱动程序设计;
9、中断、LED驱动程序设计。
四、实习地点:
应用技术学院五楼四机房。
五、实习内容:
第一部分 嵌入式LINU开发基础知识:
1 1.1 嵌入式LINUX简介
嵌入式系统的定义为以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统,它的主要特点是潜入、专用。本次实训的平台是在LINUX下的ubuntu系统上进行的。
1.2 嵌入式LINUX开发平台简介
本次实训的需要一台主机及一块开发板,它们需要满足一定的硬件要求,主机的硬件要求是:有一个25针的并口接口,它用来连接JTAG连线,有一个9针的串口接口,支持网络,至少20GB的硬盘,用到的开发板是s3c2410,它有如下的部件:64MB SDRAM,1MB NOR Flash,64MB NAND Flash,两个网卡,5个串口(内置3个,外扩2个),音频输入输出。2.5寸IDE接口,标准SD/MMC卡座,GPIO按键,外接I2C接口的实时时钟(RTC)芯片。 1.3 嵌入式LINUX开发流程
(1)在主机上编译Bootloader,然后通过JTAG烧入单板,(2)在主机上编译嵌入式LINUX内核,通过Bootloader烧入单板或直接启动,(3)在主机上编译各类应用程序,单板启动内核后通过NFS运行他们,经过验证后再烧入单板。 1.4 嵌入式LINUX开发环境的建立
开发环境的搭建:硬件开发环境的搭建很简单,将主机与目标板通过JTAG、串口线(接单板上的串口0)、网线(接单板上的网卡0)连接起来,将各类设备连接到目标板上即可,软件的搭建环境相对要复杂的多,时间也要得多,首先第一步需要移植U—boot,然后再来烧写LINUX内核,再创建根文件系统,最后才可以来写相应的驱动程序来进行开发的! 第二部分 嵌入式LINUX系统构建:
2.1 Bootloader移植
u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, u-boot不仅仅支持嵌入式LINUX系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x8
6、ARM、NIOS、XScale等诸多常用系列的处理器。 移植过程:
在主机上创建一个文件夹,把以下四个已下载的文件复制到里面,这四个文件分别为:
u-boot.bin ,---- LINUX操作系统启动的bootloader; uImage ,--- LINUX操作系统内核;
root.cramfs ,---- 根文件系统; yaffs.tar.bz2 ,---- 应用程序压缩包。运行sjf2410-s命令如下:sjf2410-s /f:u-boot.bin。然后按回车,等待烧写完成后,设置开发板的地址与服务器的地址,命令如下:设置本机服务器IP地址:(根据具体主机环境更改IP)setenv serverip 192.168.1.113, 设置ARM设备IP地址:(随意设置成与上面主机同一网段IP即可),setenv ipaddr 192.168.1.199,保存变量设置:saveenv。
2
3
2.2 内核裁剪与移植
LINUX本次实验目录下存放着已经修改好的博创经典2410平台的内核源码包,将该源码包拷贝到宿主机LINUX系统中,解压至本次实验目录,配置编译生成内核uImage文件烧写到ARM设备中。在内核根目录下,用命令make menuconfig进入配置界面,对系统进行裁剪,如下:
4
选择硬件系统
配置LCD驱动
网卡驱动
5
配置NANF Flash驱动
配置文件系统
然后运行 bootm 启动内核即可。 2.3 创建根文件系统
解压busybox源码后,进入busybox源代码目录,打开Makefile,修改两个地方,分别是在Makefile文件中的CROSS_COMPILE=后面添加上arm-LINUX-这一行以及ARCH ?=后面改成arm.然后在busybox根目录下使用命令make menuconfig进入配置界面进行配置,如图:
Busybox截图
退出后,使用命令make,make install。用shell脚本创建根文件系统的目录结构,并在想要运行根文件系统的地方运行脚本,需要创建一个文件夹rootfs,里面包括了一些LINUX下的基本的文件。还需要把busybox源码目录下的/etc
6 的内容拷贝到此处创建的文件夹的etc下,修改拷贝过来的profile文件,修改初始化文件inittab和fstab,修改初始化的脚本文件,init.d/rcS,创建一个空的mdev.conf文件,在挂载根文件系统时用到,再把本机上的passwd,shadow,group文件拷贝过来,把busybox默认安装目中的文件全部复制到这里的rootfs中,会发现多了LINUXrc->bin/busybox,这是挂载文件系统需要执行的,这时,在rootfs目录下,使用命令cp -rvf /rootfs/busybox-1.12.2/_install/* ./,,到此,就用busybox创建了一个基本的文件系统。
第三部分 设备驱动程序设计:
3.1 模块方式驱动实验
在这里,需要有两个程序,一个驱动程序,一个用户程序,驱动程序通过用户程序来调用,完成基本的读写以及注册设备号等,在本程序中,用户程序非常简单,驱动程序的核心部分是如下代码所示:
static struct file_operations demo_fops = { owner: THIS_MODULE, write:demo_write, read: demo_read, ioctl: demo_ioctl, open: demo_open, release: }; demo_release, 其他的所有程序都是在这个基础上延伸出来的。还有一个注册设备号的函数如示:
register_chrdev(0, DEVICE_NAME, &pxa270_fops); 假设本驱动程序的源代码名字是s3c2410_led.c编译驱动程序模块的方法是把驱动程序复制到内核目录下的drivers/char子目录下,在drivers/char/Makefile中增加一行:obl-m +=s3c2410_led.o,然后在内核根目录下执行make modules.就生成drivers/char/s3c2410_led.ko,再把它复制到开发板上,就可以使用insmod s3c2410_led.ko,rmmod s3c2410_led.ko了,此时,就可以执行本用户程序了,结果如下:
7
3.2 LED驱动实验
本实验的主要目的是写一个驱动程序来点亮开发板上的一颗LED灯。主要的程序核心还是集中在怎么给led灯引脚一个电平以及用户程序中ioctl程序的使用。程序的核心代码如下:
static struct file_operations s3c24xx_leds_fops = { .owner =
THIS_MODULE,
.open
=
s3c24xx_leds_open,
.ioctl =
s3c24xx_leds_ioctl, }; static int s3c24xx_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg) {
if (arg > 4) {
return -EINVAL;
}
switch(cmd) {
case IOCTL_LED_ON:
s3c2410_gpio_setpin(led_table[arg], 0);
return 0;
8
case IOCTL_LED_OFF:
s3c2410_gpio_setpin(led_table[arg], 1);
return 0;
default:
return -EINVAL;
} } 编译好模块后,复制到开发板目录下即可在开发板下执行,点亮led灯。
命令led_test 1 off/on,如此,就可以关闭或点亮一个led灯了! 3.3 中断按键控制LED实验 核心代码如下:
注册中断:request_irq(button_irqs[i].irq, buttons_interrupt, button_irqs[i].flags,
button_irqs[i].name, (void *)&press_cnt[i]); 注册备:register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &s3c24xx_buttons_fops); 中断函数:
static irqreturn_t buttons_interrupt(int irq, void *dev_id) {
volatile int *press_cnt = (volatile int *)dev_id;
*press_cnt = *press_cnt + 1; /*
ev_press = 1;
wake_up_interruptible(&button_waitq);
return IRQ_RETVAL(IRQ_HANDLED); } 同理,把它的目标文件放到内核根目录下的drivers/char编译后,把生成的模块文件复制开发板下,即可完成相应的任务,通过按键可以来控制led灯了,同时,可以通过命令cat /proc/devices, cat /proc/interrupt来查看设备及中断的注册情况!
六、实习总结、心得体会:
通过为期将近几周的嵌入式操作系统实习,我收获颇深。这次实习虽然短,可是收获很大,感觉平时上课学到的东西都没有这几天学到的多。正所谓:“实践是检验真理的唯一标准”。这次实习可以形象的概括为:“山重水复疑无路,柳暗花明又一村”。只有自己经历过才会真正的懂,书本知识还远远不够!
此次嵌入式操作系统实习给我最深的体会就是:理论+细心+实践才能在实际
9 生产中体现所学知识的价值。
在嵌入式行业发展如此快速完善的今天,理论与细心与实际的完美结合才能让自己在专业领域占有一席之地。在实习中,我初步了解了嵌入式处理器S3C2410的工作原理、也加深了对嵌入式处理器S3C2410的认识;也见识了关于嵌入式处理器的一些工作方式等。
几周的嵌入式操作系统实习结束了,做了好几个小实验,有成功也有失败,然而终究还是学会了很多东西。在整个实习期间,我体会到了自己的进步,并且从中也体会到了它的快乐。实习也让我明白了:第一,通过实践真正觉得自己可以做些什么了有点存在的小成就感;第二,通过嵌入式操作系统实习,加强了我们的动手实践能力和设计创新精神。作为信息时代的大学生基本的动手能力是一切工作和创造的基础和必要条件。第三,在嵌入式操作系统实习的这些日子里,大家的团队精神得到了很大的加强,闭门就会造车那是不可能的事情。
在为期两周的实习当中感触最深的便是实践联系理论的重要性,当遇到实际问题时,只要认真思考,运用所学的知识,一步一步的去探索,是完全可以解决遇到的一般问题的。本次实习的目的主要是:使我们嵌入式操作系统及LINUX相关操作有一定的感性和理性认识,培养和锻炼我们的实际动手能力。使我们的理论知识与实践充分地结合,作到不仅具有专业知识,而且还具有较强的实践动手能力,能分析问题和解决问题的应用型技术人才,为以后的顺利就业作好准备。 此次实习学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。在此,感谢老师及其他老师的细心指导,也同样谢谢其他各组同学的无私帮助!
七、参考资料:
1、雅默著. 构建嵌入式LINUX系统[M]. 北京:中国电力出版社.2004年
2、孙琼著. 嵌入式LINUX应用程序开发详解[M]. 北京:人民邮电出版.2003年
3、2410经典实验指导书3.2 北京博创兴业科技有限公司2410经典实验箱配套教材
4、韦东山著. 嵌入式LINUX应用开发完全手册
北京:人民邮电出版
10
【嵌入式课程设计初稿】相关文章:
课程设计说明书初稿08-18
嵌入式系统课程设计08-22
嵌入式操作系统程课程设计报告04-29
管理会计嵌入财会专业的课程体系的设计研究09-11
大阅读课程意见初稿08-08
浅谈《嵌入式技术与应用》课程教学09-10
弹载嵌入式系统设计技术04-29