第一篇:北京科技大学 嵌入式课程设计报告
《嵌入式控制系统》 课程设计报告
学 院
专业班级
姓
名
学
号
指导教师
_
目录
摘要..............................................................................................................................................4
引言
随着芯片技术和电子产品智能化的飞速发展,嵌入式技术越来越受到人们的关注,应用领域几乎遍及所有的电子产品:智能机器人、网络通信、军用设备、汽车导航、环境保护、智能仪器等等。嵌入式系统不仅融合了计算机软、硬件技术、通讯技术和半导体微电子技术,而且针对实际应用系统要求,将相应的计算机直接嵌入到应用系统中,并可针对应用需求对软、硬件进行优化、裁减。
嵌入式控制系统是一门新兴的课程,通过本次课程设计可以更好地掌握这门新技术,对今后的发展有很大帮助。
开发方法和流程,熟悉Intel XScale硬件平台及其应用处理机的使用方法,熟悉WINCE嵌入式系统的基本原理、概念。
4.设计原理 4.1 LED发光原理
LED(Light Emitting Diode),即发光二极管。是一种半导体固体发光器件。它是利用固体半导体置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。
发光二极管的核心部分是由P型半导体和N型半导体组成的晶片,如图1,在P型半导体和N型半导体间有一个过渡层,称为P-N结。在某些半导体材料的P-N结中,注入的少数载流子与多数载流子复合时,会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。P-N结加反向电压,少数载流子难以注入,故不发光。利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。
图1 发光二极管的核心组成部分
图3 控件设计图
其中,显示按钮是作为数码管静态显示的按钮,如显示1235; 亮、灭、闪烁这三个按键是通过GPIO控制发光二极管的状态; 测试按键是实现2,4、6、8数码管循环动态显示的按钮; 复位按键是实现中断次数清零功能的按钮; Apply按键是启动更改的循环显示周期的按键。
以上就是整个课程设计的全部控制界面,通过不同的按钮操作,实现不同的功能。
5.3基本功能的实现
windowsCE是一个界面友好的嵌入式操作系统,系统提供了丰富了控件,极大的方便了用户的开发。C++是优秀的编程语言,在EVC环境下,编写的难度大大降低,尤其是界面的处理。由于实验平台提供了相应的驱动程序,所以本次实验并不需要了解其硬件操作,大大缩短了一个嵌入式应用的开发速度。通过本次嵌入式实
图5 LED数码管循环显示2,4,6,7 6.2 LED数码管清零功能实现结果
通过控制面板上的操作按键,实现清零功能,当按键按下去之后,四个LED数码管的显示数字全部都会变为零。见图6
6.4 频率设置功能实现结果
闪烁周期可以通过键盘输入来进行设置,本课程设计设置的为0~9之间,基值为100ms,通过改变闪烁周期来控制2、4、6、8循环显示的频率。见图8.和图9.图8 闪烁周期为5时的结果
力,也增强了我们的团队协作能力。有什么不懂不明白的地方要及时请教老师或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识。
} //{{AFX_DATA_MAP(CLedDlg)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP BEGIN_MESSAGE_MAP(CLedDlg, CDialog)
//{{AFX_MSG_MAP(CLedDlg)ON_BN_CLICKED(IDC_BUTTON_SET, OnButtonSet)ON_WM_DESTROY()ON_BN_CLICKED(IDC_BUTTON_ON, OnButtonOn)ON_BN_CLICKED(IDC_BUTTON_OFF, OnButtonOff)ON_BN_CLICKED(IDC_BUTTON_FLASH, OnButtonFlash)ON_WM_TIMER()ON_BN_CLICKED(IDC_BUTTON_TEST, OnButtonTest)ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset)ON_BN_CLICKED(IDC_BUTTON_APPLY, OnButtonApply)//}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CLedDlg message handlers
BOOL CLedDlg::OnInitDialog(){
CDialog::OnInitDialog();// Set the icon for this dialog.The framework does this automatically // when the application's main window is not a dialog
}
void CLedDlg::OnButtonSet(){
//KillTimer(1);m_test=FALSE;UINT val =GetDlgItemInt(IDC_EDIT_NUM,&b,FALSE);memset(data,0,4);if(b){ BOOL b;BYTE data[4];DWORD bytes;// TODO: Add your control notification handler code here m_test=false;m_flash=false;n=0;ntime=0;flashtime=5;SetTimer(1,100,NULL);
return TRUE;// return TRUE unless you set the focus to a control
WriteFile(m_hDev2,&m_bValue,4,&m_dwBytes,NULL);} void CLedDlg::OnButtonOff(){
}
void CLedDlg::OnButtonFlash(){
}
void CLedDlg::OnTimer(UINT nIDEvent){
// TODO: Add your message handler code here and/or call default
BYTE test[4]={2,4,6,8};BYTE data[4];DWORD bytes;// TODO: Add your control notification handler code here
m_flash=!m_flash;// TODO: Add your control notification handler code here
//KillTimer(1);m_flash=FALSE;m_bValue = TRUE;WriteFile(m_hDev2,&m_bValue,4,&m_dwBytes,NULL);
} if(ReadFile(m_hDev3,&val,sizeof(val),&bytes,NULL)){
if(val!=oldval){ SetDlgItemInt(IDC_EDIT_INTERRUPT,val,FALSE);oldval=val;
} else {
}
} m_test=FALSE;for(i=0;i<4;i++){ } WriteFile(m_hDev,data,4,&bytes,NULL);data[i]=ledfont[0];TCHAR str[64];wsprintf(str,TEXT(“Error %d”),GetLastError());SetDlgItemText(IDC_EDIT_INTERRUPT,str);CDialog::OnTimer(nIDEvent);CDialog::OnTimer(nIDEvent);void CLedDlg::OnButtonTest()
flashtime=str[0]-'0';
if(flashtime==0)
{
flashtime=1;
} } }
第二篇:嵌入式课程设计报告
福建工程学院
《嵌入式系统》课程设计
报告书
题目:
基于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
/*包含了
MiniGUI
绘图函数的接口定义*/ #include
/*包含了
libminigui 中所有内建控件的接口定义*/ #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
/*控件扩展风格*/
}, { “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******************************n”);
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******************************n”);
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******************************n”);
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********************************n”);
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********************************n”);
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********************************n”);
break;
case ID_LED4:d++;
if(d%2!=0)
{
ioctl(fd_led,0,3);
draw_circular(hWnd,625,90,30,1);
printf(“*******************led33********************************n”);
}
else
{
ioctl(fd_led,1,3);
draw_circular(hWnd,625,90,30,0);
}
printf(“*******************led4********************************n”);
break;
case ID_START:printf(“*******************start1*********************n”);
number=SendMessage(GetDlgItem(hWnd,ID_COMBOBOX), CB_GETSPINVALUE, 0, 0);/*获取旋钮数字框的数值*/
printf(“**********%d*******************n”,number);
printf(“*******************start2*********************n”);
if(number!=0)
{
printf(“*******************start3*********************n”);
num=(int)(1000*(1.0/number));
/*将频率转换为时间*/
printf(“*******************start4*********************n”);
}
else
{
printf(“*******************start5*********************n”);
num=1000;
}
printf(“*******************start6*********************n”);
printf(“*******************start7*********************n”);
printf(“*******************start8*********************n”);
SetTimer(hWnd,ID_TIMER,num);/*创建定时器,时间为num*10ms*/ printf(“*************************SetTimer OK******************************n”);
SendMessage(hWnd,BM_CLICK,0,0);
/*发送点击信息*/ printf(“*************************SendMessage OK******************************n”);
//for(i=0;i++;i<10000)
/*当初用for循环时无法进入循环,也许是因为消息本身有循环机制,用for循环太多也许冲突,所以后来用了定时器*/
//{
//
printf(“********%d**********n,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*********************n”);
// 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);
// draw_circular(hWnd,325,90,30,1);
// draw_circular(hWnd,475,90,30,1);
// draw_circular(hWnd,625,90,30,1);
// printf(“*******************start10*********************n”);
//usleep(number);
//usleep(num);
// }
printf(“*******************start********************************n”);
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******************n”);
break;
}
}
return(DefaultDialogProc(hWnd,message,wParam,lParam));
/*对话框的缺省消息处理由 DefaultDialogProc 函数完成*/ }
static void InitDialogBox(HWND hWnd){ DlgInitProgress.controls=CtrlInitData;
/*将对话框模板结构和控件结构数组关联起来*/ DialogBoxIndirectParam(&DlgInitProgress,hWnd,DialogBoxProc,0L);/*创建对话框*/
printf(“*************create dialog**********************n”);}
/*****************************************************************
主窗口的过程函数
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*********************n”);
fd_led=open(“/dev/GPIO-Control”,0);
/*打开驱动设备*/
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结构指针/
{
TranslateMessage(&Msg);
/将击键消息转换为MSG_CHAR消息,然后直接发送到窗口的过程函数/
DispatchMessage(&Msg);
/获取消息的目标窗口的窗口过程,然后直接调用 该窗口过程函数对消息进行处理/
}
MainWindowThreadCleanup(hMainWnd);/清除主窗口所使用消息队列的系统资源/ *****************************************************************************/
return 0;
}
#ifndef _MGRM_PROCESSES #include
第三篇:嵌入式操作系统程课程设计报告
目录
一、实习任务和目的„„„„„„„„„„„„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 嵌入式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、x86、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.2 内核裁剪与移植
LINUX本次实验目录下存放着已经修改好的博创经典2410平台的内核源码包,将该源码包拷贝到宿主机LINUX系统中,解压至本次实验目录,配置编译生成内核uImage文件烧写到ARM设备中。在内核根目录下,用命令make menuconfig进入配置界面,对系统进行裁剪,如下:
选择硬件系统
配置LCD驱动
网卡驱动
配置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 的内容拷贝到此处创建的文件夹的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了,此时,就可以执行本用户程序了,结果如下:
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;
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来查看设备及中断的注册情况!
六、实习总结、心得体会:
通过为期将近几周的嵌入式操作系统实习,我收获颇深。这次实习虽然短,可是收获很大,感觉平时上课学到的东西都没有这几天学到的多。正所谓:“实践是检验真理的唯一标准”。这次实习可以形象的概括为:“山重水复疑无路,柳暗花明又一村”。只有自己经历过才会真正的懂,书本知识还远远不够!
此次嵌入式操作系统实习给我最深的体会就是:理论+细心+实践才能在实际 生产中体现所学知识的价值。
在嵌入式行业发展如此快速完善的今天,理论与细心与实际的完美结合才能让自己在专业领域占有一席之地。在实习中,我初步了解了嵌入式处理器S3C2410的工作原理、也加深了对嵌入式处理器S3C2410的认识;也见识了关于嵌入式处理器的一些工作方式等。
几周的嵌入式操作系统实习结束了,做了好几个小实验,有成功也有失败,然而终究还是学会了很多东西。在整个实习期间,我体会到了自己的进步,并且从中也体会到了它的快乐。实习也让我明白了:第一,通过实践真正觉得自己可以做些什么了有点存在的小成就感;第二,通过嵌入式操作系统实习,加强了我们的动手实践能力和设计创新精神。作为信息时代的大学生基本的动手能力是一切工作和创造的基础和必要条件。第三,在嵌入式操作系统实习的这些日子里,大家的团队精神得到了很大的加强,闭门就会造车那是不可能的事情。
在为期两周的实习当中感触最深的便是实践联系理论的重要性,当遇到实际问题时,只要认真思考,运用所学的知识,一步一步的去探索,是完全可以解决遇到的一般问题的。本次实习的目的主要是:使我们嵌入式操作系统及LINUX相关操作有一定的感性和理性认识,培养和锻炼我们的实际动手能力。使我们的理论知识与实践充分地结合,作到不仅具有专业知识,而且还具有较强的实践动手能力,能分析问题和解决问题的应用型技术人才,为以后的顺利就业作好准备。此次实习学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。在此,感谢老师及其他老师的细心指导,也同样谢谢其他各组同学的无私帮助!
七、参考资料:
1、雅默著.构建嵌入式LINUX系统[M].北京:中国电力出版社.2004年
2、孙琼著.嵌入式LINUX应用程序开发详解[M].北京:人民邮电出版.2003年 3、2410经典实验指导书3.2 北京博创兴业科技有限公司2410经典实验箱配套教材
4、韦东山著.嵌入式LINUX应用开发完全手册
北京:人民邮电出版
第四篇:嵌入式系统基础课程设计报告
河南机电高等专科学校
嵌入式系统基础课程设计报告
系 部: 电子通信工程系 专 业: 班 级: 学生姓名: 学 号:
2012年 06月
嵌入式系统基础课程设计任务书
1.时间:2012年06月11日~2012年06月15日 2.课程设计单位:河南机电高等专科学校
3.课程设计目的:深入学习单片机编程技巧,熟悉电子产品设计制作全过程。能够利用汇编语言完成十字路口交通灯的设计。4.课程设计任务:
按交通灯的具体要求来写
―――-红色文字为说明,写报告时请先删除!!
嵌入式系统基础课程设计报告
前言:
×××××××××××××××××××××××××××××××××××××××××××××××-----宋体,小四,不加粗,单倍行距
实训报告: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
„„„„„„
×××××××××××××××××××××××××××××××
―――-红色文字为说明,写报告时请先删除!!
心得体会: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
„„„„„„
××××××××××××××××××××××××××××××××××××××××××××××××××
参考文献:
„„„以下红色文字为“参考文献”的示例,写报告时请先删除!!填写上你自己的“参考文献”
[1] 周小谦,丁功扬,郭日彩,三峡电力系统的形成和发展,电网技术。1998,88(3):p1-3 [2]-----宋体,小五,不加粗,单倍行距
第五篇:嵌入式系统基础课程设计报告
河南机电高等专科学校
《嵌入式系统基础》 课程设计报告
设计题目: 系 部: 电子通信工程系 班 级: 学 号: 学生姓名: 成 绩:
2012年 05月
《嵌入式系统基础》课程设计任务书 1.时间:2012年05月14日~2011年05月25日 2.课程设计单位:河南机电高等专科学校
3.课程设计目的:掌握《嵌入式系统基础》课程基本概念、基本原理,具有一定的单片机设计能力,能够利用所学知识完成设计内容,提高实际动手能力。4.课程设计任务:
①参考相关的的书籍、资料,根据设计要求完成原理图设计; ②制作电路板并完成调试; ③绘制软件流程图; ④完成软件设计并完成调试;
⑤作好笔记,对自己所发现的疑难问题及时请教解决; ⑥联系自己所学知识,总结本次设计经验; ⑦认真完成课程设计报告。
5.设计要求
根据所给具体的设计要求来写!
《嵌入式系统基础》课程设计报告
前言:
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
一、硬件设计
1.设计思路及原理框图
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
………………
××××××××××××××××××××××××××××××× 2.采用的芯片功能介绍
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
………………
××××××××××××××××××××××××××××××× 3.原理图
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
………………
×××××××××××××××××××××××××××××××
二、软件设计
1.设计思路
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
………………
××××××××××××××××××××××××××××××× 2.程序流程图(必须要有)
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× ………………
××××××××××××××××××××××××××××××× 3.具体程序(可选,但流程图一定要有)
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
………………
×××××××××××××××××××××××××××××××
心得体会: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
………………
×××××××××××××××××××××××××××××××
参考文献:
[1] 付家才 电子实验与实践.北京:高等教育出版社130-150页
[2] 李东生、张勇、许四毛 《Protel 99SE电路设计技术入门与应用》电子工业出版社231-300页
………………
格式要求:
标题按照所给模板格式书写。
正文字体为:中文宋体,西文(字母和数字):Times New Roman,小四号字; 段落:两端对齐,首行缩进2字符,行距固定值20磅,其他设置为默认。
―――-红色文字为说明,写报告时请先删除!!