嵌入式课程设计心得体会

2021-01-01 来源:其他心得体会收藏下载本文

推荐第1篇:嵌入式课程设计心得体会

嵌入式课程设计心得体会

本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件开发及学习上的一些不足之处。下面就来详细写一下我关于此次课程设计的心得体会:

此次课程设计的实训的是由上海杰普公司的楚老师带我们完成的。楚老师看上去比较年轻,给我们很有亲和力,技术上也很强,而且讲解的比较详细,操作上相当娴熟。让我们感觉到了计算机科学技术学习的趣味性,计算机技术的实用性。此次课程设计给老师选择项目是在Linux下用C语言开发一个摄像头驱动程序。项目的实施方式是团队分组合作,共同完成,让我们体验了一下公司开发项目的氛围。我们一人一机,老师边讲边练,还有企业项目经理的全程指导。虽说一些些技术我们在课堂上也曾学习过,但是大多停留在理论学习上,实际开发很少,而这次课程设计给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大帮助,深刻体会到了这些技术的实用性。每当自己成功调试一段代码或者通过自己的努力克服一个技术困难,都颇有收获感。这次实训让我们体验了软件开发的全过程,发现自己的不足,了解了当前流行技术的软件开发,增加了一定的项目开发经验,增强了一定的就业竞争力。简短的回顾一下这几天我们所学习的:

实训的前一天下午,我们先明确了一下下周课程设计的要求和目的,跟上海杰普公司的楚老师相互认识了一下。然后楚老师给我们详细的讲解了这一周我们要做什么,并演示了一个他自己开发的摄像头驱动程序。同学们看了,都很感兴趣,如果自己能开发出这样的一个小程序,着实让人高兴。接下来的这几天我们就跟着范老师一起学习摄像头驱动的开发,同时我们也分了小组,模拟体验一下公司的团队开发 ,同学们都积极策划自己团队的名字、团队的口号、队歌……

我们首先从基本的Linux命令学起,以及linux底下的C语言的一些基本知识。虽说这学期我们也学过Linux开发技术,有一定的基础,但这几天的学习,还是感觉到我们学的太浅,很多的东西需要去深入的学习才能有所收获。而且深刻的体会到“熟能生巧”这句良训,光学不练还是白搭。后两天我们学习了Linux底下一些开发工具的使用,如Qt,感觉这些工具功能确实够强大。当通过自己写的代码能够控制摄像头拍照时,别提有多高兴了。当然在调试的过程中也遇到不少错误,每当通过自己的努力把问题解决(一般自己思考一下,查查资料都没问题),也是一种很好的收获。还有一个比较深刻的体会就是API及一些文档的查阅,这对开发人员来说是一个必须具备的能力。

一周的课程设计,一周的实训,在计算机这个博大深奥的领域我感觉自己还有好多东西要学,还有好多的东西不懂(这也再次坚定了我考研深造的决心)!嵌入式软件开发应用广泛而且前景很好,目前正处于人才紧缺的关口,嵌入式技术在未来能够得到更加广泛的应用。学好嵌入式,C语言很重要,所以感觉自己有必要在学习、积累一下这方面的知识。很多东西的学习不死一帆风顺也是比较耗时的,嵌入式也不例外,要想学好还必须下大力气,还必须坚持。这次的课程设计让我明确了一点:嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式系统开发对于我们的知识面要求非常的广,且要有一定的深度。这次的课程设计因为是一个有针对性的训练,所以记的会非常牢固。跟平时上课不太一样,平时上完理论课很少有时间上机进行时间或者隔几天才上机练习,等到上机时一些东西可能遗忘了,比较耗费时间。在课上,有老师在前面演示我们感觉看得懂或感觉没问题,可轮到我们独立完成的时候,因为实际操作的少,跟中问题就来了!我很感谢学校特别是学院老师有实训这样的安排,把我们这一学期学的东西系统的集中的进行训练,让我们深刻明确的体验了一下软件开发的流程!还要感谢给我们实训的楚老师,感觉楚老师能力很强,也很有耐心,即使老师讲了很多遍的问题,我们不会,老师还是会走进我们给我们耐心的指导,还给我们讲一些学习计算机的方法,一些软件开发需要注意的细节,让我们知道自己在哪方面不足,需要加强,也让我们了解到哪些需要认真的学习,那些是重点,不是没有方向的乱学一通,什么也学不好!经过这次的实训,我真真确确的感受到了计算机在我们生活中工作中的运用,这些软件、程序能让我们提高工作的效率,更直观更便捷的切入主题。当然,在学习的过程中并不是一帆风顺的,在这之中,因为要操作的东西很多,有时错一步,后面的结果就无法显示,而自己的计算机水平还有待提高,根本检查不出来是哪里出了错!这时候,老师都会耐心的过来帮助我!在平时我们就需要好好的查阅书籍或者上网搜集相关资料去解决问题。

此次实训最大的收获不是我学习到了多少知识而是这几天实训给我的感悟:首先是心态。一定要有一个积极的心态,独立解决问题的意识,培养扎实基础的认识。不要什么东西都感觉跟简单(很多东西可能是看似简单)就不去做了或者不屑一做,以至于性网上搜搜就可以了,这样很不好。有自己的东西有自己的付出才会有程序运行成功时的喜悦和小自豪,这样也有助于培养自己的兴趣。要时刻牢记态度决定一切。其次是兴趣,感觉学习工作中兴趣很关键,只是一个引发人积极性的问题,有了兴趣就自觉了,效率自然就高了。再次要敢于尝试和挑战。不要安于现成的程序,而且不要害怕失败,在程序调试的过程中这点尤为重要,“发现出问题然后解决问题”是一个积累经验的过程,而且很高效。最后要不懈追求。对于源代码进行不断的完善,要尽可能的实现课题所要求的功能。对于初学者或者开发较少的人来说,大量大写程序还是有必要的,但同时要注意思考,理解其实现的内在意义。还可以自己添加一些有意义的功能来实现。当看到自己编写的程序正常运行时,兴趣也会随之而来,乐此不疲,形成一个良性循环。

短短一周的课程设计很快结束了,我发现我对计算机这个专业、对嵌入式技术、对Linux都有了新的认识。通过这次的实训,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但真正掌握后,它带给我们的将是无穷的便捷与科技,我喜欢高端便捷的生活。我希望我能做计算机这个万能机器人的主人而不是奴隶,我会努力加油的!感谢学校,感谢老师给我的帮助,让我的思想、技能又上了一个台阶!感谢!加油!

推荐第2篇:嵌入式课程设计报告

福建工程学院

《嵌入式系统》课程设计

报告书

题目:

基于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)将libcro.sh考到minigui的lib库的解压文件夹中 (3)将rescro.sh 考到minigui的res资源解压文件夹中 (4)将samplecor.sh 考到sample例子解压文件夹中 (5)依次运行libcro.sh,rescro.sh,samplecor.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).再次运行samplecor.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、点击LED1\\LED2\\LED3\\LED4,分别控制四盏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:

Permiion 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 DlgInitProgre=

/*定义对话框模板.用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 meage, WPARAM wParam, LPARAM lParam) /*对话框过程函数,用来接收和处理所有发送到该窗口的消息*/ {

int number;

/*用来存从旋钮数字框获得的数值*/

static int t=0;

int num;

/*存放定时时间*/

switch(meage)

{

case MSG_INITDIALOG:

/*用户在定义自己的对话框回调函数时,需要处理

MSG_INITDIALOG消息,该消息是在

MiniGUI根据对话框模板建立对话框以及 控件之后 ,发送到对话框回调函数的 。*/

SendDlgItemMeage(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=SendMeage(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\");

SendMeage(hWnd,BM_CLICK,0,0);

/*发送点击信息*/ printf(\"*************************SendMeage OK******************************\\n\");

//for(i=0;i++;i

/*当初用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);

21

// 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,meage,wParam,lParam));

/*对话框的缺省消息处理由 DefaultDialogProc 函数完成*/ }

static void InitDialogBox(HWND hWnd) { DlgInitProgre.controls=CtrlInitData;

22

/*将对话框模板结构和控件结构数组关联起来*/ DialogBoxIndirectParam(&DlgInitProgre,hWnd,DialogBoxProc,0L);/*创建对话框*/

printf(\"*************create dialog**********************\\n\"); }

/*****************************************************************

主窗口的过程函数

static int LedWinProc(HWND hWnd, int meage, WPARAM wParam, LPARAM lParam) {

HDC hdc;

switch (meage)

{

case MSG_PAINT:

hdc = BeginPaint (hWnd);

TextOut (hdc, 60, 60, \"My leds control!\");

EndPaint (hWnd, hdc);

return 0;

case MSG_CLOSE:

DestroyMainWindow (hWnd);

PostQuitMeage (hWnd);

return 0;

}

return DefaultMainWinProc(hWnd, meage, 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);

/*打开驱动设备*/

23

if (fd_led

{

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(GetMeage(&Msg, hMainWnd)) /获取主窗口的句柄,指向MSG结构指针/

24

{

TranslateMeage(&Msg);

/将击键消息转换为MSG_CHAR消息,然后直接发送到窗口的过程函数/

DispatchMeage(&Msg);

/获取消息的目标窗口的窗口过程,然后直接调用 该窗口过程函数对消息进行处理/

}

MainWindowThreadCleanup (hMainWnd); /清除主窗口所使用消息队列的系统资源/ *****************************************************************************/

return 0;

}

#ifndef _MGRM_PROCESSES #include #endif

25

推荐第3篇:嵌入式系统课程设计

《嵌入式系统概论》综合设计报告书

设计题目:用键盘控制LED显示不同图形

中央民族大学 二零零八年十月三十一日

一、设计目的

了解LED点阵和矩阵键盘的工作原理。

二、设计内容

编写程序控制用矩阵键盘控制LED点亮,产生不同的图形。

三、设计方案

功能概述:

本设计要实现的功能是通过键盘控制LED点阵图形显示,如果键盘输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。

1、程序设计思路

本设计要实现键盘控制LED点阵图形显示,就必须要编写键盘和LED点阵的程序。先通过扫描矩阵键盘,得到键盘值,然后再调用点阵显示子函数,根据扫描的键盘值,在LED点阵上显示不同的图形。

2、主程序设计

主程序要实现的功能是矩阵键盘扫描,得到键盘值,然后把值传给LED显示函数。

程序流程图如下:

3、LED点阵显示函数设计

本函数要实现的功能是根据键盘的值,在LED点阵上显示不同的图形。 如果键盘的输入值为0-9则显示相应的数字,如果输入的是其他值,则显示“+”。本程序采用二维数组存放要显示的图形的字模,然后再通过逐行扫描LED点阵,把要显示的图形分8次显示,一次显示一行,利用人眼的视觉暂留效应,是人看到的是一个图形一次显示出来,通过一个循环控制图形显示的时间。 程序流程图如下:

4、点阵图形设计

根据8*8 LED点阵的原理,8X8 点阵共需要64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1 电平,某一行置0 电平,则相应的二极管就亮;

先绘制出要显示的图形如下:

根据图形中点亮的LED灯的位置,得到相应图形的16进制数,存放在二维数组Buf1[11][8]中。

所以要显示的图形的字模如下:

buf1[11][8]={ {0x3c,0x24,0x24,0x24,0x24,0x24,0x3c,0x00},

//0

{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},

//1

{0x3c,0x20,0x20,0x3c,0x04,0x04,0x3c,0x00},

//2

{0x3c,0x20,0x20,0x3c,0x20,0x20,0x3c,0x00},

//3

{0x24,0x24,0x24,0x3c,0x20,0x20,0x20,0x00},

//4

{0x3c,0x04,0x04,0x3c,0x20,0x20,0x3c,0x00},

//5

{0x3c,0x04,0x04,0x3c,0x24,0x24,0x3c,0x00},

//6

{0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x00},

//7

{0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c,0x00},

//8

{0x3c,0x24,0x24,0x3c,0x20,0x20,0x3c,0x00},

//9

{0x08,0x08,0x08,0x3e,0x08,0x08,0x08,0x00}

//+

};

四、程序源代码

//*************************************************************** #include #include #include #include // open() close() #include // read() write() #include

#define DEVICE_NAME \"/dev/led_ary_ctl\" #define DEVICE_NAME1 \"/dev/keypad\"

void Key(unsigned char b[]);

//------ main ---- int main(void) {

int fd;

int ret;

unsigned char buf[2] ;

double x;

char pre_scancode = 0xff;

printf(\"\\n start keypad_driver test \\n\\n\");

fd = open(DEVICE_NAME1, O_RDWR);

printf(\"fd = %d\\n\",fd);

if (fd == -1) {

printf(\"open device %s error\\n\",DEVICE_NAME1); }

else {

buf[0]=0x22;

while (1)

{

read (fd,buf,1);

if(buf[0]!= pre_scancode)

{

if(buf[0]!=0xff)

{

printf(\"key =%x\\n\",buf[0]);

Key(buf);

}

}

pre_scancode = buf[0];

usleep(50000);

}

// close

ret = close(fd);

printf (\"ret=%d\\n\",ret);

printf (\"close keypad_driver test\\n\"); }

return 0; }// end main //***************************************************************************** //--------------- void Key(unsigned char b[]) { int fd;

int ret;

int i,j,k;

unsigned char buf[2] ;

unsigned char buf2[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char buf1[11][8]={{0x3c,0x24,0x24,0x24,0x24,0x24,0x3c,0x00},

//0

{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},

//1

{0x3c,0x20,0x20,0x3c,0x04,0x04,0x3c,0x00},

//2

{0x3c,0x20,0x20,0x3c,0x20,0x20,0x3c,0x00},

//3

{0x24,0x24,0x24,0x3c,0x20,0x20,0x20,0x00},

//4

{0x3c,0x04,0x04,0x3c,0x20,0x20,0x3c,0x00},

//5

{0x3c,0x04,0x04,0x3c,0x24,0x24,0x3c,0x00},

//6

{0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x00},

//7

{0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c,0x00},

//8

{0x3c,0x24,0x24,0x3c,0x20,0x20,0x3c,0x00},

//9

{0x08,0x08,0x08,0x3e,0x08,0x08,0x08,0x00}

//+

};

// begin of led ary

buf[0]= 1;

buf[1]= 0;

if(b[0]

i=10;

fd = open(DEVICE_NAME, O_RDWR);

printf(\"fd = %d\\n\",fd);

if (fd == -1)

printf(\"open device %s error\\n\",DEVICE_NAME);

else {

for(j=0;j

{

for(k=0;k

{

buf[0]=buf1[i][k];buf[1]=buf2[k];

write(fd,buf,2);

}

usleep(1);

}

// close

ret = close(fd);

printf (\"ret=%d\\n\",ret);

printf (\"close led_driver test\\n\"); } } //-

五、设计结果

实现键盘控制LED点阵显示,输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。

六、心得体会

通过本次实验,我们对linux下的实验更加熟悉了,对LED点阵显示和矩阵键盘的原理有了深入的了解,掌握了点阵图形的设计方法和键盘的输入的读取,并把二者结合起来,实现了键盘控制点阵图形现实。

在实验过程中,我们也出现了问题,最开始时,由于不清楚点阵的C,R的高低位的对应情况,经过试验,才确定。然后就是点阵的显示是一闪即过的,然后我们通过循环控制了点阵的显示时间。总之,通过这次设计,我们都学到了很多东西。

推荐第4篇:嵌入式程序设计课程设计

课程设计

课 程 名嵌入式软件开发技术

题 目 基于嵌入式Linux的温度监测系统的

设计与实现

专 业 计算机科学与技术(嵌入式系统方向) 班 级 13计算机嵌入式系统班 学 号 学生姓名

2016年6月

摘要

温度是个很普遍而又非常重要的参数,在日常生活、工农业生产以及科研领域都有着广泛的应用。因此,研制能够准确地测量和记录这个参数值的系统具有十分重要的意义。

基于ARM的嵌入式温度监测系统是采用嵌入式Linux作为操作系统,针对以S5PV210为处理器的开发板设计的一个嵌入式温度监测系统。论文在分析了Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位机客户端。

论文首先介绍了通信网络中各种设备特性、总线结构及传输技术,然后根据单片机与PC机之间的串行通信原理,用ubantu完成温度监测系统的软件设计与实现,为用户提供一个友好的人机界面,对监测系统进行控制并显示采集后的数据。本系统还通过多线程实现了多个客户端与服务器的通信。

关键词:S5PV210;嵌入式Linux操作系统;DS18B20;网络编程

I

Abstract

Temperature is a very common and very important parameter, in daily life, industrial and agricultural production and scientific research fields have a wide range of applications.Therefore, it is very important to develop a system that can accurately measure and record the value of this parameter.The temperature monitoring system of base on the ARM is use of embedded Linux as the operating system for the proceor to S5PV210 development board designed for an embedded temperature monitoring system.Based on the analysis of the basic working principle based on the Linux device drivers discued development often encounter interrupt handling, congestion handling, I / O ports, and on this basis to achieve the embedded proceor based on open S5PV210 reading, writing, characters off the external RAM device driver and network drives.Combined with precision temperature sensor DS18B20, to achieve the correct temperature acquisition, and upload the data via Ethernet to a PC client.At first,the paper introduces the characteristics of various devices in a communication network, the bus structure and transmiion technology, and according to the principle of serial communication between SCM and PC, with ubantu complete temperature monitoring system software design and implementation, to provide users with a friendly man-machine interface, the monitoring system to control and display the data after collection.The system also enables communication via a plurality of multi-threaded client and the server.Key words:S5PV210; embedded Linux operating system; DS18B20; Network programming

II

1.引言.......................................................................................................................................1 1.1 设计背景及意义 ...............................................................................................................1 1.2 设计的主要内容 ................................................................................................................2 2.相关技术 ...............................................................................................................................2 2.1 嵌入式Linux ......................................................................................................................2 2.2 S5PV210 .............................................................................................................................3 2.3 socket网络编程 ..............................................................................................................3 3.具体实现功能 .......................................................................................................................4 3.1总体框架图 ........................................................................................................................4 3.2客户端功能 ........................................................................................................................5 3.3 服务器功能 ........................................................................................................................5 3.4 实验板输出信息 ...............................................................................................................5 4.具体实现过程 .......................................................................................................................6 4.1 交叉编译工具的安装 .......................................................................................................6 4.2 客户端模块的设计 ...........................................................................................................7 4.3 服务器模块 .......................................................................................................................8 4.4 LED点亮模块 ..................................................................................................................10 4.5 温度感应模块 .................................................................................................................11 5.测试结果分析 .....................................................................................................................13 5.1 各模块运行的效果 .........................................................................................................13 5.2 可扩展功能 ......................................................................................................................15 6.总结与展望 .......................................................................................................................15

第一章 引言

1.1 设计背景及意义

温度作为工业、农业、国防和科研等部门最普遍的测量项目。它在工农业生产、现代科学研究以及高新技术开发过程中也是一个极其普遍而又非

1

常重要的参数。因此,在这些领域中,对于这个参数的测量与控制就显得尤为重要,特别是在纺织工业、冶金、化工、食品、温室种植,汽车制造以及气象预报和科研实验室等许多地方,都具有举足轻重的作用。

以往这些工作大多是由人工完成,不但工作量大,记录的数据少,对温度的调节缺乏实时性,而且电路复杂,标定和校准也比较麻烦,难以满足现代温度测量的要求[1]。自从传感器技术、微控制器技术和计算机技术日渐成熟之后,现代的温度测量与控制系统克服了以往系统中存在的一些问题,比如对环境温度的控制与调节以及数据的记录都由微控制器或计算机自动完成,人们的工作量大大地降低,而且测得的数据也更加的精确,对环境温度的调节更具有实时性[2]。

1.2 设计的主要内容

此次主要采用嵌入式Linux作为操作系统,针对以S5PV210为处理器的开发板设计的一个嵌入式温度监测系统。在Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位机客户端。

温度监测系统根据Linux中的网络通信技术和串口通信技术来传输数据。用ubantu完成温度监测系统的软件设计与实现,为用户提供一个友好的人机界面,对监测系统进行控制并显示采集后的数据。本系统还通过多线程实现了多个客户端与服务器的通信。

第二章 相关技术

2.1 嵌入式Linux Linux是UNIX系统的一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它诞生与1991年的10月5日。以后借助与Internet

2

网,并进过全世界各地计算机爱好者的共同努力下,现已成为世界上使用最多的一种UNIX类操作系统,并且使用人数还在迅猛增涨。

本次设计采用Linux作为嵌入式操作系统的原因有以下几点:[3] 1) 低成本开发系统: 2) 可应用于多种硬件平台 3) 可定制的内核 4) 性能优异 5) 良好的网络支持

2.2 S5PV210

S5PV210又名“蜂鸟”(Hummingbird),是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器。

S5PV210采用了ARM CortexTM-A8内核,ARM V7指令集,主频可达1GHZ,64/32位内部总线结构,32/32KB的数据/指令一级缓存,512KB的二级缓存,可以实现2000DMIPS(每秒运算20亿条指令集)的高性能运算能力。

包含很多强大的硬件编解码功能,内建MFC(Multi Format Codec),支持MPEG-1/2/4,H.263,H.264等格式视频的编解码,支持模拟/数字TV输出。JPEG硬件编解码,最大支持8000x8000分辨率

内建高性能PowerVR SGX540 3D图形引擎和2D图形引擎,支持2D/3D图形加速,是第五代PowerVR产品,其多边形生成率为2800万多边形/秒,像素填充率可达2.5亿/秒,在3D和多媒体方面比以往大幅提升,能够支持DX9,SM3.0,OpenGL2.0等PC级别显示技术。

具备IVA3硬件加速器,具备出色的图形解码性能,可以支持全高清、多标准的视频编码,流畅播放和录制30帧/秒的1920×1080像素(1080p)的视频文件,可以更快解码更高质量的图像和视频,同时,内建的HDMIv1.3,可以将高清视频输出到外部显示器上。

2.3 socket网络编程

Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。[4] 几个定义:

(1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。

3

(2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。

(3)连接:指两个进程间的通讯链路。

(4)半相关:网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关,它指定连接的每半部分。 (4)全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)

这样一个五元组,叫做一个相关(aociation),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

第三章 具体实现功能

3.1总体框架图

图1 项目总体框架图

4

3.2客户端功能

1) 显示简单的用户界面 2) 发送命令给服务器 3) 接收服务器传输的数据 4) 显示温度数据

3.3 服务器功能

1) 接收客户端发送的命令 2) 处理命令

3) 把命令转发给硬件 4) 获取硬件处理所得的数据 5) 把该数据传给客户端

3.4 实验板输出信息

1) LED灯按照客户端的指令亮灭 2) 蜂鸣器唱歌

3) 核心板控制输出温度传感器的数据到服务器

5

第四章 具体实现过程

个应用系统要完成各项功能,首先必须有较完善的硬件作保证。同时还必须得到相应设计合理的软件的支持,尤其是微机应用高速发展的今天,许多由硬件完成的工作,都可通过软件编程而代替。甚至有些必须采用很复杂的硬件电路才能完成的工作,用软件编和有时会变得很简单。因此充分利用其内部丰富的硬件资源和软件资源。

程序设计语言有三种:机器语言、汇编语言、高级语言。本系统运用的是高级语言所编写,也就是C语言。所用到的开发平台为ubuntu系统。

4.1 交叉编译工具的安装

(1) 考虑到现今Linux平台发展,交叉编译平台编统一为arm-linux-gcc-4.4.3 (2) 在windows系统下,建立一个共享目录,如:e:/linux_file (3) 将光盘目录linux\\中的arm-linux-gcc-4.4.3.tar.gz 复制到e:/linux_file (4) 注意在进行虚拟机设置时使共享目录的有效,并添加共享目录e:/linux_file (5) 进入linux操作系统,root目录下建立一个Armcode的子目录,将共享目录下的文件arm-linux-gcc-4.4.3.tar.gz复制到该目录 (6) 然后进入到该目录,执行解压命令:#cd /root/Armcode; #tar xvzf arm-linux-gcc-4.4.3.tgz –C /; 注意:C 后面有个空格,并且C 是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。 (7) 执行

arm-linux-gcc

到/opt/FriendlyARM/toolschain /4.4.3/bin 目录。

(8) 把编译器路径加入系统环境变量,运行命令:#gedit /root/.bashrc 编辑/root/.bashrc 文件,在最后一行添加:export PATH=$PATH: /opt/FriendlyARM/toolschain/4.4.3/bin (9) 重新登录系统(不必重启机器,开始->logout 即可),使以上设置生效,在命令行输入:arm-linux-gcc –v,会出现如下信息,这说明交叉编译环境已经成功安装。

6

4.2 客户端模块的设计

用户界面的显示:

void interface_print(char *temp) { system(\"clear\"); printf(\"\\e[31m*******************2016梧*********************\\e[0m\\n\"); printf(\"\\e[31m*

*\\e[0m\\n\"); printf(\"\\e[31m*\\e[0m \\e[32m点亮LED1: on1

on2\\e[0m\\e[31m

*\\e[0m\\n\"); printf(\"\\e[31m*\\e[0m \\e[33m关闭LED1: off1

off2\\e[0m\\e[31m

*\\e[0m\\n\"); printf(\"\\e[31m*\\e[0m \\e[34m开蜂鸣器: onb

song\\e[0m\\e[31m

*\\e[0m\\n\"); printf(\"\\e[31m*\\e[0m \\e[35m获取温度: get

\\e[31m *\\e[0m\\n\",temp); printf(\"\\e[31m*\\e[0m \\e[36m退

出: \\e[0m\\e[31m

*\\e[0m\\n\"); printf(\"\\e[31m*

*\\e[0m\\n\"); printf(\"\\e[31m******************未

来**********************\\e[0m\\n\"); }

发送命令给服务器:

/*5.调用I/O函数(read/write)与客户端通讯。*/ int i = 5; int pos; while(1) {

ret = poll(pfd,2,-1);

if(ret >0){

if(pfd[0].revents == POLLIN){

interface_print(temp);

/*从终端读取数据*/

memset(buf,0,sizeof(buf));

ret = read(pfd[0].fd,buf,sizeof(buf)-1); 7

州学院

|

点亮LED2:

|

关闭LED2:

|

播放音乐:

|

温度:[%s]\\e[0m quit

|

} if(ret >0){

}

/*发送数据给服务器*/ write(sockfd,buf,ret);

接受服务器传输的数据:

if(pfd[1].revents == POLLIN){

if(!strncmp(buf,\"get\",3)){

/*接收服务器发送的信息*/

memset(temp,0,sizeof(temp));

ret = read(pfd[1].fd,temp,sizeof(temp)-1);

if(ret >0){

temp[ret-1] = \'\\0\';

/*把信息显示到终端*/

interface_print(temp);

}

} } 4.3 服务器模块

接收客户端发送的命令:

/*读取客户端信息*/

memset(buf,0,sizeof(buf));

ret = read(newfd,buf,sizeof(buf)-1);

if(ret >0){

把命令转发给硬件:

/*发送命令给硬件*/

if(!strncasecmp(buf,\"on1\",3)){

cmd = LED_ON;

val = 3;

}else if(!strncasecmp(buf,\"on2\",3)){

cmd = LED_ON;

val = 4;

}else if(!strncasecmp(buf,\"off1\",4)){

cmd = LED_OFF;

val = 3;

}else if(!strncasecmp(buf,\"off2\",4)){

cmd = LED_OFF;

8

}

val = 4;

}else if(!strncasecmp(buf,\"onb\",3)){

pwm_on();

}else if(!strncasecmp(buf,\"song\",4)){

pwm_music_fun();

}

if(ioctl(fd_led,cmd,(unsigned long)val)

perror(\"ioctl failed\\n\");

exit(1);

} } } return (void *)0;

获取硬件处理所得的数据:

void *do_temp(void *arg) { int newfd = *(int *)arg; char buf[100]; int dev_fd; unsigned int temp[2]; float tempvalue=0; unsigned pos;

dev_fd = open(\"/dev/fs210_gpio\",O_RDWR | O_NONBLOCK); if (dev_fd

perror(\"open\");

exit(1); }

while(1) {

temp[1]= ioctl(dev_fd,GPIO_ON,temp);

/*

temp[1]&=0xffff;

tempvalue=(float)(temp[1])*0.0625;

*/

if(temp[1]&0x8000)

{

temp[1]= ~temp[1]+1;

temp[1]&=0xffff;

tempvalue=(float)(temp[1])*0.0625;

9

} } else {

temp[1]&=0xffff;

tempvalue=(float)(temp[1])*0.0625; } memset(buf,0,sizeof(buf)); sprintf(buf,\"%f\",tempvalue); strcat(buf,\"\\n\"); write(newfd,buf,strlen(buf)); memset(buf,0,sizeof(buf)); sleep(1); } return (void *)0; 4.4 LED点亮模块

/*参考内核,采用静态的方式实现点灯和灭灯*/ void led_on(unsigned long val) { printk(\" %ld %s\\n\",val,__func__); gpio_set_value(S5PV210_GPC0(val),1); }

void led_off(unsigned long val) { printk(\" %ld %s\\n\",val,__func__); gpio_set_value(S5PV210_GPC0(val),0); }

long test_ioctl(struct file *file, unsigned int cmd, unsigned long data) { unsigned long val = data; switch(cmd){

case LED_ON:

led_on(val);

break;

case LED_OFF:

led_off(val);

break;

default:

break;

10

}

} return 0; /*向系统注册申请设备号*/ ret = register_chrdev(LED_MAJOR,LED_NAME,&led_fops); if(ret){ printk(\"register chrdev failed!\\n\"); errno = -EBUSY;

goto err1; }

/*创建一个设备类*/ led_dev->led_cla = cla_create(THIS_MODULE, LED_MODULE); if(IS_ERR(led_dev->led_cla)){ printk(\"cla create failed\\n\"); errno = PTR_ERR(led_dev->led_cla); goto err2; } /*创建一个设备文件,之后系统会自动在/dev目录下自动创建一个设备文件*/ led_dev->led_device = device_create(led_dev->led_cla,NULL,MKDEV(LED_MAJOR,0),NULL,\"led\"); if(IS_ERR(led_dev->led_device)){

printk(\"cla create failed\\n\");

errno = PTR_ERR(led_dev->led_device);

goto err3; } led_init();

return 0;

4.5 温度感应模块

static void WriteOneChar(unsigned char dat) { unsigned char i=0;

writel((readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);//gph1_0,output spin_lock(&lock); for(i=0;i

writel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);

__udelay(15);

11

if(dat&0x01){

writel(readl(gph1dat) | 0x1 , gph1dat);

}

else{

writel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);

}

__udelay(45);

writel(readl(gph1dat) | 0x1 , gph1dat);

__udelay(1);

dat>>=1; } spin_unlock(&lock); }

static unsigned int ReadTemp(void) { unsigned char T_h=0; unsigned char T_l=0; unsigned int temp=0;

writel((readl(gph1pud) & 0xFFFc) | 0x02, gph1pud);//gph1_0,pull-up enabled

spin_lock(&lock); Init_DS18B2O(); spin_unlock(&lock); __udelay(400); writel((readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);//gph1_0,output writel(readl(gph1dat) | 0x1 , gph1dat); WriteOneChar(0xcc); WriteOneChar(0x44); mdelay(100); spin_lock(&lock); Init_DS18B2O(); spin_unlock(&lock); __udelay(400); writel((readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);//gph1_0,output writel(readl(gph1dat) | 0x1 , gph1dat); WriteOneChar(0xcc); WriteOneChar(0xBE); T_l=ReadOneChar();//L T_h=ReadOneChar();//H

temp=(unsigned int) (((unsigned int)T_h

12

printk(\"temp=%x\\r\\n\",temp);

return temp; }

第五章5.1 各模块运行的效果

客户端:

测试结果分析13

图2 客户端运行效果

服务器:

图3 服务器运行效果

开发板:

14

图4 开发板的显示效果

5.2 可扩展功能

本项目的只是完成其中的一些功能,其可扩展性强,对进行加强完善,还可作如下扩展:

1.拓展成温度报警器,设定一个上限值和下下限值,当温度达到某个值时,如低于20摄氏度时,LED灯亮,高于40摄氏度时,蜂鸣器发出报警提示音。

2.可使开发板的核心板链接生活中的物件,如台灯,或者房间的灯,从而控制生活中物件的开关。

3.找到家庭电器中的接口,连接相应接口可实现远程控制家电。

第六章 总结与展望

通过这次的课程设计,让我受益匪浅,让我对智能硬件有了更深一层的了解,也体会了智能化在现实生活中的重要性,也让我了解和掌握了一些编程思想。让

15

我把理论知识用在实践中,实现了理论和实践相结合,从中更懂得理论的是实践的基础,实践有能检验理论的正确性,更激发了我对专业知识的渴求,这些对我以后参加工作或者继续学习都会有很大的帮助和影响。通过这次课程设计,让我意识到了自己的一些不足,从而让我认识到了学习的重要性。

虽然这次实训是那么短暂的1周时间,但是这几天我所学到的还是很多的,通过此次培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要教学环节,是对三年所学知识的复习和巩固。同时通过这次培训让我明白了一个很深刻的道理,让我意识到了团队合作的重要性,一个人不能完成的事情,团队能完成。团队精神有利于提高组织整体效能,只有通过发扬团队精神,才能取得更好的成绩。

因时间及精力有限,系统做的还不是很完善,还是有不足的地方,如果时间充足的话,还可以做得更完善,对其进行功能扩展。

以上这些收获对我来说是非常有帮助的,让我受益匪浅,它也是我人生中一笔宝贵的财富。

参考文献

[1] 李勇, 艾竹君, 刘巧云等.一种新型温度测量系统的设计[J].低温与超导, 2007, 35(5):451-454 [2] 马净, 李晓光,宁伟.几种常用温度传感器的原理及发展[J].中国仪器仪表, 2004, (6):1

16

[3] 曹忠明, 程姚根.从实践中学嵌入式Linux操作系统[M] .北京:电子工业出版社, 2014:8-9 [4] 陈刚 , 冯利美 .从实践中学嵌入式Linux应用程序开发[M].北京:电子工业出版社, 2012:193-192

推荐第5篇:《嵌入式系统》课程设计题目

《嵌入式系统》

课程设计题目及要求

2013年12月24日

设计报告要求:

1.课题研究意义、现状及应用分析;2.课题总体方案设计及功能模块介绍; 3.系统硬件平台及接口设计;

4.系统软件功能设计,程序流程图及代码实现,包括必要的注释;5.实验测试、结果分析; 6.总结、心得体会; 7.附主要的参考文献。

课程设计题目:(以下题目仅供参考,可自拟题目)

基于ARM的LED点阵显示系统的设计与实现

要求:在ARM开发平台下,实现接收串口发送的数据,在16*16的点阵屏上显示,按键上设置几个固定显示内容,当按下相应的按键时,点阵屏上显示相应的内容。

基于ARM的环境监测系统的设计与实现

要求:在ARM开发平台下,实现采集环境的温度、湿度、烟雾等参数的设

1 定,在液晶屏上显示出来。

基于ARM的步进电机控制系统的设计与实现

要求:在ARM开发平台下,实现步进电机的驱动,可通过实验平台上的电位器调整电机的转速,或者用按键控制电机的运转。 ARM实验平台的Android移植

要求:将开源的Android平台移植到ARM实验平台下。

基于ARM的CAN总线通讯系统设计与实现

要求:在嵌入式ARM平台CAN通信程序,实现两个ARM平台或ARM与其它设备的CAN通信。可将CAN总线接收到的数据通过串口输出,同时可将串口接收到的数据通过CAN总线接口发送出去。

基于ARM的RS485通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编程RS485通信程序,实现两个ARM平台或ARM与PC机之间RS485通信。

基于ARM的嵌入式Web服务器设计与实现

要求:在嵌入式ARM平台及Linux环境下移植一个嵌入式Web服务器(如BOA或THTTPD),并实现基于ARM平台的Web动态网页监测系统。

基于ARM的嵌入式数据采集系统设计与实现

2 要求:在嵌入式ARM平台下编写ADC接口的模入/模出程序,实现基于ARM平台的嵌入式3路模拟信号的数据采集,并将采集到的数据通过串口或液晶输出结果。

基于ARM的无线数据终端设计

要求:用ARM处理器作为主控器,与GPRS模块进行通信,能够实现收发短信、拨打接听电话、连接数据服务器等功能。 基于ARM的无线数据采集系统设计

要求:用ARM处理器作为主控器,与GPRS模块进行通信,通过发送短信到平台上获取平台采集到的数字量信息(温度、湿度、电压等信息)。 基于嵌入式系统的无线传感器网络的应用研究

要求:(无线传感器网络是集成了传感器、嵌入式系统、网络和无线通信四大技术而形成的一种全新的信息获取和处理技术,它是一种新型的无基础设施的无线网络,能够实时监测、感知和采集各种环境或监测对象的信息,并对其进行处理、传送到需要这些信息的用户) 基于UcosII在ARM平台上的移植 要求:将UcosII移植到ARM9或者ARM11平台上

MPlayer播放器在ARM9(或ARM11)平台上的移植与实现

基于ARM的建议GUI的设计

要求:设计一个简易的GUI界面,在ARM平台下运行,并实现简单的交互。

3 要求:将MPlayer播放器移植到ARM平台上,并且能够运行 基于ARM的TCP网络通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编写以太网接口的TCP通讯程序,实现两个ARM平台或ARM与PC机之间的TCP协议通讯系统。

基于ARM的UDP网络通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编写以太网接口的UDP通讯程序,实现两个ARM平台或ARM与PC机之间的UDP协议通讯系统。

基于ARM和MiniGUI的嵌入式图形用户界面设计与实现

要求:在嵌入式ARM平台及Linux环境下,采用MiniGUI图形界面编程方法,实现基于ARM平台和MiniGUI图形界面的嵌入式测控操作平台。

基于ARM和QT的嵌入式图形用户界面设计与实现

要求:在嵌入式ARM平台及Linux环境下,采用QT图形界面编程方法,实现基于ARM平台和QT图形界面的嵌入式测控操作平台。

基于ARM和Linux的步进电机控制系统设计与实现

要求:在嵌入式ARM平台及Linux环境下,编程实现基于ARM平台的步进电机控制系统方案。

基于ARM和Linux的直流电机控制系统设计与实现

要求:在嵌入式ARM平台及Linux环境下,编程实现基于ARM平台的直流

4 电机控制系统方案。

基于ARM和Linux的CAN总线通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编写CAN总线通信程序,实现两个ARM平台或ARM与PC机之间CAN总线通信。

基于ARM和Linux的CAN总线远程监控系统研究与设计

要求:在嵌入式ARM平台及Linux环境下编写CAN总线通信程序,并设计和实现一个基于ARM平台CAN总线远程监控系统。

基于ARM的视频监控系统设计与实现

要求:在嵌入式ARM平台及Linux环境下,采用USB接口的摄像头模块,设计和实现基于ARM平台视频监控系统。

基于ARM的Modbus/TCP主站协议程序设计与实现

要求:在嵌入式ARM平台及Linux环境下,基于ARM平台的RJ-45以太网接口,设计和实现基于ARM平台Modbus/TCP主站协议程序,该Modbus/TCP主站协议可与基于ARM平台或PC机的Modbus/TCP从站协议实现通讯。

基于ARM的Modbus/TCP从站协议程序设计与实现

要求:在嵌入式ARM平台及Linux环境下,基于ARM平台的RJ-45以太网接口,设计和实现基于ARM平台Modbus/TCP从站协议程序,该Modbus/TCP

5 从站协议可与基于ARM平台或PC机的Modbus/TCP主站协议实现通讯。

基于ARM和Linux的嵌入式测控系统研究与设计

要求:在嵌入式ARM平台及Linux环境下,可在ARM平台的AD/DA、串口、以太网接口、CAN总线接口等基础上,采用QT或MiniGUI图形用户编程方法,设计和实现基于ARM平台和Linux的嵌入式综合测控系统。

Mplay在Linux平台下的移植与实现

要求:将Mplayer移植到嵌入式实验平台下,可实现视频和音频文件的播放。

基于S3C2410/S3C2440的嵌入式Web服务器Boa移植

要求:将实验箱或开发板连接到网络中,可以通过计算机访问到开发板上的静态网页。

推荐第6篇:《嵌入式系统》课程设计题目

《嵌入式系统》

课程设计题目及要求

设计报告要求:

1.课题研究意义、现状及应用分析;2.课题总体方案设计及功能模块介绍; 3.系统硬件平台及接口设计;

4.系统软件功能设计,包括必要的注释;5.总结、心得体会; 6.附主要的参考文献。

课程设计题目:(以下题目仅供参考,可自拟题目)

基于ARM的LED点阵显示系统的设计与实现

要求:在ARM开发平台下,实现接收串口发送的数据,在16*16的点阵屏上显示,按键上设置几个固定显示内容,当按下相应的按键时,点阵屏上显示相应的内容。

基于ARM的环境监测系统的设计与实现

要求:在ARM开发平台下,实现采集环境的温度、湿度、烟雾等参数的设定,在液晶屏上显示出来。

1 基于ARM的步进电机控制系统的设计与实现

要求:在ARM开发平台下,实现步进电机的驱动,可通过实验平台上的电位器调整电机的转速,或者用按键控制电机的运转。 ARM实验平台的Android移植

要求:将开源的Android平台移植到ARM实验平台下。

基于ARM的CAN总线通讯系统设计与实现

要求:在嵌入式ARM平台CAN通信程序,实现两个ARM平台或ARM与其它设备的CAN通信。可将CAN总线接收到的数据通过串口输出,同时可将串口接收到的数据通过CAN总线接口发送出去。

基于ARM的RS485通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编程RS485通信程序,实现两个ARM平台或ARM与PC机之间RS485通信。

基于ARM的嵌入式Web服务器设计与实现

要求:在嵌入式ARM平台及Linux环境下移植一个嵌入式Web服务器(如BOA或THTTPD),并实现基于ARM平台的Web动态网页监测系统。

基于ARM的嵌入式数据采集系统设计与实现

要求:在嵌入式ARM平台下编写ADC接口的模入/模出程序,实现基于ARM平台的嵌入式3路模拟信号的数据采集,并将采集到的数据通过串口或液晶

2 输出结果。

基于ARM的无线数据终端设计

要求:用ARM处理器作为主控器,与GPRS模块进行通信,能够实现收发短信、拨打接听电话、连接数据服务器等功能。 基于ARM的无线数据采集系统设计

要求:用ARM处理器作为主控器,与GPRS模块进行通信,通过发送短信到平台上获取平台采集到的数字量信息(温度、湿度、电压等信息)。 基于嵌入式系统的无线传感器网络的应用研究

要求:(无线传感器网络是集成了传感器、嵌入式系统、网络和无线通信四大技术而形成的一种全新的信息获取和处理技术,它是一种新型的无基础设施的无线网络,能够实时监测、感知和采集各种环境或监测对象的信息,并对其进行处理、传送到需要这些信息的用户) 基于UcosII在ARM平台上的移植 要求:将UcosII移植到ARM9或者ARM11平台上

MPlayer播放器在ARM9(或ARM11)平台上的移植与实现

基于ARM的建议GUI的设计

要求:设计一个简易的GUI界面,在ARM平台下运行,并实现简单的交互。

基于ARM的TCP网络通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编写以太网接口的TCP通讯程序,

3 要求:将MPlayer播放器移植到ARM平台上,并且能够运行 实现两个ARM平台或ARM与PC机之间的TCP协议通讯系统。

基于ARM的UDP网络通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编写以太网接口的UDP通讯程序,实现两个ARM平台或ARM与PC机之间的UDP协议通讯系统。

基于ARM和MiniGUI的嵌入式图形用户界面设计与实现

要求:在嵌入式ARM平台及Linux环境下,采用MiniGUI图形界面编程方法,实现基于ARM平台和MiniGUI图形界面的嵌入式测控操作平台。

基于ARM和QT的嵌入式图形用户界面设计与实现

要求:在嵌入式ARM平台及Linux环境下,采用QT图形界面编程方法,实现基于ARM平台和QT图形界面的嵌入式测控操作平台。

基于ARM和Linux的步进电机控制系统设计与实现

要求:在嵌入式ARM平台及Linux环境下,编程实现基于ARM平台的步进电机控制系统方案。

基于ARM和Linux的直流电机控制系统设计与实现

要求:在嵌入式ARM平台及Linux环境下,编程实现基于ARM平台的直流电机控制系统方案。

4 基于ARM和Linux的CAN总线通讯系统设计与实现

要求:在嵌入式ARM平台及Linux环境下编写CAN总线通信程序,实现两个ARM平台或ARM与PC机之间CAN总线通信。

基于ARM和Linux的CAN总线远程监控系统研究与设计

要求:在嵌入式ARM平台及Linux环境下编写CAN总线通信程序,并设计和实现一个基于ARM平台CAN总线远程监控系统。

基于ARM的视频监控系统设计与实现

要求:在嵌入式ARM平台及Linux环境下,采用USB接口的摄像头模块,设计和实现基于ARM平台视频监控系统。

基于ARM的Modbus/TCP主站协议程序设计与实现

要求:在嵌入式ARM平台及Linux环境下,基于ARM平台的RJ-45以太网接口,设计和实现基于ARM平台Modbus/TCP主站协议程序,该Modbus/TCP主站协议可与基于ARM平台或PC机的Modbus/TCP从站协议实现通讯。

基于ARM的Modbus/TCP从站协议程序设计与实现

要求:在嵌入式ARM平台及Linux环境下,基于ARM平台的RJ-45以太网接口,设计和实现基于ARM平台Modbus/TCP从站协议程序,该Modbus/TCP从站协议可与基于ARM平台或PC机的Modbus/TCP主站协议实现通讯。

5 基于ARM和Linux的嵌入式测控系统研究与设计

要求:在嵌入式ARM平台及Linux环境下,可在ARM平台的AD/DA、串口、以太网接口、CAN总线接口等基础上,采用QT或MiniGUI图形用户编程方法,设计和实现基于ARM平台和Linux的嵌入式综合测控系统。

Mplay在Linux平台下的移植与实现

要求:将Mplayer移植到嵌入式实验平台下,可实现视频和音频文件的播放。

基于S3C2410/S3C2440的嵌入式Web服务器Boa移植

要求:将实验箱或开发板连接到网络中,可以通过计算机访问到开发板上的静态网页。

1.ARM-Linux 嵌入式系统在农业大棚中的应用(温度、湿度和二氧化碳浓度是影响棚栽农作物生长的3 大要素。为了实现农业大棚中这3 种要素数据的远程实时采集,引入了当前嵌入式应用中较为成熟的ARM9 微处理器和Linux 嵌入式操作系统技术, 采用温度传感器PH100TMPA、湿度传感器HM1500 和二氧化碳浓度传感器NAP221A ,设计一种基于TCP/ IP 协议的嵌入式远程实时数据采集系统方案。从硬件设计和软件实现2 方面对该系统进行具体设计。)

2.ARM系统在LED显示屏中的应用(利用ARM系统控制彩色LED显示屏)

3.ARM 嵌入式处理器在智能仪器中的应用(设计一种基于ARM 嵌入式处理器系统的智能仪器的硬件和软件设计方案, 并结合uc/o s2II或者 Linux嵌入式实时操作系统, 给出一套完整的任务调度和管理的方法, 最后用实例说明)

4.ARM系统在汽车制动性能测试系统中的应用(采用ARM系统构建一个路试法的汽车制动性能测试系统)

5.ARM 嵌入式控制器在印染设备监控中的应用(针对拉幅热定型机,设计一种基于485 总线的分布式监控系统。用ARM 嵌入式控制器实现主、从电机的同步运行和烘房温度的控制;在PC 机上用VB6.0 设计转速和温度的监控画面;实现ARM、变频器和PC 机之间的数据通信。)

6.基于ARM系统的公交车多功能终端的设计(完成电子收费、报站、GPS定位等功能)

7.基于ARM9的双CAN总线通信系统的设计(设计一种基于ARM9内核微处理器的双路CAN总线通信系统。完成系统的总体结构、部分硬件的设计,系统嵌入式软件的设计,包括启动引导代码U214118操作系统内核、文件系统以及用户应用管理软件四个部分。)

8.基于ARM9 和Linux 的嵌入式打印终端系统(嵌入式平台上的打印终端的外围电路连接设计、嵌入式Linux 的打印机驱动程序开发和应用程序的开发)

6 9.基于ARM 的车载GPS 终端软硬件的研究(重点研究基于ARM 的导航系统的软硬件设计) 10.ARM系统在B超系统中的应用(完成系统软件硬件设计,包括外围电路)

11.基于ARM 的嵌入式系统在机器人控制系统中应用(提出一种基于ARM、DSP 和arm- linux 的嵌入式机器人控制系统的设计方法, 完成控制系统的功能设计、结构设计、硬件设计、软件设计)

12.基于ARM的视频采集系统设计(完成系统软件硬件设计,包括外围电路,采用USB接口的摄像头) 13.基于ARM的高空爬壁机器人控制系统(构建一种经济型的爬壁机器人控制平台, 与上位机视觉定位和控制系统结合,使其适用于导航与定位、运动控制策略、多机器人系统体系结构与协作机制等领域。) 14.基于ARM 嵌入式系统的拟人机器人控制器的设计(提出在拟人机器人控制器的设计中使用ARM 9 处理器S3C2410 和RT2Linux构建小型拟人机器人控制器的系统架构, 从硬件和软件上实现以拟人机器人的行走的控制。)

15.基于ARM嵌入式系统的软测量应用(在基于Windows CE或者Linux操作系统的ARM嵌入式系统上实现一套通用工业过程软仪表。选用ARM嵌入式系统作为硬件平台, 基于普通PC 机上的嵌入式应用软件开发包EmbededVC + + 开发, 应用双重RBF 神经网络的模型作为软测量的数学模型。该软件包采用面向对象的软件体系结构,模块可以划分为系统调度、数据预处理、系统组态、核心算法、通讯和人机界面等6 个模块。)

16.基于CAN与嵌入式Linux的经济型数控系统(设计了一种基于CAN总线的嵌入式L inux215D数控系统,要求系统具有很好的开放性, 分布性和实时性)

17.基于ARM和GPRS的无线数据通信系统设计(完成基于ARM和GPRS的无线数据通信系统的软件硬件设计)

18.基于S3C2410 平台与嵌入式Linux 的图像采集应用(在基于嵌入式Linux 系统的S3C2410平台和在平台上进行开发所需的软件环境上实现图像采集这一应用,完成图像采集程序的实现,和JPEG 压缩的实现。)

19.基于uC/OSⅡ和ARM 芯片L PC2119 的基础上,研究μC/ OS - Ⅱ在鱼雷制导系统中的应用,成为系统软件和硬件设计)国防生 109.嵌入式系统设计中FLASH 存储器的应用研究(利用嵌入式微控制器实现对FLASH 的读取、编程和擦除操作, 为嵌入式系统功能扩展解决存储空间不足的瓶颈问题, 提供一个可靠的解决方案,完成系统的软件和硬件设计)

110.嵌入式系统网络接口模块设计(采用高速高性能的L PC2132 微控制器与以太网控制器ENC28J 60 和接口芯片MAX232 相连接实现网络接口模块软件和硬件设计)

111.嵌入式系统网络接口模块设计(设计基于TCP/IP的网络接口模块的软件和硬件设计)

112.嵌入式系统在DSP 与网络接口中的应用研究(根据嵌入式系统组成及其特点, 完成嵌入式系统在DSP与网络接口中的软件和硬件设计)

113.嵌入式系统在EPON系统开发中的应用研究(以PASSAVE公司提供的EPON解决方案为基础,利用PASSAVE公司的MAC控制芯片APS5001和APS6201开发OTL和ONU,对EPON的实际应用进行研究) 114.嵌入式系统在LED大屏幕异步控制器中的应用研究(设计一款基于32位高性能ARM处理器和uC/OS-II的LED大屏幕异步控制器,充分利用uC/OS-II高效的多任务管理功能和ARM处理器强大的运算能力,实现单屏幕多窗口的任意位置显示,使得屏幕显示内容变得更加丰富,显示方式变得更加灵活) 115.基于嵌入式系统的VGT:(variablegeometieturbine)涡轮增压器控制器的应用研究(对SOCP用于VGT等现代工业控制进行一些研究,包括嵌入式处理器系统、接口系统、DSP系统、数字通信系统、存储电路及数字系统)

116.嵌入式系统在变电站继电器保护系统中的应用研究(完成系统的软件和硬件的设计) 117.嵌入式系统在变电站综合自动化系统中的应用研究(本装置主要用于企业内部变电站电力线路保护的应用,设计一种基于ARM和嵌入式实时操作系统的微机线路保护装置,实现保护、测量和通信功能) 118.嵌入式系统在车辆导航监控系统中的应用研究(结合GPS全球卫星定位技术、GIS地理信息处理技术、CDMA数据通信技术以及嵌入式系统等高新技术对嵌入式系统在车辆监控系统的应用进行研究,实现

12 具备全天候定位、视频图像采集与无线传输等功能的GPS车辆监控系统)

119.嵌入式系统在车载导航中的应用研究(对嵌入式技术在车载导航系统中应用的关键技术进行研究) 120.嵌入式系统在抽油机无线监控中的应用研究(以嵌入式系统为主控单元,以GSM网络为数据通讯介质的抽油机无线监控系统的软件和硬件设计)

121.嵌入式系统在船舶监控系统中的应用研究(完成系统的软件和硬件设计) 122.嵌入式系统在大型设备无线故障诊断中的应用研究(针对某大型装备对故障诊断系统的智能化和便携化要求,提出一种基于无线嵌入式系统检测技术的在线监测与故障诊断的方案,各检测终端固化于装备上,主机与各智能检测终端通过无线网络通讯,从而免去了主机与各终端间的连接电缆,实现了诊断系统的小型化和智能化)国防生

123.嵌入式系统在道路检测系统中的应用研究(采用TI 高性能的DSP C5507 作为道路图像核心处理元件,实现道路信息的提取和视频图像的J PEG2000 压缩.同时采用Motorola 公司的MCF5307 实现系统的任务调度和道路信息的网络传输,完成了嵌入式μClinux 操作系统的移植,实现在道路检测系统中的组网应用)

124.嵌入式系统在电机远程监测中的应用研究(针对电机系统这一关键设备的远程网络监测,提出了在ARM处理器(主机)上运行嵌入式操作系统,远程监控客户机的网络监测方案)

125.嵌入式系统在电力通信服务器中的应用一人机界面设计(研究基于嵌入式Linux的电力通信服务器开发技术;硬件系统采用ARM9处理器;软件功能的实现与完善主要基于Linux操作系统及开发环境;利用嵌入式图形界面开发工具MniiGUI设计用户界面)

126.嵌入式系统在电子警察中的应用研究(完成智能综合电子警察自动监测系统的软件和硬件的设计) 127.嵌入式系统在断路器智能控制中的应用研究(完成基于嵌入式系统的断路器智能控制器的软件和硬件设计)

128.嵌入式系统在多端口电缆气压采集器中的应用研究(针对目前国内电缆气压采集器的现状及存在的问题,针对这些问题提出解决方案,并从硬件和软件两个角度对解决方案中采用的嵌入式系统(AT91RM9200 + Linux) 为核心的采集器进行软硬件设计)

129.嵌入式系统在发射装置中的应用研究(完成系统的软件和硬件设计)国防生

130.嵌入式系统在高速织机控制中的应用研究(将嵌入式系统应用于高速织机控制系统,对其硬件的关键部分(嵌入式处理器的控制接口部分) 和软件进行设计)

131.嵌入式系统在工程地震仪的应用研究(完成基于ARM处理器和嵌入式操作系统Windows CE.Net的微型工程地震仪的软件和硬件设计)

132.基于嵌入式实时操作系统的嵌入式控制系统研究(完成系统的软件和硬件设计)

133.嵌入式系统在工业控制中的应用研究(完成一个嵌入式工业控制系统的软件和硬件设计)

134.嵌入式系统在工业以太网监控中的应用研究(嵌入式系统在以太网工业监控中主要担当的任务是将现场的各种输入信号转换成可以直接连入以太网的输出信号,并实时接受远程客户端控制和访问,完成嵌入式现场终端的软件和硬件设计)

135.嵌入式系统在过电流保护装置中的应用研究(完成系统的软件和硬件设计)

136.嵌入式系统在环保监测领域内的应用研究(研制适用于环境监测系统实时性传输要求的监测传输控制器。采用GPRS或CDMA方式,解决原有监测传输控制器的费用高、覆盖范围小的问题。并实现了系统中随意增加或减少污染源的监测点) 137.嵌入式系统在环境监控中的应用研究(采用嵌入式技术环境监控系统,通过嵌入式网络监控编码器实现本地压缩和存储,同时把音视频数字信号通过网络传送到监控中心,使客户端能在PC 上基于Windows系统即可实时的查看到监控信息)

138.嵌入式系统在机房监控中的应用研究(利用嵌入式机房监控系统,解决机房监控系统的远程控制、程序维护等问题)

139.嵌入式系统在机器人视觉中的应用研究(开发一种通用的嵌入式系统平台, 进行操作系统的移植和图

13 像匹配等算法的研究, 并将其应用于移动机器人的视觉导航)

140.嵌入式系统在激光测量中的应用研究(利用嵌入式系统对激光测距仪进行控制及数据通信和处理, 并把参数显示在屏幕上)

141.嵌入式系统在加油站信息管理系统的应用研究(对加油站储油罐油品信息的采集是掌握成品油销售、库存等信息的重要手段,通过对罐内油品液位、温度、油气浓度的实时监控,石油公司就可以直接或间接地获取油品销售过程中各种信息)

142.嵌入式系统在静力测量中的应用研究(研究嵌入式系统在静力测量中的应用,目标机作为嵌入式系统应用平台,充分考虑系统的功能、可扩展性、功耗和体积要求,制定相应的组成模块。硬件系统由核心板和扩展板构成;而软件系统由引导程序、操作系统和文件系统组成) 143.嵌入式系统在军用电子设备故障诊断中的应用研究(电子装备现有的故障诊断系统一般无法完成装备工作过程中的实时在线状态监测。利用多种非接触式的传感器信息融合技术、以太网网络通信技术, 设计现场级嵌入式状态监测系统, 采用嵌入式微处理器构建最小系统实现实时地对系统各个重要部分进行信号采集和在线状态监测, 为在线智能故障诊断系统提供诊断信息)国防生

144.嵌入式系统在楼宇设备监控系统中的应用研究(以高性能的32位嵌入式芯片ARM920T为平台,以楼宇变配电监控系统为应用对象,针对系统各个构成部分进行研究开发)

145.嵌入式系统在螺纹探伤仪中的应用研究(钻具事故主要是由于钻具螺纹部分产生疲劳断裂而造成的。利用涡流原理研制出了钻具螺纹专用无损检测仪器,该仪器由于采用了嵌入式网络模块ETR100 ,利用C 语言进行复杂的计算编程,简化外围电路的设计,无需标准试块进行标定) 146.嵌入式系统在气浮转台无线测控实验中的应用研究(完成基于实时嵌入式系统的气浮转台无线测控通信子系统的软件和硬件设计)

147.嵌入式系统在数控零编程滚齿机中的应用研究(将嵌入式技术与数控零编程思想相结合,以μCOS2Ⅱ实时操作系统为核心,建立一套具有友好人机界面的零编程数控系统。突破传统的手工编写数控程序的方法,实现NC程序的自动生成;而且通过USB接口将系统巧妙的设计成了一个可移动的存储器,间接的扩大数控系统的存储容量;通过RS232串口,系统还能与滚齿机床实现NC程序的上传和下载,构成一个集NC程序自动生成、存储和传输的集成化系统)

148.嵌入式系统在铁路道口报警系统中的应用研究(完成嵌入式铁路平交道口自动报警系统的软件和硬件设计)

149.嵌入式系统在网络化销售系统中的应用研究(完成基于嵌入式处理器、嵌入式Linux 和GPRS 的网络化销售系统的软件和硬件设计)

150.嵌入式系统在微机继电保护中的应用研究(完成基于ARM9 和μC/OS-II 的微机继电保护系统的设计方案。系统以AT91RM9200 芯片为核心构成高速保护装置,利用实时嵌入式操作系统μC/OS-II,完成复杂的继电保护,而且保证装置的处理速度)

151.嵌入式系统在线路多参数自动测量系统中的应用研究(利用嵌入式系统控制多个传感器同时测量轨道线路,通过特定算法计算出线路不平顺程度,指导线路养护维修工作,确保列车运行安全)

152.嵌入式系统在相关处理机中的应用研究(利用FPGA和嵌入式系统实现千兆以太网传输系统,并将该系统应用在硬件相关处理机中。改善现有系统对LTA数据的采集和传送,而且缩短后处理的时间) 153.嵌入式系统在消弧线圈接地系统中的应用研究(完成系统的软件和硬件设计)

154.嵌入式系统在心脏疾病检测中的应用研究(以嵌入式系统为平台,设计无线远程心电监护系统和心音分析仪,综合运用嵌入式单片机技术、无线射技术、嵌入式TCP/IP网络技术、USB通信技术等) 155.嵌入式系统在新型矿用充电机中的应用研究(设计以嵌入式微控制器S3C44B0X为核心的控制电路所组成的新型矿用充电机,对基于ARM核嵌入式系统的PWM输出电路、高精度的检测电路、人机接口电路和保护电路的软件和硬件进行设计) 156.嵌入式系统在信息家电网络中的应用研究(针对多总线、多协议的传统智能家居系统管理不方便,可操作性差等缺点,提出一种基于嵌入式系统,通过RTL8019AS 以太网芯片实现和以太网通信的方案)

14 157.嵌入式系统在蓄电池充电中的应用研究(完成系统的软件和硬件设计)

158.嵌入式系统在液晶电光特性测试中的应用研究(完成一种智能液晶电光特性测试仪的设计,该设计以ARM9微处理器为控制和数据处理核心,并引入WINDOWS CE操作系统,带有用户图形界面,操作简单,可实现对液晶电光特性参数的智能测量和数据图形的显示输出)

159.嵌入式系统在医疗监护领域中的应用研究(以Intel公司的PXA255系列处理器,Linux在嵌入版本,MINIGUI图形工具包为平台,研究医疗嵌入式电子产品软件研发的技术特点)

160.嵌入式系统在医疗仪器上的应用研究(研究嵌入式系统在医疗仪器上应用的可能性、方法)

161.嵌入式系统在远程复位控制中的应用研究(设计基于嵌入式系统在远程复位控制器,系统采用微控制器作为控制核心,MT8870为音频解码芯片,以PSTN公话网为信号传输控制介质)

162.嵌入式系统在远程监控中的应用研究(对嵌入式系统进行软硬件的选择和设计。从价格、性能和功耗三方面考虑,核心硬件设计选用基于AR划7TDMI的32位处理器S3C44BOX作为主控芯片。软件分两部分:一是嵌入式操作系统的选择,二是在对TCP/PI协议理解的基础上,选择了一种适用于嵌入式系统的协议栈,并将其移植到嵌入式系统中)

163.嵌入式中央储备粮直属库远程监控系统设计(以中央储备粮某直属库远程自动监控系统项目为背景,完成嵌入式远程自动监控终端的设计。系统软件设计采用结构化设计中的模块化程序设计方法,根据功能的不同进行模块的划分,功能模块包括底层设备驱动模块、用户界面模块、GPRS 网络模块、通信协议模块等。嵌入式中央储备粮直属库远程监控系统实现粮库的分散控制与集中管理,和粮库的智能控制)

164.嵌入式系统在远程图像监控系统中的应用研究(完成系统的软件和硬件设计)

165.嵌入式系统在智能电梯中的应用研究(完成一种应用于电梯控制系统中的新型、高效的嵌入式控制系统的软件和硬件设计)

166.嵌入式系统在智能交通中的应用研究(根据嵌入式系统产品在ITS( In2telligent Traffic System ,智能交通系统) 应用中的工作稳定性高、环境适应能力强和设备独立性三个特点,探讨嵌入式系统在智能交通系统中应用)

167.嵌入式系统在中小型水电站中的应用研究(完成系统的软件和硬件设计) 168.嵌入式系统在自动化仪表中的应用研究(选择高性能的嵌入式微处理器,研究新型智能化、网络化的仪器仪表)

169.嵌入式语音识别及控制技术在智能家居系统中的应用研究(完成基于语音识别控制的智能家居系统方案设计。系统分软件和硬件两部分,上位机实现语音采集和识别、处理,发出相应的动作命令,通过串行通信,构成串行控制网络,控制具备符合接口规范的设备,通过语音实现对家用电器的遥控。对语音识别技术进行研究。经分析比较,采用基于HMM识别算法的MicrosoftSpeech SDK语音开发平台进行开发)

170.嵌入式远程数据采集系统技术的应用研究(利用嵌入式数据采集模块和网络通信技术,将分散的现场数据采集后传送到数据服务器进行集中处理)

171.嵌入式在小型网络视频服务器中的应用研究(完成一种基于嵌入式系统的小型网络视频服务器硬件和软件设计)

172.嵌入式在液位监控系统中的应用研究(针对液位远程监控的要求,把嵌入式与Internet技术相结合,采用了B /S (Browser/Server)模式对液位实施远程监控。在控制策略上,则采用九点控制算法,对液位实行控制。用户只需要在其他计算机上利用通用的网页浏览器,通过以太网访问监控页面的形式进行监控)。 173.嵌入式智能代理在制造系统中的应用研究(多代理技术(Multi2Agent)在制造系统中的应用,提高了制造系统的柔性,智能性和可重构性。采用嵌入式技术和智能代理技术相结合的嵌入式智能代理技术,实现多代理系统中设备智能代理的方案。该智能代理以嵌入式微控制器ARM为硬件核心,以嵌入式实时操作系统μC /OS2Ⅱ为软件平台。各智能代理间通过以太网实现互连和信息交互,共同协调完成加工任务) 174.嵌入式智能机器人路径规划应用研究(研究智能机器人路径规划算法的研究现状, 指出各种算法的优

15 缺点, 提出建立嵌入式智能机器人路径规划平台, 实现基于嵌入式实时系统的智能机器人路径规划算法)

175.嵌入式状态监测与故障诊断装置的设计(将工业以太网技术应用于工业设备监控系统,实现基于32 位高性能处理器AT91RM9200 的嵌入式远程状态监测与故障诊断装置)

176.嵌入式系统在变电站控制系统中的应用研究(完成系统的软件和硬件设计) 177.一种嵌入式微调度器的实现方法研究(分析常见嵌入式操作系统的任务调度算法,提出一种新的应用于智能仪表的实时任务调度算法,并在典型的8 位、16 位SoC 上进行设计,实现基于这种算法的嵌入式操作系统)

178.在嵌入式系统开发中仿真软件的特殊应用研究(在开发工业控制系统配套软件过程中应用嵌入式仿真软件)

179.占先式实时内核μC/ OS2II 在车辆动态监控/ 调度实验平台中的应用研究(为了满足车辆动态监控/ 调度实验平台车辆模拟系统实时多任务工作的需要,在系统主控CPU TMS320L F2407A 上移植嵌入式实时操作系统(RTOS)μC/ OS2 II ,开发基于μC/ OS2 II 内核的实时多任务软件系统,以满足系统正常工作时对多路传感器数据和上位机控制信息的实时处理。在μC/ OS2II 内核移植的基础上,按照系统需要划分任务、确定任务优先级、实现任务间通信和同步的具体方法进行研究)

180.实时嵌入式操作系统在单片机中的应用研究(在MCS - 51 系列单片机上移植μ C/OS - II 实时嵌入式操作系统)

推荐第7篇:嵌入式系统课程设计教学大纲

嵌入式系统课程设计教学大纲

课程名称:嵌入式系统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 结构与开发》,北航出版社

推荐第8篇:嵌入式心得体会

篇一:嵌入式心得体会

这学期才接触嵌入式系统感觉还称不上入门,我通过学习知道了嵌入式的发展前景很大,各个领域都用到了嵌入式,学好嵌入式不愁没饭吃。

广义上讲,凡是带有微处理器的专用软硬件系统都是嵌入式系统。如各类单片机和dsp系统。从狭义上讲,那些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的专用软硬件系统称为嵌入式系统。嵌入式系统由嵌入式硬件与嵌入式软件组成; 嵌入式硬件以芯片、模板、组件、控制器形式埋藏于设备内部。

理解“嵌入”的概念 主要从三个方面上来理解。

1、从硬件上,将基于cpu的处围器件,整合到cpu芯片内部,比如早期基于x86体系结构下的计算机,cpu只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部的16c550/2的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到cpu内部,还有pc机有显卡,而多数嵌入式处理器都带有lcd控制器,但其种意义上就相当于显卡。比较高端的arm类intel xscale架构下的ixp网络处理器cpu内部集成pci控制器(可配成支持4个pci从设备或配成自身为cpi从设备);还集成3个npe网络处理器引擎,其中两个对应于两个mac地址,可用于网关交换用,而另外一个npe网络处理器引擎支持dsl,只要外面再加个phy芯片即可以实现dsl上网功能。ixp系列最高主频可以达到1.8g,支持2g内存,1g×10或10g×1的以太网口或febre channel的光通道。ixp系列应该是目标基于arm体系统结构下由intel进行整合后成xscale内核的最高的处理器了。

2、从软件上前,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到rom中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入”,比如wince在内核定制时,会有相应选择,其中就是wordpad,pdf,mediaplay等等选择,如果我们选择了,在ce启动后,就可以在界面中找到这些东西,如果是以前pc上将的windows操作系统,多半的东西都需要我们得新再装。

3、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的rom中就实现了一个真正的“嵌入”。

嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层

1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用c和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成cpld的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。 硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、c语言。

2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有

三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。

驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。

3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操

作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,xp操作系统是微软投入300人用两年时间才搞定的,总时工时是600人年,中科院软件所自己的女娲hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。

4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及java方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于sip、h.

323、astrisk)方面又较为复杂,并且有难度了。

通过网上查询我发现目前国内外这方面的人都很稀缺。一方面,是因为这一领域入门门槛较高,不仅要懂较底层软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须懂得硬件的工作原理,所以非专业it人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,很多软硬件技术出现时间不长或正在出现(如arm处理器、嵌入式操作系统等),掌握这些新技术的人当然很少。嵌入式人才稀缺,身价自然就高,越有经验价格就越高。其实嵌入式人才稀少,根本原因可能是大多数人无条件接触,这需要相应的嵌入式开发板和软件,另外需要有经验的人进行指导开发流程。我们软件系的人学习嵌入式,显然应偏重于嵌入式软件,特别是嵌入式操作系统方面。对于搞嵌入式软件的人,最重要的技术显然是掌握主流嵌入式微处理器的结构与原理,必须掌握一个嵌入式操作系统,必须熟悉嵌入式软件开发流程并至少做过一个嵌入式软件项目。

然而我们都没有做过一个嵌入式软件项目,甚至连嵌入式的开发流程我也不清楚,我只了解了使用简单工具做一个简单的实验。只有去专研才能在嵌入式的领域站住脚,只有知道的比别人多才会更有竞争力。通过网上了解,我查询了嵌入式的入门和所需要的知识,其中c语言尤为重要,不管是做嵌入式软件还是硬件开发的人员,对c语言的掌握这个是必需的,特别是对于以后致力于嵌入式软件开发的人,现在绝大部分都是用c语言。其次,应该对操作系统有所了解,这对你对硬件和软件的理解,绝对有很大的帮助。应该把系统的管理理解一下,比如进程、线程,系统如何来分配资源的,系统如何来管理硬件的;知道了c语言和操作系统之后,再来看看嵌入式系统,我们主要学的是arm,用的是arm7, 深入理解arm不是件容易的事,只有在知道arm相关知识之后才能称得上嵌入式已经入门了。 与嵌入式有关的知识我也学了不少就是不能够综合在一起运用,组成原理,数据结构,操作系统,c++,这3门与嵌入式密切相关的学科都系统的学了一遍,但由于长时间没用到都有点忘记了,从网上得知嵌入式的学习与这些书有很大关系之后,我把嵌入式与以前学过的知识结合起来发现嵌入式的实验中很多都是共通的,我对嵌入式有了初步的理解。

我以为学习嵌入式应该分为2个部分:软件和硬件。关于硬件方面我接触到了数字电路教材和模拟电路方面的知识,但由于没有嵌入式cpu很难亲自动手来实现嵌入式的相关理论;嵌入式入门则需要不断地实验与分析,我只在实验课时做几个与所给的程序相关的小程序来实现一下;而软件方面则学过c语言,里面通常的语法曾今熟悉过;我通过下列方法来适应c语言在嵌入式中应用:首先重新翻看了下c的教材,看了些常见的语法,接着在编译器的角度来看待c,编译原理我刚学过,其中将高级语言与低级语言的翻译感觉在嵌入式中用到了很多;最后冲硬件的角度来看待c。嵌入式的核心包括嵌入式操作系统,嵌入式软件开发平台及工具以及嵌入式应用软件。这些决定怎样才能开发一个好的嵌入式系统。 下面谈谈我了解的嵌入式的相关知识与应用:

首先,嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应

用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式有如下几个突出的有点1.系统内核小,2专用性强,3系统精简4高实时性os5嵌入式系统的应用程序可以没有操作系统直接在芯片上运行,6嵌入式系统需要开发工具和环境。

嵌入式系统是近几年才风靡起来的,但是这个概念并非新近才出现。从20世纪七十年代单片机(最早的单片机是intel公司的 8048,出现在1976年)的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。经过30年的发展,嵌入式技术已经日趋成熟,在中国嵌入式机一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。

其次,嵌入式系统无疑是当前最热门最有发展前途的it应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。 嵌入式系统是软硬结合的学科,通常有两类人会去专研嵌入式:一类是学电子工程、通信工程等偏硬件专业的,另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。我是软件专业的学习嵌入式,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。嵌入式应用在很多方面,具体的可以分为工业控制,交通管理,信息家电,家庭智能管理系统,pos网络及电子商务,环境工程与自然,机器人,机电产品方面应用等方面。其中目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。例外还有很多地方用到了嵌入式系统,最近飞利浦和arm共同推出32位risc嵌入式控制器,适用于工业控制,采用最先进的0.18微米cmos嵌入式闪存处理技术,操作电压可以低至1.2伏,它还能降低25%到30%的制造成本,在工业领域中对最终用户而言是一套极具成本效益的解决方案。

那么该如何学好嵌入式我觉得应该从以下几点入手:

首先c语言,这个是毋庸置疑的,不管是做嵌入式软件还是硬件开发的人员,对c语言的掌握这个是必需的,特别是对于以后致力于嵌入式软件开发的人,现在绝大部分都是用c语言,你说不掌握它可以吗?至于如何学习c语言,我想这些基础的知识每个人都有自己的方法,关键要去学习,看书也好,网上找些视频看也好。很多人会问,c语言要学到怎么样,我觉得这没有标准的答案。我想至少你在明白了一些基础的概念后,就该写代码了,动手才是最重要的,当你动手了,遇到问题了,再反过来学习,反过来查查课本,那时的收获就不是你死看书能得到的。

其次,应该对操作系统有所了解,这对你对硬件和软件的理解,绝对有很大的帮助。应该把系统的管理理解一下,比如进程、线程,系统如何来分配资源的,系统如何来管理硬件的,当然,不是看书就能把这些理解透,如果不是一时能理解,没关系,多看看,结合以后的项目经验,会有更好的理解的。

还有应该学习下linux或者wince下的编程,这些对以后做应用的编程很有帮助,当然,如果做手机的话,那可以学习mtk、塞班、android等操作系统,android是以后发展的趋势,现在很热门,android也是基于linux系统封装的,所以建议先学习下linux。

还有,应该学习下单片机或者arm或者mips,很多人说我没有单片机的经验,直接学arm可以吗?我觉得那完全没有问题的,当然如果你学习过单片机,那最好不过了,以后学习arm就更简单了。

最后如果你把以上的知识都有所了解后,就该去阅读阅读一些优秀的代码,比如结合arm芯片手册学习去学习下uboot的源代码,了解下最小的系统开发,那对你整个嵌入式开发的非常有帮助的,可以的话,还可以学习下linux的源代码,当然如果你直接阅读2.6的代码,我想你会很痛苦的,可以先看看linux 代码早期的版本,比如0.12 的代码等等,麻雀虽

小,五脏俱全,如果你全看完了,那我想你就是一名很成功的嵌入式工程师。

以上就是我在本学期学习嵌入式后的心得及感想。 篇二:学习嵌入式的心得

嵌入式学习[转贴] 怎样做才能快速的嵌入式了? 其实,做工程是没有捷径可走的

先说做硬件: 把你的数字电路教材和模拟电路的教材读熟,暂时先把重点放在数字电路上面,接着把微机原理和接口技术读熟悉了,最好能用汇编写几个简单的程序上机调试一下,这是很重要的。

完成上面的工作大概需要半年,不管你有多么的聪明,除非你以前这个基础就打的不错,否则,还是老老实实花上至少半年的时间!还是那句话,没有捷径可走,如果你相信那些什么“21天学通xx”什么的,那么我告诉你,放弃做工程吧!再说,你这么容易就学会了,别人也能的,你确定能拿到高薪吗?

下一步,就是选择一个dsp(或其它的嵌入式cpu)平台作为你的目标平台,先熟悉它的架构和与外围电路的接口,然后学习她的指令集,也要写一些小程序去跑一下。这个时候,你应该去买一个开发板了,一般的厂家附带会给你一些demo程序,看懂它,理解它,修改它,在你的板子上跑一跑。 完成上面两步,说明你已经入了这个行业的门了,下一步,想成为高手的话,就是自己去设计一些项目了,这个阶段所花的时间每个人都是不同的,要看你的造化(主要是前面的基础是否牢固)了。

再说说软件:

在嵌入式行业,你想做软件开发的话,没别的,那就深入理解c语言,尤其是c的指针,如果你以前学过c,但是没有意识到c相比其它的高级语言的优点的话(不是听别人说的,你自己的体会),你可以按下面步骤来理解c:

1、重新翻一遍c的教材,记住一些常用的c语法,但不要死抠语法;

2、从编译器的角度来理解c;

从编译原理的角度来理解你工作中使用的高级语言,如果你做到这一点,至少有两个好处: 第一个好处是避免一大堆低水平重复出现的编译错误。一名优秀的coder平均在一个工作日中应该完成200行以上的源码,其编译错误应该控制在5个以下,要知道这200行源码不是一次完成的,所以大多数情况下你都要追求一次编译通过;

第二个好处是可以提高源码的可读性和效率。规范地编写你的代码使你自己的逻辑清晰,因为你明白多加几个括号和空行、多换行对齐、多注释,编译器是会自动识别的,不影响程序执行的效率,反过来,控制好递归调用和循环内的if语句才是提高程序效率的关键,要全力避免递归,但要深刻理解递归,能通过自己建立堆栈来把递归程序转换成非递归程序,要求还是较高的哦!

3、从硬件的角度来理解c。

完成上面3步,你就是c的高手了,接下来应该去看看软件工程方面的书了,这个我还不太懂,不敢妄言。

另外说说教材的选择:学一门东西,选好你的教材,只要一本就可以了。坚决防止这种情况的出现:去图书馆借很多本书,像抢劫似的,而只是每一本都翻翻,就又还给图书馆了的!注意上面我把汇编语言放在硬件学习的板块里面,是由于汇编跟硬件的关系太紧密了,以至于是先学汇编还是先学习硬件电路和cpu架构成了要分清到底是“先有鸡还是先有蛋”的千年哲学难题了。

嵌入式操作系统一览

其实,嵌入式系统并不是一个新生的事物,从八十年代起,国际上就有一些it组织、公司,开始进行商用嵌入式系统和专用操作系统的研发。这其中涌现了一些著名的嵌入式系统: windows ce microsoft windows ce是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对于从掌上电脑到专用的工业控制器的用户电子设备进行定制。操作系统的基本内核需要至少200k的rom。

vxworks vxworks是目前嵌入式系统领域中使用最广泛、市场占有率最高的系统。它支持多种处理器,如x8

6、i960、sun sparc、motorola mc68xxx、mips rx000、power pc等等。大多数的vxworks api是专有的。采用gnu的编译和调试器。

psos isi公司已经被winriver公司兼并,现在psos属于windriver公司的产品。这个系统是一个模块化、高性能的实时操作系统,专为嵌入式微处理器设计,提供一个完全多任务环境,在定制的或是商业化的硬件上提供高性能和高可靠性。可以让开发者根据操作系统的功能和内存需求定制成每一个应用所需的系统。开发者可以利用它来实现从简单的单个独立设备到复杂的、网络化的多处理器系统。

qnx qnx是一个实时的、可扩充的操作系统,它部分遵循posix相关标准,如:posix.1b实时扩展。它提供了一个很小的微内核以及一些可选的配合进程。其内核仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它os服务,都实现为协作的用户进程,因此qnx内核非常小巧(qnx4.x大约为12kb)而且运行速度极快。这个灵活的结构可以使用户根据实际的需求,将系统配置成微小的嵌入式操作系统或是包括几百个处理器的超级虚拟机操作系统。

palm os os-9 microwave的os-9是为微处理器的关键实时任务而设计的操作系统,广泛应用于高科技产品中,包括消费电子产品、工业自动化、无线通讯产品、医疗仪器、数字电视/多媒体设备。它提供了很好的安全性和容错性。与其他的嵌入式系统相比,它的灵活性和可升级性非常突出。 lynxos lynx real-time systems的lynxos是一个分布式、嵌入式、可规模扩展的实时操作系统,它遵循posix.1a、posix.1b和posix.1c标准。lynxos支持线程概念,提供256个全局用户线程优先级;提供一些传统的、非实时系统的服务特征;包括基于调用需求的虚拟内存,一个基于motif的用户图形界面,与工业标准兼容的网络系统以及应用开发工具。

目前,世面上有很多商业性嵌入式系统都在努力地为自己争取着嵌入式市场的份额。但是,这些专用操作系统均属于商业化产品,价格昂贵;而且,由于它们各自的源代码不公开,使得每个系统上的应用软件与其它系统都无法兼容。并且,由于这种封闭性还导致了商业嵌入式系统在对各种设备的支持

方面存在很大的问题,使得对它们的软件移植变得很困难。在嵌入式这个it产业的新的关键领域,linux操作系统适时地出现在了国家和国内各嵌入式厂商面前,由于linux自身诸多优势,吸引了许多开发商的目光,成为嵌入式操作系统的新宠。它的出现无疑为国家发展嵌入式操作系统事业提供了一个极有吸引力的机会。

前言

这个题目很大,给人一种感觉我好像很成功,其实不然。实际上自己水平不高,甚至很低,但是做过了一些曲折的学习道路,同时把自己真实的学习历程表达出来,希望对后来者有借鉴的意义,甚幸! 工作三年、几成废人!

我2000年毕业于华中地区的一个理工科大学,专业是机械电子,我当时已经签了一家内陆某个省级机关工作,家里八辈是农民,并且很偏远,能够进入这样的地方是祖坟有风水。但在毕业前夕有个进入it的机会,我本想进去的,家里人极力反对,阻力可想而知。同时要交4000元的违约金,对我来说是天文数字。大学里的费用很多是借的,几乎将近一半的费用是在大学勤工俭学挣的,为了省钱,高中一个学期回家一次,大学一年回去一次。并且我个人也有特殊的人生背景(悲景更确切),这里不多说了,写十篇也写不完,同时偏离主题。这样我就参加了工作。一张报纸一杯茶的日子,几乎下班后有种很空虚和恐慌的感觉。在工作中虽然是与自己专业有点关系,但是很少。专业几乎荒废。我自己也思考,如果再不出去,自己将会成废人,只好让国家养了。两年后决定出去,但是几成废人,谁要呢,只好到学校去镀金。这是中国教育和社会的悲哀!

至于专业就改为计算机方面,听说好找工作,我说实话不是很对计算机特别感兴趣,生存第一需要。不要笑我,哈哈!

考研成绩出来,超过了国家线几十分。那个方向要两个,我第三,但是那年非碘,不面试就按分数来排,自然我落选了。其实给我面试机会也不一定要我,哈哈,自己几斤几两很清楚。

最后调剂到另外一个学校,交钱,咬咬牙,交吧!现在仍然债台高筑!

进入学校前夕

为什么要把这段列出,看后就知道了。

单位有网络,经常上网查些英语资料,在那里唯独英语没有丢很多。于是我就在网上查资料,学什么好呢,最后确定学嵌入式把,听说跟硬件相对比较紧密!而我在大学里多少学习了数字电路,单片机等,所以多少也有所利用,不会真的一无所知。当然在这之前也自学过数据结构,计算机组成原理等。

c 语言在大学就学了。哈哈这就是我的家底。

我知道自己的基础差,于是我就拿操作系统,数据库、数据结构、c++来看,机关有这个好处,空余时间多,于是平常就看书,很痛苦,没有人请教。

另外就上网到论坛上去,我就到各个专业的技术论坛,其实是电子论坛和嵌入式论坛。我几乎没有发帖,几乎把几个大型的出名的论坛的帖子翻遍了,虽然有很多重复的,我才知道嵌入式是个什么东东。这些帖子对我以后的学习产生了极大的影响。

最关键两点:

1、嵌入式是什么?

2、嵌入式需要哪些知识?

知道了这两点,好办!我就开始规划学习路线。计算机的基本理论不能丢,于是重点看组成原理,数据机构,操作系统、c++。同时论坛上了解到,实时操作系统ucos是一个很好的嵌入式操作系统,对初学者很好。于是我就买了一本书,但是代码在电脑里调不通,网上也有很多相同的问题,我就看书,分析代码,一遍不行就两遍,三遍,这样才看了入了门,才知道什么是进程。原来看操作系统书时,根本就不知道进程是个什么东西。

在这段时间掌握的东西不多,但是,对我以后的影响很大,我想起了大学时一个同学跟我说过了一句话:大学里最重要的不是学到了什么,最重要的是学会怎么学!大概是这个意思。

进入我的避难所

对我来讲,再次进入大学不再是大学,而是避难所。希望这次进入给我喘气和养精蓄锐的机会和时间。我是这样认为和实践的。

在学校我有三件事:上课,上图书馆,上网。

对于上课,学校开了很多课程,非常好,很多是名人名师讲解,于是很多同学都想学,都去听。我也考虑过,最后放弃。我是这样认为的,时间是有限的,什么都想学,什么都学不成。于是我把我自己学的课进行了分化,一般的课程通过就行,重要的一定好好学。我希望不要什么争论学习课程多和少的问题,这仅仅是我的看法。所以我的成绩应该是很差的。分数低。好在后来的单位没有要我的成绩单,否则就惨了。

我个人感觉是上图书馆的效率比在寝室里高多了,这是我的经验。

有人会问,您下了那么多资料,怎么看的完和消化的了呢?

我是这样对待这个问题的:

1、网上资料比较零散,不系统,但是如果把差不多的东西收集起来看就相对完整了,(嵌入式的图书就是这两年特别多,特别是2004年,简直是向外涌!2003年想买本嵌入式,特别是嵌入式linux的不多。

2、对于像我这种入门的来说,很多看不懂,没关系,反复看,我个人对学习方法的一个总结是:重复是最好的老师!

3、即使有的用不上,也可以收集以后用的上时查阅。

但是我并非什么都要,目前我的技术路线是嵌入式linux,所以像wince之类基本上不

收集。

总之,我在学校里我充分利用时间来学习,我看到一些同学整天的挂在网上打游戏,发

些无关痛痒的帖子,浪费时间呀!我真的很痛心!

学习嵌入式

在这里我把它单独列出,文章有点紊乱,但是内容希望有益。

1、学习linux 根据我在论坛的了解,我选择学习嵌入式linux,刚好我们学校也重视嵌入式linux,从实验室到课程安排都是关于嵌入式linux方面,天时地利!这里我把学习linux的经验和教训说说。

可以这样说,在论坛里说道学习linux差不多就学习linux内核。于是我电脑里安装了linux就开始看linux内核方面的书了。我记得来学校以前就买到一本陈莉君的讲linux内核的第一版,现在有第二版了。我就开始看那本说,大家说linux内核情景分析不错,我就买了上下册,后来又买了 《深入理解linux内核》,最后也买了毛德操的《嵌入式系统》也是分析linux内核代码的,主要讲arm相关的。

看内核期间是个非常痛苦的过程,看情景分析有种在森林中找出路,其间我组织了一些同学学习内核,几乎没有几个能坚持下来的。我认为我是坚持下来了。情景分析在看第

一、第二遍是几乎没有摸到门道,我分析有三个方面的原因:

1、自己的基础差,这是最关键的。

2、内核本身很难。

3、没有交流和高人指点。到了第三遍时我才摸到门,才差不多知道个linux的大概脉络,很多细节也是稀里糊涂。

学习linux总结,这里声明一下,我指的嵌入式主要是偏向软件的嵌入式。学习嵌入式的重点和难点关键在操作系统,如果没有掌握操作系统,我认为很难把握一个嵌入式系统。即使在做嵌入式开发中,作应有层的开发几乎可以不知道操作系统也可以开发,我认为那是浮在表面的。很难深入和提高自己的层次。声明:一孔之见!不可深究!

在学习linux内核过程中犯了一个极其严重路线错误:对linux几乎不懂就开始学习内核。我个人推荐一个学习路线是:使用linux—〉linxu系统编程开发---〉驱动开发和分析linux内核。而我差不多相反,实际上你不会使用linux也可以学习内核,但是如果你懂了这些东西学习更有效率。

关于要不要学习内核的问题,我的回答如下:不一定。如果你是喜欢钻研的那你进入内核会满足你的欲望。同时对你以后的嵌入式系统的开发有很好的影响。如果你想从事嵌入式linux系统开发,最好对内核有所了解。如果仅仅是做应用开发没有必要。我打个比喻:c、c++、java等语言是武林中的某个武林派别的话,如什么拳法,什么刀法等,那么linux 内核应该是一个人的内功的反应。 怎么开始学linux内核:最好有三件宝物:《深入理解linux内核》《情景分析》和源代码。

先看《深》,那主要讲原理,好像市场上有本讲原理性并且更浅,《linux内核设计与实现》听说不错。如果没有学习操作系统的,像我这样的,最好先看看操作系统原理的书。看了几遍后,就看情景分析,最好对着《深》看。两本交叉看,《深》是纲,《情》是目。最后深入代码。

2、学习嵌入式linux 学习嵌入式,我认为两个重点,cpu和操作系统,目前市场是比较流行arm,所以推荐大家学习arm。操作系统很多,我个人对开始学习的人,特别不是计算机专业的,推荐学习ucos。那是开源的,同时很小。学习很好。为什么选linux,我不想讲太多,网上这方面的太多,但是我在工作中发现,做linux的技术路线很难,在windows几乎不会有的问题,在linux开发中几乎遍地陷阱。一掉进去划很长时间出来,一旦解决自己又长进了!相对来说开发周期长,难度大。现在资料也逐渐丰富起来,难度也降低了些!

至于怎么学习,这是他的特色地方,必须有块开发板,我是同学里最早买学习板的,虽然化钱,我认为值。对我实习和工作产生了很大的影响。

如果没有开发板,那是纸上谈兵。有人说,那要1000-2000亚,的确是,兄弟,看长远的,对您的职业和发展那点钱不算什么!有的人说我站着说话不腰痛,好吧,钱这东西对我影响很大,我在大学里扫厕所,扫的不错,奖5元/月。兄弟你有过吗?我认为教育投资是效益最有保障的!我实习拿3k,很多同学拿1-2k,当然比我高的也有。虽然我现在没有毕业,但一家公司就签了。从事目前流行的高档的消费电子的研发。对于我两年前一无所知的我,应该有质的变化,我感谢学校收了我这个废品。当然我也非常的努力。说这么多并不是要炫耀我什么,实际上根本不值得炫耀,虽然现在工作环境和待遇比较满意,但是,我发现我很差,特别是代码能力,我希望平常大家少玩游戏,多编程。编程才是硬道理!

3、学习板和培训

你可以不接受培训,但是不能不买开发板。如果你想学习嵌入式一定要买块学习板,最好买块arm9的,贵些也值。可以跑高级操作系统。这个不要什么品牌公司的,一般不会出什么问题,市场上的板子一般是三星的2410,基本上是抄的。如果是做产品那要注意些。一般的公司一般要2000,加lcd要3000甚至更多。我接触到有的板只要1200,加lcd也就2000,差别比较大,我认为学习都够啦。

对于培训,如果有条件最好参加,主要是嵌入式相对别的不同,自己摸索很费时,如果有高手指点非常的好,进步快。特别是认识做这些的朋友。我接受过培训,认识个朋友。在以后的工作中帮我很多,在这里谢谢他!我记得哈佛的一个mba的学生这样说,大意是:在哈佛学到什么不重要,最重要的是这些未来各大公司的高级管理人员是我的同学!真是有远见!

目前市场是培训比较贵,一个星期两三千,真正算起来也要,那些讲师待遇绝对不会低。但是有个致命的问题是连续上课,一连几天,效果不佳。我希望社会上多出些1000元左右,并且时间长些,如一个月,一周一到两次课。如果没人做,我来做,哈哈!

没有想到,一下写了这么多,其实还想写的,比如在中科院的一位老兄是怎样学习linux内核和看书的,真的很感动。他的为人我很钦佩。也想介绍毛德操的《嵌入式系统》那本书,对学习arm linux 篇三:学习嵌入式心得体会microsoft word 文档

10计本班 黄田丽 05111001021 学习嵌入式心得体会

首先,我们学习的课本是嵌入式系统应用教程。我学习的体会是这样的: 开始时,由于是刚刚入门,对老师书的好多东西是好奇的,好多名词也是新鲜的,不过不太懂什么意思。但是慢慢的,了解的深入让我有了更深的感触和体会。

在嵌入式的学习过程中,让我了解了什么是嵌入式系统。它就是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能、可靠性、成本、体积、功耗有严格要求的计算机系统。他一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、用户应用程序四个部分组成,用于实现对其他设备的控制、监视或管理功能。嵌入式系统已经应用于科学研究、工业控制、军事技术、交通通信、医疗卫生、消费娱乐等领域,人们日常使用的手机、pda、汽车、智能家电、gps等均是嵌入式系统的典型代表。

一开始我们就学习嵌入式的系统的基础部分,那很简单,就是一些定义或是介绍之类的。在进入第二章时,就开始学习了嵌入式开发过程中的主要操作系统——linux,在接下来的课程中,我发现嵌入式的学习过程还是蛮有趣的。在对linux的学习中,我们对它有了一点点的了解,接着就是学习一虚拟机的方式安装linux。对我来说有趣的就是安装的过程了,首先我们跟着老师的脚步走,学会了怎么安装,在自己动手进行对它的安装,这个过程是简单而有趣的。这样的开始让我对它充满了兴趣,也对以后的学习充满了信心。

其次就是安装好了之后,老师就更深一步的教我们应用了。在这是老师首先交给我们的是一些简单的命令应用,linux具有很丰富的命令,绝大多数命令具

有大量的参数。在学习命令的过程中,只要你认真的看着老师操作还有认真听着他讲,你就会发现有些命令的操作还是很简单的,不过在操作的过程中,我也有遇到有些困难,会出现你按照书上学习的例子,将命令输入终端时会出现你不想要的结果,也就是错误的结果。这是问问旁边的同学或是懂的同学就可以解决了。在对于这部分的学习中,让我知道了命令对于嵌入式的重要性。它是linux的重要内容,linux中所有的功能都是通过命令执行。在实际应用中,为了减少系统开销,经常不使用图形界面,此时,对系统的所有操作都需要以命令方式来执行。在嵌入式系统开发过程中,由于目标机的性能和配置比较低,因此,一般情况下目标机仅具有命令窗口而没有图形界面,对目标机的所有操作都通过命令来实现。

还有的那就是进一步学习与嵌入式系统开发相关的linux的服务,他们的启动、设置等的操作和应用。而在学习之中,我们主要介绍的是嵌入式系统中开发工程使用的tftp、telent和nfs服务。第一个实现的事上机位与下机位之间文件的传输、无磁盘网络的设备的启动等功能;第二个实现的事远程登录功能;第三个实现的是网络文件系统功能。

从以上的内容之中,并不难感受到我们的学习过程是由浅入深的,这对于我们的学习也有了较好的帮助。

当然,我们学习的不仅仅是这么几个内容,其中还有相关的实验内容。在我们基础的学习的过程之中,我有了这么一点的感受,总的来说就是概念加专业名词还有介绍加实验。不过你绝对不能小看那些概念和介绍,它对我们有着很重要的指导作用哦!实验那就更不用说了,它提高我们的动手能力,在实验的过程中还能让你更加理解书中的理念,这就是我学习嵌入式的感受。 篇四:嵌入式课程设计心得体会

嵌入式课程设计心得体会

本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件开发及学习上的一些不足之处。下面就来详细写一下我关于此次课程设计的心得体会:

一周的课程设计,一周的实训,在计算机这个博大深奥的领域我感觉自己还有好多东西要学,还有好多的东西不懂(这也再次坚定了我考研深造的决心)!嵌入式软件开发应用广泛而且前景很好,目前正处于人才紧缺的关口,嵌入式技术在未来能够得到更加广泛的应用。学好嵌入式,c语言很重要,所以感觉自己有必要在学习、积累一下这方面的知识。很多东西的学习不死一帆风顺也是比较

耗时的,嵌入式也不例外,要想学好还必须下大力气,还必须坚持。这次的课程设计让我明确了一点:嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式系统开发对于我们的知识面要求非常的广,且要有一定的深度。这次的课程设计因为是一个有针对性的训练,所以记的会非常牢固。跟平时上课不太一样,平时上完理论课很少有时间上机进行时间或者隔几天才上机练习,等到上机时一些东西可能遗忘了,比较耗费时间。在课上,有老师在前面演示我们感觉看得懂或感觉没问题,可轮到我们独立完成的时候,因为实际操作的少,跟中问题就来了!我很感谢学校特别是学院老师有实训这样的安排,把我们这一学期学的东西系统的集中的进行训练,让我们深刻明确的体验了一下软件开发的流程!还要感谢给我们实训的楚老师,感觉楚老师能力很强,也很有耐心,即使老师讲了很多遍的问题,我们不会,老师还是会走进我们给我们耐心的指导,还给我们讲一些学习计算机的方法,一些软件开发需要注意的细节,让我们知道自己在哪方面不足,需要加强,也让我们了解到哪些需要认真的学习,那些是重点,不是没有方向的乱学一通,什么也学不好!经过这次的实训,我真真确确的感受到了计算机在我们生活中工作中的运用,这些软件、程序能让我们提高工作的效率,更直观更便捷的切入主题。当然,在学习的过程中并不是一帆风顺的,在这之中,因为要操作的东西很多,有时错一步,后面的结果就无法显示,而自己的计算机水平还有待提高,根本检查不出来是哪里出了错!这时候,老师都会耐心的过来帮助我!在平时我们就需要好好的查阅书籍或者上网搜集相关资料去解决问题。

此次实训最大的收获不是我学习到了多少知识而是这几天实训给我的感悟:首先是心态。一定要有一个积极的心态,独立解决问题的意识,培养扎实基础的认识。不要什么东西都感觉跟简单(很多东西可能是看似简单)就不去做了或者不屑一做,以至于性网上搜搜就可以了,这样很不好。有自己的东西有自己的付出才会有程序运行成功时的喜悦和小自豪,这样也有助于培养自己的兴趣。要时刻牢记态度决定一切。其次是兴趣,感觉学习工作中兴趣很关键,只是一个引发人积极性的问题,有了兴趣就自觉了,效率自然就高了。再次要敢于尝试和挑战。不要安于现成的程序,而且不要害怕失败,在程序调试的过程中这点尤为重要,“发现出问题然后解决问题”是一个积累经验的过程,而且很高效。最后要不懈追求。对于源代码进行不断的完善,要尽可能的实现课题所要求的功能。对于初学者或者开发较少的人来说,大量大写程序还是有必要的,但同时要注意思考,理解其实现的内在意义。还可以自己添加一些有意义的功能来实现。当看到自己编写的程序正常运行时,兴趣也会随之而来,乐此不疲,形成一个良性循环。

短短一周的课程设计很快结束了,我发现我对计算机这个专业、对嵌入式技术、对linux都有了新的认识。通过这次的实训,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但真正掌握后,它带给我们的将是无穷的便捷与科技,我喜欢高端便捷的生活。我希望我能做计算机这个万能机器人的主人而不是奴隶,我会努力加油的!感谢学校,感谢老师给我的帮助,让我的思想、技能又上了一个台阶!感谢!加油! 篇五:暑期嵌入式培训实践心得体会

暑期嵌入式培训实践心得体会

大二下学期,大学里的同学都面临着一次选择,考研或者就业,培训机构纷纷到学校来招生,很多人都犹豫了,也包括我。因为要花一部分费用,而且自己还没毕业,考虑到父母的经济能力,在反复和家里商量后,因为就业形势严峻,而自己又不想考研,我意识到了这是自己走向社会一个关键的转折点,也可能是人生的转折点,所以我选择参加了培训。

刚出来的时候对这些行业我们也不是很了解,以前甚至都不知道嵌入式是什么,通过老师的介绍和自己在网上看到的一些资料,发现嵌入式软件开发的前景很好,目前嵌入式软件工程师也是紧缺人才,通信工程从事这方面也有专业优势,自己大学里学习的知识都可以在以后的工作中得到应用,于是我们选择了来港湾做嵌入式软件工程师的培训。这里有非常浓厚的学习氛围。这里能够感受到社会上工作的压力,来这里学习的同学不全是大学刚毕业或者是还没有毕业的大学生,有的是在工作几年之后又回来学习的,可能他们也感觉社会在快速发展,自己也应该多学点有用的知识,以便更好地立足社会。从他们身上我能感觉到压力,能感觉到自己的不足,让我感觉自己学习不再只是为了一场考试,而是今后工作和生活的实力与能力。

嵌入式技术的掌握是需要一个过程的。实事求是的说,嵌入式技术的全面掌握是有相当难度的。可以轻轻松松学会嵌入式技术的说法是夸大其词了。这个就像学英语一样,学英语无论怎样学,不管是“疯狂学”还是用新理念来学,真正掌握的话还是需要一步步积累才能熟练掌握。要想在几天内学会嵌入式,成为这方面的高手。这些想法本身是不太现实的。

现在我需要主意的是:

第一:把心踏实下来,做好打硬仗的准备。 第二:注意学习方法。尽量不要走弯路,争取一鼓作气入门。一旦入门了以后呢就好办了。嵌入式技术的掌握,本身呢就比较难,要是再走些弯路,时间上会浪费,甚至会影响学习的信心。 第三:不能影响我平时的课程。不能拿了芝麻,丢了西瓜。

根据我在论坛的了解,我选择学习嵌入式linux,刚好我们学校也重视嵌入式linux,有一些专业课也是相关的。

暑假的时间十分宝贵。当培训没有开始时,我电脑就里安装了linux就开始看linux内核方面的书了。我就开始看那本说,大家说linux内核情景分析不错,我就买了上下册,后来又买了 《深入理解linux内核》,最后也买了毛德操的《嵌入式系统》也是分析linux内核代码的,主要讲arm相关的。

看内核期间是个非常痛苦的过程,看情景分析有种在森林中找出路,其间我组织了一些同学学习内核,几乎没有几个能坚持下来的。我认为我是坚持下来了。情景分析在看第

一、第二遍是几乎没有摸到门道,我分析有三个方面的原因:

1、自己的基础差,这是最要害的。

2、内核本身很难。

3、没有交流和高人指点。到了第三遍时我才摸到门,才差不多知道个linux的大概脉络,很多细节也是稀里糊涂。

学习linux总结,学习嵌入式的重点和难点要害在操作系统,假如没有把握操作系统,我认为很难把握一个嵌入式系统。即使在做嵌入式开发中,作应有层的开发几乎可以不知道操作系统也可以开发,我认为那是浮在表面的。很难深入和提高自己的层次。学习嵌入式,两个重点,cpu和操作系统,目前比较流行arm,所以学习arm.操作系统很多,但是我在实践中发现,做linux的技术路线很难,在windows几乎不会有的问题,在linux开发中几乎遍地陷阱。一掉进去划很长时间出来,一旦解决自己又长进了!

在刚开始接触的时候,我也是抱着本书,自己摸索,可是越看越迷茫,连很多书里的名词都不知道是什么意思 ,去网上查也没有得到答案。可是在培训的时候我得到了很好的指点,在这里,由于老师都是十分有经验的项目经理,他们懂得如何去学习,从哪里开始入手,这对于我这样的背景知识比较薄弱又接触时间比较短的人来说实在是太有帮助了。

学习嵌入式,c 很重要,以前在学校的时候,c学得并不扎实,一开始老师带着我们把c 从头过了一遍,才感觉到自己确实基础不行,于是又认真的把c 过了一遍,在暑假的这些日子里,学习一直很紧张,进度很快,不过老师们很负责,我们遇到的问题都会认真得给解决,学习过程中我接触到了很多新鲜的知识和技术,确实开了不少眼界,了解了嵌入式开发的基本流程,学习过程中,可能是第一次接触到这些以前根本没见过的知识,一开始学很吃力,好多东西都听不懂,更别说把它们联系起来,所以一开始一直很苦恼。

嵌入式学习,是比较耗时的,前期需要很多知识做铺垫,有很多人在这个过程中走了不少弯路,于是开始失去耐心、失去信心,以至最终放弃学习。所以我想有必要强调一下问题,在刚开始的时候,自己什么都不懂,可是学习的愿望很强烈,每次上课都希望上完课就能如何如何,可是下来发现自己好像离自己原本的目标还很远,于是心里着急,自己跑到网上搜了很多资料,每天乱看,可是并没有很大的帮助。我想说的是,学习嵌入式一定要有耐心和毅力,不能急躁,按照课程的安排自己多做一些总结和练习,等到知识慢慢的积累下来就会有一种豁然开朗的感觉。

虽然课程还没有完,可是在这段时间的学习中,我按照老师的指导在完善的课程体系下进行系统的学习,已经掌握了u-boot、kernel以及linux移植的基本框架,(我想在今后的学习中一定会对这些知识更加熟悉以至精通!)这对于2个月前什么都不懂的我来说已经是很大的提高了!用得是arm9的板子,这也是市场上现在比较新的,比较流行的板子,很多公司在实际的产品开发中就用的是arm9。在课堂上,老师的讲解和我们的练习相结合,理论联系实际。老师除了讲解知识外,还结合了大量的实际案例和操作,这对于我对问题的理解和知识的记忆有很大帮助。开学后我还需要继续参加培训学习。一个暑假有意义的培训实践,我相信在我以后的求职,工作中,这个暑假给与我的,不仅仅只是个好工作,还有各种学习热情,方法。

推荐第9篇:嵌入式心得体会

对于电焊,虽然一点都不陌生,但亲手操作的机会却只有几次,因此我很庆幸能够有这样的焊接机会,进行这样的实践。

焊接看似容易,实则需要长时间练习才能掌握。刚开始的时候,手一直在抖,尤其这次焊的还是贴片电容、电阻,原器件比以前焊的小好多,用镊子的手一抖就夹不住了,拿着烙铁的手抖得都不容易将器件焊上,焊出来的焊点也特别难看,在不断尝试,不断挑战自我的过程中,我的手不抖了,也基本能掌握锡的用量了,当焊点终于不再“丑不忍睹”的时候,对焊接也没有当初的恐惧了。对自己的动手能力也有了信心。

在焊接的过程中我学到了许多以前我不知道的东西,比如,以前我只知道有电烙铁,但不知道它还有好多种类,有单用式、两用式、调温式、恒温式、直热式、感应式、内热式和外热式。松香可以将多余的锡弄下来,用酒精可以把板擦的干净些。通过视频和查找资料,知道了在焊不同的器件时用的电烙铁的头不同,比如在焊引脚时要用尖头,焊CPU时要用刀口,为防止锡将焊引脚的小孔堵住,用松香把纸条粘在小孔上,把小孔盖住,把CPU的引脚对齐,用锡先涂满两边,固定好芯片,在焊另外两边,然后用尖头的电烙铁沾着松香将多余的锡弄下来。

本次课程设计的是信号发生器,信号发生器在EDA课程,数字信号处理课程中都曾涉及,所以还是较为熟悉的,在设计之前查阅了一些相关书籍,也从网上查找了一些相关资料,程序代码中运用到了C语言,将程序加入到嵌入式结构框架中,进行定义变量,端口,设定所用的GPIO参数等等。

在焊接的过程中我不仅学到了知识,而且让我深深地体会到一个团队中各成员合作的重要性,要善于团队合作,在进行团队合作的时候,还要耐心听取每个成员的意见,每个人都有长处和短处,只有在包容别人的同时我们才可以取长补短,不断完善和不断进步,交到更多的朋友,学到更多的知识。同时还让我明白:做任何事都要一心一意,严谨认真,反复琢磨,不能畏惧,要有信心和勇气,一定要做好充分的准备。不能盲目去做,要坚持,还要学会反思跟总结,我们不是为了完成任务而完成,这还是一个学习跟提高的过程。

在大学里学的不是知识,而是一种叫做自学的能力。在这个知识爆炸的时代,知识更新太快,靠原有的一点知识肯定不行。以后的工作中肯定会用到一些新的知识对一些电子机器进行开发设计,我们只能在自己以前的基础上努力自学尽快掌握知识。必须在工作中勤于动手慢慢琢磨,不断学习,不断积累。遇到不懂的地方,自己先想方设法解决,实在不行可以虚心请教他人,而没有自学能力的人迟早要被企业和社会所淘汰。

推荐第10篇:嵌入式心得体会

这学期才接触嵌入式系统感觉还称不上入门,我通过学习知道了嵌入式的发展前景很大,各个领域都用到了嵌入式,学好嵌入式不愁没饭吃。

广义上讲,凡是带有微处理器的专用软硬件系统都是嵌入式系统。如各类单片机和DSP系统。从狭义上讲,那些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的专用软硬件系统称为嵌入式系统。嵌入式系统由嵌入式硬件与嵌入式软件组成;嵌入式硬件以芯片、模板、组件、控制器形式埋藏于设备内部。

理解“嵌入”的概念主要从三个方面上来理解。

1、从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构下的计算机,CPU只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部的16C550/2的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到CPU内部,还有PC机有显卡,而多数嵌入式处理器都带有LCD控制器,但其种意义上就相当于显卡。比较高端的ARM类Intel Xscale架构下的IXP网络处理器CPU内部集成PCI控制器(可配成支持4个PCI从设备或配成自身为CPI从设备);还集成3个NPE网络处理器引擎,其中两个对应于两个MAC地址,可用于网关交换用,而另外一个NPE网络处理器引擎支持DSL,只要外面再加个PHY芯片即可以实现DSL上网功能。IXP系列最高主频可以达到1.8G,支持2G内存,1G×10或10G×1的以太网口或Febre channel的光通道。IXP系列应该是目标基于ARM体系统结构下由intel进行整合后成Xscale内核的最高的处理器了。

2、从软件上前,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到ROM中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入”,比如WinCE在内核定制时,会有相应选择,其中就是wordpad,PDF,MediaPlay等等选择,如果我们选择了,在CE启动后,就可以在界面中找到这些东西,如果是以前PC上将的windows操作系统,多半的东西都需要我们得新再装。

3、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的ROM中就实现了一个真正的“嵌入”。

嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层

1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。

2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有

三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。

驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。

3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操

作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定的,总时工时是600人年,中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。

4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及Java方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、H.

323、Astrisk)方面又较为复杂,并且有难度了。

通过网上查询我发现目前国内外这方面的人都很稀缺。一方面,是因为这一领域入门门槛较高,不仅要懂较底层软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须懂得硬件的工作原理,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,很多软硬件技术出现时间不长或正在出现(如ARM处理器、嵌入式操作系统等),掌握这些新技术的人当然很少。嵌入式人才稀缺,身价自然就高,越有经验价格就越高。其实嵌入式人才稀少,根本原因可能是大多数人无条件接触,这需要相应的嵌入式开发板和软件,另外需要有经验的人进行指导开发流程。我们软件系的人学习嵌入式,显然应偏重于嵌入式软件,特别是嵌入式操作系统方面。对于搞嵌入式软件的人,最重要的技术显然是掌握主流嵌入式微处理器的结构与原理,必须掌握一个嵌入式操作系统,必须熟悉嵌入式软件开发流程并至少做过一个嵌入式软件项目。

然而我们都没有做过一个嵌入式软件项目,甚至连嵌入式的开发流程我也不清楚,我只了解了使用简单工具做一个简单的实验。只有去专研才能在嵌入式的领域站住脚,只有知道的比别人多才会更有竞争力。通过网上了解,我查询了嵌入式的入门和所需要的知识,其中C语言尤为重要,不管是做嵌入式软件还是硬件开发的人员,对C语言的掌握这个是必需的,特别是对于以后致力于嵌入式软件开发的人,现在绝大部分都是用C语言。其次,应该对操作系统有所了解,这对你对硬件和软件的理解,绝对有很大的帮助。应该把系统的管理理解一下,比如进程、线程,系统如何来分配资源的,系统如何来管理硬件的;知道了c语言和操作系统之后,再来看看嵌入式系统,我们主要学的是ARM,用的是ARM7, 深入理解ARM不是件容易的事,只有在知道ARM相关知识之后才能称得上嵌入式已经入门了。 与嵌入式有关的知识我也学了不少就是不能够综合在一起运用,组成原理,数据结构,操作系统,C++,这3门与嵌入式密切相关的学科都系统的学了一遍,但由于长时间没用到都有点忘记了,从网上得知嵌入式的学习与这些书有很大关系之后,我把嵌入式与以前学过的知识结合起来发现嵌入式的实验中很多都是共通的,我对嵌入式有了初步的理解。

我以为学习嵌入式应该分为2个部分:软件和硬件。关于硬件方面我接触到了数字电路教材和模拟电路方面的知识,但由于没有嵌入式CPU很难亲自动手来实现嵌入式的相关理论;嵌入式入门则需要不断地实验与分析,我只在实验课时做几个与所给的程序相关的小程序来实现一下;而软件方面则学过C语言,里面通常的语法曾今熟悉过;我通过下列方法来适应C语言在嵌入式中应用:首先重新翻看了下C的教材,看了些常见的语法,接着在编译器的角度来看待C,编译原理我刚学过,其中将高级语言与低级语言的翻译感觉在嵌入式中用到了很多;最后冲硬件的角度来看待C。嵌入式的核心包括嵌入式操作系统,嵌入式软件开发平台及工具以及嵌入式应用软件。这些决定怎样才能开发一个好的嵌入式系统。下面谈谈我了解的嵌入式的相关知识与应用:

首先,嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应

用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式有如下几个突出的有点1.系统内核小,2专用性强,3系统精简4高实时性OS5嵌入式系统的应用程序可以没有操作系统直接在芯片上运行,6嵌入式系统需要开发工具和环境。

嵌入式系统是近几年才风靡起来的,但是这个概念并非新近才出现。从20世纪七十年代单片机(最早的单片机是Intel公司的 8048,出现在1976年)的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。经过30年的发展,嵌入式技术已经日趋成熟,在中国嵌入式机一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。

其次,嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。 嵌入式系统是软硬结合的学科,通常有两类人会去专研嵌入式:一类是学电子工程、通信工程等偏硬件专业的,另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。我是软件专业的学习嵌入式,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。嵌入式应用在很多方面,具体的可以分为工业控制,交通管理,信息家电,家庭智能管理系统,POS网络及电子商务,环境工程与自然,机器人,机电产品方面应用等方面。其中目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。例外还有很多地方用到了嵌入式系统,最近飞利浦和ARM共同推出32位RISC嵌入式控制器,适用于工业控制,采用最先进的0.18微米CMOS嵌入式闪存处理技术,操作电压可以低至1.2伏,它还能降低25%到30%的制造成本,在工业领域中对最终用户而言是一套极具成本效益的解决方案。

那么该如何学好嵌入式我觉得应该从以下几点入手:

首先C语言,这个是毋庸置疑的,不管是做嵌入式软件还是硬件开发的人员,对C语言的掌握这个是必需的,特别是对于以后致力于嵌入式软件开发的人,现在绝大部分都是用C语言,你说不掌握它可以吗?至于如何学习C语言,我想这些基础的知识每个人都有自己的方法,关键要去学习,看书也好,网上找些视频看也好。很多人会问,C语言要学到怎么样,我觉得这没有标准的答案。我想至少你在明白了一些基础的概念后,就该写代码了,动手才是最重要的,当你动手了,遇到问题了,再反过来学习,反过来查查课本,那时的收获就不是你死看书能得到的。

其次,应该对操作系统有所了解,这对你对硬件和软件的理解,绝对有很大的帮助。应该把系统的管理理解一下,比如进程、线程,系统如何来分配资源的,系统如何来管理硬件的,当然,不是看书就能把这些理解透,如果不是一时能理解,没关系,多看看,结合以后的项目经验,会有更好的理解的。

还有应该学习下linux或者wince下的编程,这些对以后做应用的编程很有帮助,当然,如果做手机的话,那可以学习MTK、塞班、Android等操作系统,Android是以后发展的趋势,现在很热门,Android也是基于linux系统封装的,所以建议先学习下linux。

还有,应该学习下单片机或者ARM或者MIPS,很多人说我没有单片机的经验,直接学ARM可以吗?我觉得那完全没有问题的,当然如果你学习过单片机,那最好不过了,以后学习ARM就更简单了。

最后如果你把以上的知识都有所了解后,就该去阅读阅读一些优秀的代码,比如结合arm芯片手册学习去学习下UBOOT的源代码,了解下最小的系统开发,那对你整个嵌入式开发的非常有帮助的,可以的话,还可以学习下linux的源代码,当然如果你直接阅读2.6的代码,我想你会很痛苦的,可以先看看linux 代码早期的版本,比如0.12 的代码等等,麻雀虽

小,五脏俱全,如果你全看完了,那我想你就是一名很成功的嵌入式工程师。

以上就是我在本学期学习嵌入式后的心得及感想。

第11篇:嵌入式课程设计 学生信息管理系统

嵌入式课程设计报告册

题目:学生信息管理系统

班级:移动三班

辅导老师:邱雅

一、软件需求分析

1、可行性分析

(1)经济可行性

①:目前中国有越来越多的中小型企业在蓬勃发展,而现代化员工信息管理系统已经逐渐取代了传统的人工信息管理,智能化的管理系统更具有高效性可行性,所以自能管理系统将会成为或正在成为现代化公司员工信息管理的有效方式;

②:这款学生信息管理系统的价格适合所有学校消费群体,将会有很大的应用空间,满足各种学校学生管理的要求;

③:学生系信息管理系统的价格比相对于同类公司员工管理系统产品较低,同时本软件的成本低于同类产品的平均水平,具有很大的利润空间;

④:本系统的开发环境和软件环境都是当前流行的产品,本系统的软件需求都是基本的功能和应用,在现实中很容易实现。

(2)法律可行性

本软件的开发采用C语言作为软件的开发语言,没有采用同类产的代码,完全是自主开发,并按照国际上软件开发的相关规定来实现开发的;

(3)技术可行性

本软件开发系统采用linux开发平台,具有很强的兼容性和扩展性,本软件的占用的内存较小大部分的硬件处理系统都可以兼容,开发语言采用国际通用的C高级编程语言具有很高的维护可行性,经过综合分析我认为现阶段我方所拥有的资源和技术人员,在技术上完全可以实现这款软件的开发,并且能高质量,快速的完成这项工作。

2、用户需求概述

用户需要一个可以简单的实现通讯录功能的简单通讯录系统,分别完成查询,增加,修改,删除的一些简单的功能要求在完成所要求功能的前提下增强与用户的互动,使软件的可操作性增强,此外还可以志愿加入一些新的功能来进行对软件的优化在优化的同时要注意软件基本功能的保障。

二、软件分析与设计

一.功能

1、创建班级

2、输出学生信息

3、按照学号录入学生成绩

4、按照班级录入学生成绩

5、按照学号修改学生成绩

6、按照班级修改学生成绩

7、按照班级统计学生的总成绩

8、按照学号查询学生成绩

9、按照班级输出不及格学生名单及科目

10、按照班级输出学生成绩单

0、退出系统

二.功能模块图:

学生信息管理系统按照创建班级输出学生信息按照学号录入学生成绩按照班级录入学生成绩按照学号修改学生成绩按照班级修改学生成绩按照班级统计学生的总成绩按照学号查询学生成绩班级输出不及格学生名单及科目按照班级输出学生成绩单按照班级输出学生成绩单

图1 系统功能模块图

三、主要功能的实现

程序设计一般由两部分组成 些数据结构具有同样的重要性 保存等外更多的情况是查询

1、学生信息管理

算法和数据结构,合理地选择和实现一个数据结构和处理这

,在学生信息管理程序中由于预计记录数比较大能够、删除、。所以选用动态链表保存数据。

由于信息输入量比较大,需要的存储空间大,所以需要采用树的双亲表示法进行信息存储,为了方便采用以下定义。 struct student { int num; char name[20]; char sex[5]; char cla[30]; int semester; char course[30]; int score[3]; struct student *next; };

struct list { int cla; struct student *head; }; 2.main()主函数

程序采用模块化设计,主函数是程序的入口各模块独立。可分块调

试均由主函数控制调用控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过 调用主菜单函数得到的返回值,根据该值 调用相应的各功能函数。同时设置一个断点。 即当返回值为一定条件时运行break 0;函数结束程序,以免造成死循环。根据菜单的提示进

行需要的操作。

图2 主函数输出界面

开始输入数据否选择是功能选择退出系统结束

图3 程序总体流程图 (1)主菜单

直接利用输出函数 printf 输出字符串在屏幕上显示一个菜单并显示一个提示输入 选项输

入数字,将此数字作为菜单函数的返回值返回主函数,主函数根据 这个数字调用相应的功

10-2 所示:

能函数, 制作简便, 操作简单界面如图

图 4

主菜单界面

由于程序中很多地方用到了字符串输入语句会造成下一个字符不能正确读入为了 在程序调

按照所见即所得的方式直接 用执行了各个函数后能够清晰地看到菜单 并输入新的选项。 设计输出函数输出字符串达到菜单效果将精力主要放在程序功能的实现上利用 while循环 语句一直执行 scanf("%d" ,t)语句。让用户输入 数按照整形数据形式输入然后字符串转化

为数字返回主函数 。既然是数字选项为什么不用整数格式输入而要按字符串输入。再将其 a 和 b 等 由于类转换呢,如果按照整数格式输入,当用户输入了非数字字 符。例如 表面上看是数字也应将其设为字符 型不同将导致程序出错。所以对于不参与运算的数据

处理。例如电话号码,千万不要设为整数类型,程序设计技巧很多。所以读者在编程调试中应注意并仔细体会。

(2)创建班级

输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰且能直接

反映数据之间的关系,但由于 scanf 函数的特性,在输入时数据用回车分隔也是可以的,但与 界面设计不吻合界面.由于记录并不是一次性全部输入而是随时填加和删除的,而预先开辟 n, 然后用的空间数往往大于实际的记录数。所以程序设计为首先输入准备输入的记录数

while循环语句循环输信息。

图5 创建列表页面 输出学生信息

该功能的实现主要是

是通过结构体数组中的链表指针进行输出

图6输出全部信息 按照学号录入学生成绩

通过头指针查找到需要录入成绩的节点,录入成绩。

按照班级录入学生成绩

按照学

按照班级修改学生成绩

按照班

按照学

按照班级输

目(11)按照班级输出学生成绩单

四、程序设计

(一)先进行人工检查,即静态检查。

在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。

为了更有效地进行人工检查,所编的程序应力求做到以下几点:

①应当采用结构化程序方法编程,以增加可读性;

②尽可能多加注释,以帮助理解每段程序的作用;

③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。

(二)在人工检查无误后,再上机调试。

通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。

如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。

(三)在改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。

有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程。事实上,当程序复杂时很难把所有的可能情况全部都试到,选择典型的临界数据作试验即可。

(四)运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法:

1.将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。

2.如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查。直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。

3.也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率。

4.如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题。如有则改正之,接着修改程序。

5.有的系统还提供debug(调试)工具,跟踪程序并给出相应信息,使用更为方便,请查阅有关手册。

总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于积累经验。在程序调试过程中往往反映出一个人的水平,经验和态度。希望大家给以足够的重视。上机调试程序的目的决不是为了“验证程序的正确”,而是“掌握调试的方法和技术”,要学会自己找问题,这样慢慢自己就会写出错误较少的实用程序。

五、代码的实现

#include #include

#define MAXSIZE 100

struct student { int num; char name[20]; char sex[5]; char cla[30]; int semester; char course[30]; int score[3]; struct student *next; };

struct list { int cla; struct student *head; };

void CreatClaStudent(struct list Cla[],int n)//创建班级 { char ch; int i; i = 1; struct student *head,*p,*q; head = (struct student *)malloc(sizeof(struct student)); q = p = head; while(i

printf("输入第%d个班级的信息:\n",i);

struct student *head,*p,*q;

head = (struct student *)malloc(sizeof(struct student));

Cla[i].head = p = head;

while(1)

{

printf("输入学号:\n");

scanf("%d",&head->num);

printf("输入姓名:\n");

scanf("%s",head->name);

head->score[0] = 0;

head->score[1] = 0;

head->score[2] = 0;

getchar();

printf("是否继续?\n");

scanf("%c",&ch);

if(ch == 'n')

break;

p = (struct student *)malloc(sizeof(struct student));

head->next = p;

head = p;

}

head ->next = NULL;

i++; } }

void print(struct list Cla[],int n)//输出学生信息

按照班级输出 {

struct student *p; int i=1;

while(i

p = Cla[i].head;

printf("移动%d班学生信息\n",i);

while(p != NULL)

{

printf("%d\t",p->num);

printf("%s\t",p->name);

printf("%d\t%d\t%d",p->score[0],p->score[1],p->score[2]);

p = p->next;

printf("\n");

}

printf("\n");

i++; } }

void StudentId(struct list Cla[],int n)//按照学号输入成绩

{ int score1,score2,score3; int t; int key; printf("输入学号:");

scanf("%d",&key);

int i; i = 1; struct student *p;

while(i

p = Cla[i].head;

while(p != NULL)

{

if(p->num == key)

{

printf("输入3门成绩:");

scanf("%d%d%d",&score1,&score2,&score3);

p->score[0] = score1;

p->score[1] = score2;

p->score[2] = score3;

t = 0;

}

p = p->next;

}

i++; } if(t != 0)

printf("该学号不存在!\n"); }

void ClaId(struct list Cla[],int n) { int i = 1; struct student *p; while(i

printf("录入%d班级的成绩\n",i);

p = Cla[i].head;

while(p != NULL)

{

printf("输入学号为%d的学生成绩:",p->num);

scanf("%d%d%d",&p->score[0],&p->score[1],&p->score[2]);

p = p->next;

}

printf("成绩录入结束\n");

i++; } }

void StudentNumberChange(struct list Cla[],int n) { int i = 1; int key; int score1,score2,score3; int t;

printf("请输入学号:"); scanf("%d",&key); struct student *p; while(i

p = Cla[i].head;

while(p != NULL)

{

if(p->num == key)

{

printf("请输入新的成绩:");

scanf("%d%d%d",&score1,&score2,&score3);

p->score[0] = score1;

p->score[1] = score2;

p->score[2] = score3;

t = 0;

}

p = p->next;

}

i++; } if(t != 0) {

printf("该学号不存在!\n"); } }

void ClaNumChange(struct list Cla[],int n)

{

int cla; int score1,score2,score3; char ch; struct student *p; printf("输入需要修改信息的班级号%d----%d:",1,n); scanf("%d",&cla);

p = Cla[cla].head;

while(p != NULL)

{

printf("是否要修改%d的成绩:",p->num);

getchar();

scanf("%c",&ch);

if(ch == 'n')

{

p = p->next;

continue;

}

printf("输入新的成绩:");

scanf("%d%d%d",&score1,&score2,&score3);

p->score[0] = score1;

p->score[1] = score2;

p->score[2] = score3;

p = p->next;

} }

void TotalGrade(struct list Cla[],int n) { int sum = 0; int average; int k; int cla; printf("输入班级号%d------%d\n",1,n); scanf("%d",&cla); struct student *p; p = Cla[cla].head; while(p != NULL) {

sum = p->score[0] + p->score[1] + p->score[2];

average = sum / 3;

printf("%d的总成绩是%d平均成绩是%d\n",p->num,sum,average);

p = p->next;

} }

void QueryResults(struct list Cla[],int n) { int i = 1; int key; int t; struct student *p; printf("请输入学号:"); scanf("%d",&key); while(i

p = Cla[i].head;

while(p != NULL)

{

if(p->num == key)

{

printf("学号为%d的学生[移动%d班]",p->num,i);

printf("%d\t%d\t%d\n",p->score[0],p->score[1],p->score[2]);

t = 0;

break;

}

p = p->next;

}

if(t != 0)

{

printf("该学生不存在于%d班\n",i);

}

i++; } }

void NotPa(struct list Cla[],int n) { int cla;

printf("请输入班级号%d---%d:",1,n); scanf("%d",&cla); struct student *p; p = Cla[cla].head; printf("%d班不及格名单\n",cla); while(p != NULL) {

if(p->score[0] score[1] score[2]

{

printf("%d\t%s\t",p->num,p->name);

if(p->score[0]

printf("语文\t%d\t不及格\t",p->score[0]);

if(p->score[1]

printf("线性代数\t%d\t不及格\t",p->score[1]);

if(p->score[2]

printf("英语\t%d\t不及格\t",p->score[2]);

printf("\n");

}

p = p->next; } }

void Transcript(struct list Cla[],int n) { int cla; printf("请输入班级号:"); scanf("%d",&cla); struct student *p; p = Cla[cla].head; while(p != NULL) {

printf("%d\t%s\t%d\t%d\t%d\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);

p = p->next; } }

void menu() { printf(" 0、退出系统\n"); printf("

1、创建班级\n"); printf("

2、输出学生信息\n"); printf("

3、按照学号录入学生成绩\n"); printf("

4、按照班级录入学生成绩\n"); printf("

5、按照学号修改学生成绩\n"); printf("

6、按照班级修改学生成绩\n"); printf("

7、按照班级统计学生的总成绩\n"); printf("

8、按照学号查询学生成绩\n"); printf("

9、按照班级输出不及格学生名单及科目\n"); printf("

10、按照班级输出学生成绩单\n"); }

int main() { int n; int i; int operation;

struct list Cla[MAXSIZE]; Cla[0].head = NULL; Cla[0].cla = -1;

printf("输入班级数量:\n"); scanf("%d",&n); while(1) {

menu();

printf("请选择操作:");

scanf("%d",&operation);

switch(operation)

{

case 1:CreatClaStudent(Cla,n);

break;

case 2:print(Cla,n);

break;

case 3:StudentId(Cla,n);

break;

case 4:ClaId(Cla,n);

break;

case 5:StudentNumberChange(Cla,n);

break;

case 6:ClaNumChange(Cla,n);

break;

case 7:TotalGrade(Cla,n);

break;

case 8: QueryResults(Cla,n);

break;

case 9:NotPa(Cla,n);

break;

case 10:Transcript(Cla,n);

break;

case 0:exit(-1);

} }

return 0;

}

六、参考文献

1、《嵌入式linux上的C语言编程实践》

北京亚嵌教育研究中心、韩超

电子工业出版社

2、《linux 下C语言应用编程》

杨铸

北京航空航天大学出版社

3、《linux 高级程序设计》

杨宗德

邓玉春

人民邮电出版社

七、开发环境

开发环境linux操作系统

GNU Compiler Collection程序生成工具软件

第12篇:嵌入式系统基础课程设计报告

河南机电高等专科学校

《嵌入式系统基础》 课程设计报告

设计题目: 系 部: 电子通信工程系 班 级: 学 号: 学生姓名: 成 绩:

2012年 05月

《嵌入式系统基础》课程设计任务书 1.时间:2012年05月14日~2011年05月25日 2.课程设计单位:河南机电高等专科学校

3.课程设计目的:掌握《嵌入式系统基础》课程基本概念、基本原理,具有一定的单片机设计能力,能够利用所学知识完成设计内容,提高实际动手能力。4.课程设计任务:

①参考相关的的书籍、资料,根据设计要求完成原理图设计; ②制作电路板并完成调试; ③绘制软件流程图; ④完成软件设计并完成调试;

⑤作好笔记,对自己所发现的疑难问题及时请教解决; ⑥联系自己所学知识,总结本次设计经验; ⑦认真完成课程设计报告。

5.设计要求

根据所给具体的设计要求来写!

2

《嵌入式系统基础》课程设计报告

前言:

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

一、硬件设计

1.设计思路及原理框图

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

………………

××××××××××××××××××××××××××××××× 2.采用的芯片功能介绍

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

………………

××××××××××××××××××××××××××××××× 3.原理图

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

………………

×××××××××××××××××××××××××××××××

二、软件设计

1.设计思路

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

………………

××××××××××××××××××××××××××××××× 2.程序流程图(必须要有)

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

3 ………………

××××××××××××××××××××××××××××××× 3.具体程序(可选,但流程图一定要有)

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

………………

×××××××××××××××××××××××××××××××

心得体会: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

………………

×××××××××××××××××××××××××××××××

参考文献:

[1] 付家才 电子实验与实践.北京:高等教育出版社130-150页

[2] 李东生、张勇、许四毛 《Protel 99SE电路设计技术入门与应用》电子工业出版社231-300页

………………

格式要求:

标题按照所给模板格式书写。

正文字体为:中文宋体,西文(字母和数字):Times New Roman,小四号字; 段落:两端对齐,首行缩进2字符,行距固定值20磅,其他设置为默认。

―――-红色文字为说明,写报告时请先删除!!!

第13篇:嵌入式操作系统程课程设计报告

目录

一、实习任务和目的„„„„„„„„„„„„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文件,在挂载根文件系统时用到,再把本机上的pawd,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 *)&pre_cnt[i]); 注册备:register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &s3c24xx_buttons_fops); 中断函数:

static irqreturn_t buttons_interrupt(int irq, void *dev_id) {

volatile int *pre_cnt = (volatile int *)dev_id;

*pre_cnt = *pre_cnt + 1; /*

ev_pre = 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

第14篇:嵌入式电子闹钟时钟课程设计

#include //头文件 #include #define uchar unsigned char //宏定义 #define uint unsigned int //位定义

sbit rs=P2^5; //液晶位定义 sbit lcden=P2^7; sbit s1=P2^0; //时间功能切换按键 sbit s2=P2^1; //按键加 sbit s3=P2^3; //按键减

sbit s4=P2^4; //闹钟功能切换键 sbit rst=P1^5; //ds1302引脚定义 sbit io=P1^6; sbit sclk=P1^7; sbit beep=P3^0; //蜂鸣器

uchar num,count,shi,fen,miao,s1num,s2num, year,month,day,week,flag,flag1,year1,month1, day1,week1,shi1,fen1,miao1,year2,month2, day2,week2,shi2,fen2,miao2,year5,month5, day5,week5,shi5,fen5,miao5,wk,ashi,afen; //参数定义

uchar code table[]=\"20 - - \"; //液晶固定显示 uchar code table1[]=\" : : 00:00\"; /* uchar time_dat[7]={12,1,6,6,12,59,59}; //年周月日时分秒 uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; */ void write_com(uchar com); //液晶写指令函数 void write_data(uchar date); //液晶写数据函数

void write_ds1302(uchar add,uchar dat); //ds1302芯片写指令函数 void set_rtc(); //ds1302时间设置函数 void time_pros(); //ds1302进制转换函数 void read_rtc(); //ds1302读时间函数 void alarm(); //闹钟函数

void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void init() //初始化 { lcden=0; flag=0; flag1=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); //液晶固定显示,第一行 for(num=0;num

write_com(0x80+0x40); //液晶显示第二行 for(num=0;num

void write_com(uchar com)//1602液晶写指令 { rs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }

void write_data(uchar date)//1602液晶写写数据 { rs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; }

void write_sfm(uchar add,uchar date)//时分秒 { uchar shi3,ge; shi3=date/10; ge=date%10; write_com(0x80+0x40+add); write_data(0x30+shi3); write_data(0x30+ge); }

void write_nyr(uchar ad,uchar date)//年月日 { uchar shi4,ge2; shi4=date/10; ge2=date%10; write_com(0x80+ad); write_data(0x30+shi4); write_data(0x30+ge2); }

void write_week(uchar wk) //星期按西方星期设置{ write_com(0x80+11); switch(wk) { case 1: write_data(\'S\'); delay(5); write_data(\'U\'); delay(5); write_data(\'N\'); break;

case 2: write_data(\'M\'); delay(5); write_data(\'O\'); delay(5); write_data(\'N\'); break;

case 3: write_data(\'T\');

星期天为第一天 delay(5); write_data(\'U\'); delay(5); write_data(\'E\'); break;

case 4: write_data(\'W\'); delay(5); write_data(\'E\'); delay(5); write_data(\'D\'); break;

case 5: write_data(\'T\'); delay(5); write_data(\'H\'); delay(5); write_data(\'U\'); break;

case 6: write_data(\'F\'); delay(5); write_data(\'R\'); delay(5); write_data(\'T\'); break;

case 7: write_data(\'S\'); delay(5); write_data(\'A\'); delay(5); write_data(\'T\'); break;

} }

void keyscan() //{ if(s1==0) { delay(5);

按键函数 if(s1==0) { write_com(0x0f); s1num++; //记录按键次数 flag=1; flag1=1; while(!s1);

switch(s1num)//光标闪烁点定位 { case 1:write_com(0x80+0x40+6); //秒 break;

case 2:write_com(0x80+0x40+3); //分 break;

case 3:write_com(0x80+0x40+0); //时 break;

case 4:write_com(0x80+11); //星期 break; case 5:write_com(0x80+8); //日 break;

case 6:write_com(0x80+5); //月 break;

case 7:write_com(0x80+2); //年 break;

case 8:s1num=0; write_com(0x0c);//设置开显示光标不显示 关闭时间设置

set_rtc(); flag=0; break; }

} }

if(s1num!=0) //按键加减 { if(s2==0) //加按键函数 { delay(10); if(s2==0) {

while(!s2); switch(s1num) //根据功能键相应次数做出调节 { case 1: miao++; //秒加 if(miao==60) miao=0; write_sfm(6,miao); write_com(0x80+0x40+6); break;

case 2: fen++; // if(fen==60) fen=0; write_sfm(3,fen); write_com(0x80+0x40+3); break;

case 3: shi++; // if(shi==24) shi=0; write_sfm(0,shi); write_com(0x80+0x40+0); break;

case 4: week++; // if(week==8) week=1; write_week(week); write_com(0x80+11); break;

case 5: day++; // if(day==32) day=1; write_nyr(8,day); write_com(0x80+8); break;

case 6: month++; //分加 时加 星期加日加 月加

if(month==13) month=1; write_nyr(5,month); write_com(0x80+5); break;

case 7: year++; //年加 if(year==100) year=0; write_nyr(2,year); write_com(0x80+2); break;

}

}

}

if(s3==0) //减按键函数同上 { delay(10); if(s3==0) { while(!s3); switch(s1num) //根据功能键相应次数做出调节 { case 1: miao--; if(miao==-1) miao=59; write_sfm(6,miao); write_com(0x80+0x40+6); break;

case 2: fen--; if(fen==-1) fen=59; write_sfm(3,fen); write_com(0x80+0x40+3); break;

case 3: shi--; if(shi==-1) shi=23; write_sfm(0,shi); write_com(0x80+0x40+0); break;

case 4: week--; if(week==-1) week=7; write_week(week); write_com(0x80+11); break;

case 5: day--; if(day==-1) day=31; write_nyr(8,day); write_com(0x80+8); break;

case 6: month--; if(month==-1) month=12; write_nyr(5,month); write_com(0x80+5); break;

case 7: year--; if(year==-1) year=99; write_nyr(2,year); write_com(0x80+2); break;

}

} }

}

if(s4==0) // { delay(5);

闹钟按键 if(s4==0) { write_com(0x0f); //光标闪烁 s2num++; //记录按键次数 flag=1; while(!s4); switch(s2num)//光标闪烁点定位 { case 1:write_com(0x80+0x40+13); //分 break;

case 2:write_com(0x80+0x40+10); //时 break;

case 3:write_com(0x0c); //关闭闹钟设置 flag=0; s2num=0; break;

}

} }

if(s2num!=0) //闹钟设置 { if(s2==0) //闹钟加 { delay(10); if(s2==0) { while(!s2); switch(s2num) //根据功能键相应次数做出调节 { case 1: afen++; if(afen==60) afen=0; write_sfm(13,afen); write_com(0x80+0x40+13); break;

case 2: ashi++; if(ashi==24) ashi=0; write_sfm(10,ashi); write_com(0x80+0x40+10); break;

} } }

if(s3==0) //闹钟减 { delay(10); if(s3==0) { while(!s3); switch(s2num) //根据功能键相应次数做出调节 { case 1: afen--; if(afen==-1) afen=59; write_sfm(13,afen); write_com(0x80+0x40+13); break;

case 2: ashi--; if(ashi==-1) ashi=23; write_sfm(10,ashi); write_com(0x80+0x40+10); break;

} } }

} }

void wirte_ds1302_byte(uchar dat) //ds1302字节写 { uchar i; for(i=0;i>1; sclk=1; } }

void write_ds1302(uchar add,uchar dat) //ds1302写函数 { rst=0; _nop_();// 空操作 sclk=0; _nop_(); rst=1; _nop_(); wirte_ds1302_byte(add); wirte_ds1302_byte(dat); rst=0; io=1; sclk=1; }

uchar read_ds1302(uchar add) //ds1302{ uchar i,value; rst=0; _nop_();// 空操作 sclk=0; _nop_(); rst=1; _nop_(); wirte_ds1302_byte(add); for(i=0;i>1; sclk=0; if(io) { value=value|0x80; } sclk=1; } rst=0; _nop_();// 空操作 sclk=0; _nop_();

读函数 sclk=1; io=1; return value; }

void set_rtc() //ds1302时间设置 { write_ds1302(0x8e,0x00); //关写保护

year1=year/10; //转换为十六进制 year=year%10; year=year+year1*16; write_ds1302(0x8c,year);

week1=week/10; week=week%10; week=week+week1*16; write_ds1302(0x8a,week);

month1=month/10; month=month%10; month=month+month1*16; write_ds1302(0x88,month);

day1=day/10; day=day%10; day=day+day1*16; write_ds1302(0x86,day);

shi1=shi/10; shi=shi%10; shi=shi+shi1*16; write_ds1302(0x84,shi);

fen1=fen/10; fen=fen%10; fen=fen+fen1*16; write_ds1302(0x82,fen);

miao1=miao/10; miao=miao%10; miao=miao+miao1*16; write_ds1302(0x80,miao);

write_ds1302(0x8e,0x80); //开写保护 flag1=0; }

void read_rtc() //从ds1302中读时间 { year2=read_ds1302(0x8d); week2=read_ds1302(0x8b); month2=read_ds1302(0x89); day2=read_ds1302(0x87); shi2=read_ds1302(0x85); fen2=read_ds1302(0x83); miao2=read_ds1302(0x81); }

void time_pros() //进制 {

year5=year2/16; year2=year2%16; year2=year2+year5*10;

month5=month2/16; month2=month2%16; month2=month2+month5*10;

day5=day2/16; day2=day2%16; day2=day2+day5*10;

shi5=shi2/16; shi2=shi2%16; shi2=shi2+shi5*10;

fen5=fen2/16; fen2=fen2%16; fen2=fen2+fen5*10;

miao5=miao2/16; miao2=miao2%16; miao2=miao2+miao5*10;

从ds1302中读出的时间转换为十

}

void display() //显示函数 { write_sfm(6,miao2); write_com(0x80+0x40+6);

write_sfm(3,fen2); write_com(0x80+0x40+3);

write_sfm(0,shi2); write_com(0x80+0x40+0);

write_week(week2); write_com(0x80+11);

write_nyr(8,day2); write_com(0x80+8);

write_nyr(5,month2); write_com(0x80+5);

write_nyr(2,year2); write_com(0x80+2);

if((ashi==shi2)&&(afen==fen2)) { alarm(); } }

void alarm() // 闹钟 { beep=0; delay(1000); beep=1; } void main() //主函数 { init(); //初始化 while(1) { keyscan(); //按键函数

if(flag==0) { keyscan(); read_rtc(); time_pros(); display(); }

} }

第15篇:嵌入式课程设计之触摸屏程序设计

嵌入式课程设计

设计题目:触摸屏驱动程序设计 班级: 学号: 姓名: 指导老师:

设计时间:2010年12月25日--12月28日

目录

第一部分 要求 ................................................................................................................................1 1.1设计目的 .................................................................................................................................1 1.2 设计意义 ................................................................................................................................1 1.3 设计内容 ................................................................................................................................1 1.4 主要任务 ................................................................................................................................1 第二部分 正文 ................................................................................................................................2 2.1触摸屏工作原理(触摸屏接口工作模式) .........................................................................2 2.2、设计总体方案 ......................................................................................................................3 2.

3、设计所需工具 ......................................................................................................................6 2.4、平台构建过程 ......................................................................................................................6 2.4.

1、硬件平台搭建 ...............................................................................................................6 2.4.2根文件系统的制作 ..........................................................................................................8 (1)根文件系统 .....................................................................................................................8 第三章 程序 ..................................................................................................................................13 3.1.程序流程图: .......................................................................................................................13 3.2.分析驱动 ...............................................................................................................................13 3.2.1、触摸屏设备驱动中数据结构 .....................................................................................13 3.2.

2、触摸屏驱动模块加载和卸载函数 .............................................................................15 3.2.3、触摸屏设备驱动的读函数 .........................................................................................17 3.2.

4、触摸屏设备驱动的轮询与异步通知 .........................................................................17 3.2.5源程序触摸屏驱动代码: ............................................................................................18 3.2.6、实验结果显示: .........................................................................................................29 第四部分 心得 ..............................................................................................................................30 4.1 课程设计心得体会: ..........................................................................................................30 第五部分 参考文献 ......................................................................................................................32 5.1【参考文献】 ........................................................................................................................32

第一部分 要求

1.1 设计目的

1.基于Linux操作系统,以及Emest III实验箱,利用触摸屏返回触点坐标值及动作信息。

2.坐标及动作的具体显示:触摸笔动作,触点X坐标值,触点Y坐标值。

1.2 设计意义

1.熟悉嵌入式系统开发平台

2.掌握ARM嵌入式Linux操作系统下的各个指令的使用方法 3.了解触摸屏的原理

1.3 设计内容

1.Linux系统的正确移植和使用 2.根文件系统的正确移植和使用 3.驱动程序的编译与装载

4.嵌入式系统下应用程序的交叉编译及下载与调试

1.4 主要任务

1.熟悉实验的流程

2.vivi,linux内核的烧写

3.cramfs文件系统(烧写前需编译)的烧写 4.理解驱动程序源代码

5.调用驱动程序的某些函数,编译与调试应用程序

第二部分 正文

2.1触摸屏工作原理(触摸屏接口工作模式)

(1)普通转换模式

普通转换模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC转换。这个模式可以通过设置ADCCON和ADCTSC来进行对AD转换的初始化;而后读取ADCDAT0(ADC数据寄存器0)的XPDATA域(普通ADC转换)的值来完成转换。 (2)分离的X/Y轴坐标转换模式:X轴坐标转换和Y轴坐标转换。

X轴坐标转换(AUTO_PST=0且XY_PST=1)将X轴坐标转换数值写入到ADCDAT0寄存器的XPDATA域。转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。

Y轴坐标转换(AUTO_PST=0且XY_PST=2)将X轴坐标转换数值写入到ADCDAT1寄存器的YPDATA域。转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。

(3)自动(连续)X/Y轴坐标转换模式。

自动(连续)X/Y轴坐标转换模式(AUTO_PST=1且XY_PST= 0)以下面的步骤工作:

触摸屏控制器将自动地切换X轴坐标和Y轴坐标并读取两个坐标轴方向上的坐标。触摸屏控制器自动将测量得到的X轴数据写入到ADCDAT0寄存器的XPDATA域,然后将测量到的Y轴数据到ADCDAT1的YPDATA域。自动(连续)转换之后,触摸屏控制器产生中断源(INT_ADC)到中断控制器。 (4)等待中断模式

当触摸屏控制器处于等待中断模式下时,它实际上是在等待触摸笔的点击。在触摸笔点击到触摸屏上时,控制器产生中断信号(INC_TC)。中断产生 2

后,就可以通过设置适当的转换模式(分离的X/Y轴坐标转换模式或自动X/Y轴坐标转换模式)来读取X和Y的位置。 (5)静态(Standby)模式

当ADCCON寄存器的STDBM位被设为1时,Standby模式被激活。在该模式下,A/D转换操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持着先前转换所得的值。

2.2、设计总体方案

1、软件

(1)Embest Online Flash Programmer For ARM: Embest Flash在线编程器 (2)HYPER TERMINAL(超级终端):传送vivi.nand;

传送vivi.nand

vivi>load flash kernel x 烧写更新内核,传送zImage文件; 等待传送内核文件

传送内核:

vivi>load flash root j 烧写更新文件系统; 烧写新的文件系统 load flash root j

(3) EmbestIDE Pro for ARM: 应用于嵌入式软件开发的新一代集成开发环境,是一个高度集成的图形界面操作环境,包含编辑器、编译汇编链接器、调试器、工程管理、Flash 编程等工具;支持的开发语言包括标准C和汇编语言。 (4)cygwin: 一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌 5

入式系统开发,把gcc,gdb,gas等开发工具进行了改进,能够生成并解释win32的目标文件。

2、硬件

S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer ,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。

2.3、设计所需工具

1.软件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超级终端),EmbestIDE Pro for ARM,cygwin 1.硬件:s3c2410开发板,Embest实验箱

2.4、平台构建过程

2.4.1、硬件平台搭建

硬件流程图:

(1) Vivi烧写过程

1)首先把SW104断开,Flash Programmer的Program,在File选择Open打开要烧写的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program页中选择要烧写的文件vivi.bon&load.bin。点击按钮 Progarm 开始烧写,直到烧写成功

2) 连接串口线到 PC 机 COM1,运行光盘中提供的 Windows 超级终端Hyper Terminal.ht 把开发板重新加电,程序运行后,在超级终端上可以看到串口输出Wating,表示正在等待用户从超级终端下载文件。这时,请点击超级终端菜单\"传送\"选择 Xmodem 方式下载 vivi.nand 文件,点击 OK 后等待下载烧写结束即可。 (2) 内核zImage烧写

1) 首先SW104设为短接(从Nand Flash启动),并确定已经烧写vivi.nand,加电。

2 ) 在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令:vivi>load flash kernel x 烧写更新内核约1分钟即可烧写完毕 3 ) 点击超级终端菜单中的“传送”,选“发送文件”zImage” 并选择xModem方式传送)烧写结束,重起实验板,观测超级终端窗口提示信息就可以启动linux内核, (3) 新文件系统的烧写

1)首先SW104设为短接(从Nand Flash启动),确定已经成功烧写vivi.nand,加电运行可以看到vivi启动信息,输入空格进入命令状态;

2)双击运行Download.pjf(该文件在/tmp/edukit-2410/image/中)工程(将启动Embest IDE环境),点击连接Remote connect,程序应该正在运行(命令按钮STOP为红色);在串口输入help,看看有没有反应,如果没反应,点击IDE 按钮:Reset ->Start(F5);再输入help测试,直到有反应为止;

3)如果可以输出一些信息,再点击IDE中的Stop,配置Debug的Download地址为0x30000000,并点击IDE菜单Project选择Settings项,在Download页下拉Category到Download项,在Download File选择root.cramfs文件,点击确定后:

点击IDE菜单DEBUG选择Download下载文件系统映象约1分钟

下载完毕后,点击Start(F5) 然后在超级终端里输入: load flash root j (烧写更新文件系统)约1分钟即可烧写完毕

注意:只能在“vivi的烧写”操作完成后,才可以按以上方法正确烧写root映象到Nand Flash。

重起实验板,观测超级终端窗口提示信息,引导整个系统启动到linux行命令输入状态。

2.4.2根文件系统的制作 (1)根文件系统

根文件系统是Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为储存数据读写结果的区域。在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载。Linux系统中使用“/”来唯一表示根文件系统的安装路径。嵌入式系统中通常可以悬着的根文件系统有:Romfs、CRAMFS、RAMFS、JFFS

2、EXT2等,甚至还可以使用NFS作为根文件系统。

(2)cramfs文件系统

Cramfs是Linux创始人Linux torvalds开发的一个适用于嵌入式系统的小文件系统。Cramfs是一个只读文件系统,采用zlib压缩,压缩比一般可以达到1:2,但仍可以做到高效的随机读取。Linux系统中,通常把需要修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为cramfs不会影响系统读取文件的速度,而且是一个高度压缩的文件系统,因此非常广泛应用于嵌入式系统中。

(3)cygwin简介

Cygwin是一个在windows平台上运行的unix/Linux模拟环境,是cygnus solutions公司开发的自由软件。Cygwin中,“/”表示根目录,即cygwin的安 8

装目录。我们常用的set_env_linux.sh中定义的目录有:

SOURCEDIR:/tmp/edukit-2410存储了vivi、linux、fs等源代码和例程 WORKDIR:/usr/local/src/edukit-2410工作区。

一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具 mkcramfs(cygwin下为 mkcramfs.exe),把相应的 cramfs 目录树压缩为单一的映象文件。其命令格式为:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我们提供的 mkcramfs.exe 在 cygwin 下编译生成文件系统映象文件 root.cramfs,再固化到开发系统 FLASH 上运行。

(4)常用的Linux行命令

1)、cd 改变当前目录(文件夹)。例如下, cd/ 返回到根目录 cd..退回到上级目录

cd/tmp/edukit-2410/进入/tmp/edukit-2410/文件夹 2)、ls 列出当前目录中的内容。 Ls 简单格式列表 ls–l 使用详细格式列表。 3)、pwd 显示当前所在的目录。

(5)tar工具命令

tar 程序用于储存或展开 tar 存档文件。 命令格式:

tar [-参数] [文件名][路径] -x :extract | --get 从存档展开文件 -v :--verbose 详细显示处理的文件 -j :--有 bz2 属性的必须包含

-f :--file [HOSTNAME:]F 指定存档或设备(缺省为 /dev/rmt0)

(6)解压原文件系统(命令+解压目录的存放)

1)先将 root.cramfs.tar.bz2文件放在C:\\cygwin目录中

2)解压文件系统

运行cygwin,执行以下命令解压安装:

$>source /tmp/edukit-2410/set_env_linux.sh Linux编译环境变量设置 $>cd /

$>tar -xvjf root.cramfs.tar.bz2 $>ls „ root „

root文件夹中就是我们想要的cramfs文件系统 3) 如果在根目录中产生root文件夹,解压成功 4)在root目录中新建xx文件夹,用于存放应用程序

进入该目录后执行以下命令编译链接测试程序: $>cd root $>mkdir xx

(7)编译应用程序 ts.c (命令+生成文件格式+存放位置): 将编写好的ts.c程序放在C:\\cygwin目录中 进入该目录后执行以下命令编译链接测试程序: $>cd / $>arm-linux-gcc -o ts ts.c (也可以编写Makefile来编译)

生成文件: ts 如下图所示

将ts文件放入root 下的xx文件夹中

(8) 新文件系统的制作: 把刚才编译输出的ts文件拷贝到文件系统所在的工作目录root目录下,执行以下命令生成新的文件系统映象: $>cd /

$>mkcramfs root root.new

刚刚编译生成的文件系统映象 root.new 中已经包含测试程序即生成文件。 解压文件系统

解压成功如下

在root目录中新建xx文件夹,用于存放应用程序

将编写好的ts.c程序放在C:\\cygwin目录中

生成文件: ts 如下图所示

新文件系统的制作

生成文件:

第三章 程序

3.1.程序流程图:

3.2.分析驱动

触摸屏驱动在/kernel/drivers/char/s3c2410-ts.c 文件中。

3.2.1、触摸屏设备驱动中数据结构

(1)触摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,

release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//异步通知

#endif poll: s3c2410_ts_poll,//轮询 }; (2)触摸屏设备结构体的成员与按键设备结构体的成员类似,也包含一个缓冲区,同时包括自旋锁、等待队列和fasync_struct指针 typedef struct { unsigned int penStatus; /* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF]; /* protect against overrun(环形缓冲区) */ unsigned int head, tail;/* head and tail for queued events (环形缓冲区的头尾)*/ wait_queue_head_t wq; //* 等待队列数据结构 spinlock_t lock; //* 自旋锁

#ifdef USE_ASYNC struct fasync_struct *aq; #endif #ifdef CONFIG_PM struct pm_dev *pm_dev; //友善之臂专有的,我后面的代码删除了这段 #endif } TS_DEV;

(3)触摸屏结构体中包含的TS_RET值的类型定义,包含X、Y坐标和状态(PEN_DOWN、PEN_UP)等信息,这个信息会在用户读取触摸信息时复制到用户空 间

typedef struct { 14

unsigned short preure; //* 压力,这里可定义为笔按下,笔抬起,笔拖曳

unsigned short x; //* 横坐标的采样值 unsigned short y; //* 纵坐标的采样值 unsigned short pad; //* 填充位 } TS_RET;

(4)在触摸屏设备驱动中,将实现open()、release()、read()、fasync()和poll()函数,因此,其文件操作结构体定义

触摸屏驱动文件操作结构体:static struct file_operations s3c2410_fops={} 3.2.2、触摸屏驱动模块加载和卸载函数

(1)在触摸屏设备驱动的模块加载函数中,要完成申请设备号、添加cdev、申请中断、设置触摸屏控制引脚(YPON、YMON、XPON、XMON)等多项工作 触摸屏设备驱动的模块加载函数

static int __init s3c2410_ts_init(void) 触摸屏设备驱动模块卸载函数

static void __exit s3c2410_ts_exit(void) (2)可知触摸屏驱动中会产生两类中断,一类是触点中断(INT-TC),一类是X/Y位置转换中断(INT-ADC)。在前一类中断发生后,若之前处于PEN_UP状态,则应该启动X/Y位置转换。另外,将抬起中断也放在INT-TC处理程序中,它会调用tsEvent()完成等待队列和信号的释放 触摸屏设备驱动的触点/抬起中断处理程序

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

当X/Y位置转换中断发生后,应读取X、Y的坐标值,填入缓冲区 触摸屏设备驱动X/Y位置转换中断处理程序

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg) 触摸屏设备驱动中获得X、Y坐标

static inline void s3c2410_get_XY(void) (3)tsEvent最终为tsEvent_raw(),这个函数很关键,当处于PEN_DOWN状态时调用该函数,它会完成缓冲区的填充、等待队列的唤醒以及异步通知信号的释放;否则(处于PEN_UP状态),将缓冲区头清0,也唤醒等待队列并释放信号

触摸屏设备驱动的tsEvent_raw()函数 static void tsEvent_raw(void) (4)在包含了对拖动轨迹支持的情况下,定时器会被启用,周期为10ms,在每次定时器处理函数被引发时,调用start_ts_adc()开始X/Y位置转换过程

触摸屏设备驱动的定时器处理函数

static void ts_timer_handler(unsigned long data) (5)在触摸屏设备驱动的打开函数中,应初始化缓冲区、penStatus和定期器、等待队列及tsEvent时间处理函数指针 触摸屏设备驱动的打开函数

static int s3c2410_ts_open(struct inode *inode, struct file *filp) 16

(6)触摸屏设备驱动的释放函数非常简单,删除为用于拖动轨迹所使用的定时器即可

触摸屏设备驱动的释放函数

static int s3c2410_ts_release(struct inode *inode, struct file *filp) 3.2.3、触摸屏设备驱动的读函数

触摸屏设备驱动的读函数实现缓冲区中信息向用户空间的复制,当缓冲区有内容时,直接复制;否则,如果用户阻塞访问触摸屏,则进程在等待队列上睡眠,否则,立即返回-EAGAIN 触摸屏设备驱动的读函数

static ize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) 3.2.4、触摸屏设备驱动的轮询与异步通知

在触摸屏设备驱动中,通过s3c2410_ts_poll()函数实现了轮询接口,这个函数的实现非常简单。它将等待队列添加到poll_table,当缓冲区有数据时,返回资源可读取标志,否则返回0 触摸屏设备驱动的poll()函数

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait) 而为了实现触摸屏设备驱动对应用程序的异步通知,设备驱动中要实现s3c2410_ts_fasync()函数 触摸屏设备驱动的fasync()函数

static int s3c2410_ts_fasync(int fd, struct file *filp, int mode) 3.2.5源程序触摸屏驱动代码:

/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License.See the file COPYING in the main directory of this archive * for more details. * * History: * * 2002-05-27: Janghoon Lyu *PM 内靛啊 甸绢啊 乐变 窍瘤父 抛胶飘 登瘤 臼疽澜. * */

#include #include #include #include

#include #include #include #include #include #include #include

#include

#ifdef CONFIG_PM #include #endif

/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK( x...) printk(\"s3c2410-ts: \" ##x) #else #define DPRINTK( x...) #endif

#define PEN_UP 0

#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1 #define DEVICE_NAME \"s3c2410-ts\" #define TSRAW_MINOR 1

typedef struct { unsigned int penStatus; /* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF]; /* protect against overrun */ unsigned int head, tail; /* head and tail for queued events */ wait_queue_head_t wq; spinlock_t lock; #ifdef USE_ASYNC struct fasync_struct *aq; #endif #ifdef CONFIG_PM struct pm_dev *pm_dev; #endif } TS_DEV;

static TS_DEV tsdev;

#define BUF_HEAD (tsdev.buf[tsdev.head]) #define BUF_TAIL (tsdev.buf[tsdev.tail]) #define INCBUF(x,mod) ((++(x)) & ((mod) - 1))

static int tsMajor = 0;

static void (*tsEvent)(void);

#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY (HZ/100) /* 10 ms */ static struct timer_list ts_timer; #endif

#define wait_down_int() { ADCTSC = DOWN_INT | XP_PULL_UP_EN | \\

XP_AIN | XM_HIZ | YP_AIN | YM_GND | \\

XP_PST(WAIT_INT_MODE); } #define wait_up_int() { ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | \\

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE); } #define mode_x_axis() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \\

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE); } #define mode_x_axis_n() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \\

XP_PULL_UP_DIS | XP_PST(NOP_MODE); } #define mode_y_axis() { ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND | \\

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE); } #define start_adc_x() { ADCCON = PRESCALE_EN | PRSCVL(49) | \\

ADC_INPUT(ADC_IN5) | ADC_START_BY_RD_EN | \\

ADC_NORMAL_MODE; \\

ADCDAT0; } #define start_adc_y() { ADCCON = PRESCALE_EN | PRSCVL(49) | \\

ADC_INPUT(ADC_IN7) | ADC_START_BY_RD_EN | \\

ADC_NORMAL_MODE; \\

ADCDAT1; } #define disable_ts_adc() { ADCCON &= ~(ADCCON_READ_START); }

static int adc_state = 0; static int x, y; /* touch screen coorinates */

static void tsEvent_raw(void) { if (tsdev.penStatus == PEN_DOWN) {

BUF_HEAD.x = x;

BUF_HEAD.y = y;

BUF_HEAD.preure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG

ts_timer.expires = jiffies + TS_TIMER_DELAY;

add_timer(&ts_timer); #endif } else { #ifdef HOOK_FOR_DRAG

del_timer(&ts_timer); #endif

BUF_HEAD.x = 0;

BUF_HEAD.y = 0;

BUF_HEAD.preure = PEN_UP; }

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF); wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNC if (tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN); #endif

#ifdef CONFIG_PM pm_acce(tsdev.pm_dev); #endif }

static int tsRead(TS_RET * ts_ret) { spin_lock_irq(&(tsdev.lock)); ts_ret->x = BUF_TAIL.x; ts_ret->y = BUF_TAIL.y; ts_ret->preure = BUF_TAIL.preure; tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF); spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET); }

static ize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) { TS_RET ts_ret;

21

retry: if (tsdev.head != tsdev.tail) {

int count;

count = tsRead(&ts_ret);

if (count) copy_to_user(buffer, (char *)&ts_ret, count);

return count; } else {

if (filp->f_flags & O_NONBLOCK)

return -EAGAIN;

interruptible_sleep_on(&(tsdev.wq));

if (signal_pending(current))

return -ERESTARTSYS;

goto retry; }

return sizeof(TS_RET); }

#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode) { return fasync_helper(fd, filp, mode, &(tsdev.aq)); } #endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait) { poll_wait(filp, &(tsdev.wq), wait); return (tsdev.head == tsdev.tail) ? 0 : (POLLIN | POLLRDNORM); }

static inline void start_ts_adc(void) { adc_state = 0; mode_x_axis(); start_adc_x(); }

static inline void s3c2410_get_XY(void) { if (adc_state == 0) {

adc_state = 1;

disable_ts_adc();

22

y = (ADCDAT0 & 0x3ff);

mode_y_axis();

start_adc_y(); } else if (adc_state == 1) {

adc_state = 0;

disable_ts_adc();

x = (ADCDAT1 & 0x3ff);

tsdev.penStatus = PEN_DOWN;

DPRINTK(\"PEN DOWN: x: %08d, y: %08d\\n\", x, y);

wait_up_int();

tsEvent(); } }

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg) { #if 0 DPRINTK(\"Occured Touch Screen Interrupt\\n\"); DPRINTK(\"SUBSRCPND = 0x%08lx\\n\", SUBSRCPND); #endif spin_lock_irq(&(tsdev.lock)); if (tsdev.penStatus == PEN_UP) s3c2410_get_XY(); #ifdef HOOK_FOR_DRAG else s3c2410_get_XY(); #endif spin_unlock_irq(&(tsdev.lock)); }

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg) { #if 0 DPRINTK(\"Occured Touch Screen Interrupt\\n\"); DPRINTK(\"SUBSRCPND = 0x%08lx\\n\", SUBSRCPND); #endif spin_lock_irq(&(tsdev.lock)); if (tsdev.penStatus == PEN_UP) { start_ts_adc(); } else { tsdev.penStatus = PEN_UP; DPRINTK(\"PEN UP: x: %08d, y: %08d\\n\", x, y); wait_down_int(); tsEvent();

23

} spin_unlock_irq(&(tsdev.lock)); }

#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data) { spin_lock_irq(&(tsdev.lock)); if (tsdev.penStatus == PEN_DOWN) {

start_ts_adc(); } spin_unlock_irq(&(tsdev.lock)); } #endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp) { tsdev.head = tsdev.tail = 0; tsdev.penStatus = PEN_UP; #ifdef HOOK_FOR_DRAG init_timer(&ts_timer); ts_timer.function = ts_timer_handler; #endif tsEvent = tsEvent_raw; init_waitqueue_head(&(tsdev.wq));

MOD_INC_USE_COUNT; return 0; }

static int s3c2410_ts_release(struct inode *inode, struct file *filp) { #ifdef HOOK_FOR_DRAG del_timer(&ts_timer); #endif MOD_DEC_USE_COUNT; return 0; }

static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,

release: s3c2410_ts_release,

24

#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };

void tsEvent_dummy(void) {} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,

void *data) { switch (req) {

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break; } return 0; } #endif

#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw; #endif static int __init s3c2410_ts_init(void) { int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); if (ret

/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);

25

set_GPIO_mode(GPIO105_YMON_MD); set_GPIO_mode(GPIO104_nXPON_MD); set_GPIO_mode(GPIO103_XMON_MD);

GPUP(GPIO106_nYPON) |= GPIO_bit(GPIO106_nYPON); GPUP(GPIO105_YMON) &= GPIO_bit(GPIO105_YMON); GPUP(GPIO104_nXPON) |= GPIO_bit(GPIO104_nXPON); GPUP(GPIO103_XMON) &= GPIO_bit(GPIO103_XMON); #else set_gpio_ctrl(GPIO_YPON); set_gpio_ctrl(GPIO_YMON); set_gpio_ctrl(GPIO_XPON); set_gpio_ctrl(GPIO_XMON); #endif

/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,

DEVICE_NAME, s3c2410_isr_adc); if (ret) goto adc_failed; ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,

DEVICE_NAME, s3c2410_isr_tc); if (ret) goto tc_failed;

/* Wait for touch screen interrupts */ wait_down_int();

#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, \"touchscreen\", NULL); devfs_tsraw = devfs_register(devfs_ts_dir, \"0raw\", DEVFS_FL_DEFAULT,

tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,

&s3c2410_fops, NULL); #endif

#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,

s3c2410_ts_pm_callback); #endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,

s3c2410_ts_pm_callback); #endif printk(DEVICE_NAME \" initialized\\n\");

26

return 0; tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc); adc_failed: return ret; }

static void __exit s3c2410_ts_exit(void) { #ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw); devfs_unregister(devfs_ts_dir); #endif unregister_chrdev(tsMajor, DEVICE_NAME); #ifdef CONFIG_PM pm_unregister(tsdev.pm_dev); #endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc); free_irq(IRQ_TC, s3c2410_isr_tc); }

module_init(s3c2410_ts_init); module_exit(s3c2410_ts_exit); 触摸屏应用程序

#include #include #include /* 文件操作 */

#define PEN_UP 0 /* 触摸笔抬笔,即触摸屏不被压下 */ #define PEN_DOWN 1 /* 触摸笔下笔,即触摸屏被压下 */ #define PEN_FLEETING 2 /* 触摸笔拖动 */

typedef struct { unsigned short preure; /* 触摸笔动作 */ unsigned short x;

/* 触点x座标值 */ unsigned short y;

/* 触点y座标值 */ unsigned short pad; }TS_RET;

int main() { int fd,ret,i;

27

unsigned char suba; TS_RET tsret;

fd = open(\"/dev/touchscreen/0raw\", O_RDWR); /* 打开设备 */ if(fd == -1) { printf(\"\\nCan\'t open I2C device!\\n\"); exit(-1); }

while(1) {

ret = read(fd, (char *)&tsret, sizeof(TS_RET));

if (ret != sizeof(TS_RET))

{

printf(\"read touch screen error!\");

close(fd);

exit(-1);

}

else

{

printf(\"preure is: %d\\n\", tsret.preure);

printf(\"x is: %d\\n\", tsret.x);

printf(\"y is: %d\\n\", tsret.y);

} }

close(fd); return 0; } 3.3.应用程序的调试

使用s3c2410_ts.c触摸屏驱动编写应用程序,读取触摸屏的触点坐标值及动作信息(触点x坐标值,y坐标及是否有压力值pre),并在串口中断打印出来

对触摸屏设别的操作有打开设备,关闭设备,读操作等。编写应用程序读取触摸屏的触点坐标值及动作信息时,只需利用触摸屏驱动程序便可实现,先打开触摸屏设备,然后调用读函数即可。

其中,触摸笔动作取值如下: #define PEN_UP 0 #define PEN_DOWN

/* 触摸笔抬笔,即触摸屏不被压下 */ /* 触摸笔下笔,即触摸屏被压下 */

28

1

#define PEN_FLEETING 2 结构体定义如下: typedef struct { unsigned short preure; unsigned short x; unsigned short y; unsigned short pad; }TS_RET 打开应用程序:

/* 触摸笔拖动 */

/* 触摸笔动作 */ /* 触点x座标值 */ /* 触点y座标值 */

3.2.6、实验结果显示:

第四部分 感想

29

第四部分 心得

4.1 课程设计心得体会:

为期几天的课程设计结束了,再次期间我积极亲自实验,用的目标板是s3c2410核心子板,用JTAG仿真器,用Cygwin模拟软件来学习触摸板的设计。我学会了很多,学会了很多。

首先我扪主要了解整个设计过程,以及实验环境的建立,这次用的是交叉编译环境,通过这次课设我更清楚搭建嵌入式系统的开发平台,我们用的目标板是s3c2410核心子板,用JTAG仿真器,用Cygwin模拟软件,课设的这几天我学会了熟练的使用Cygwin软件,掌握了一些常用的命令,加上研究生学长给我们的指导,知道了如何学习,如何思考,知道了运linux操作系统开发嵌入式与wince操作系统开发嵌入式的区别。

其次是学会vivi,内核,根文件系统的编译与移植(烧写),通过这个过程我熟悉了怎么把软件固化到硬件上,知道了软件怎么控制硬件,这个步骤很重要,要烧写不成功,目标板系统就运行不起来,实验就失败了,这个过程我们练习了好多变呢,大家都很累哦!

再次我们就开始写我们的应用程序,通过以上步骤实验系统搭建好了,只要调试好应用程序,然后再运行成功就行了,为此我又把课本上讲得触摸屏原理那章认真看了,又看了实验指导书,查资料,上网搜索,终于编出应用程序,经过不断的调试才编译成功,这个过程太辛苦了,加上实验板不太好,真是对我们的挑战,不过看到运行的 30

结果,大家都很高兴,也很有成就感啊!还看懂了一些s3c2410的驱动程序的源代码,了解了s3c2410一些控制器的使用,以及s3c2410A的一些接口原理与应用。

我明白了只有不断的努力,不断的学习,才能在将来遇到的问题中能够游刃有余,才能够不会捉襟见肘。

31

第五部分 参考文献

5.1【参考文献】

1 程昌南,方强等.《ARM Linux入门与实践 》【M】.北京:北京航空航天大学出版社,2008.10 2 张晓林等.《嵌入式系统设计与实践》【M】.北京:北京航空航天大学出版社,2006.1 3 李俊等.《嵌入式Linux设备驱动开发详解》【M】.北京:北京人民邮电出版社,2008.3 4 黄智伟,邓月明,王彦.《ARM9嵌入式系统设计基础教程》.北京:北京航空航天大学出版社,2008.8 5 [美]Wayne Wolf.嵌入式计算系统设计原理.孙玉芳, 梁彬 罗保国 等译.北京: 机械工业出版社, 2002

6 李剑, 赵鹏程, 汤建彬.32位ARM嵌入式处理器的调试技术.电子技术应用, 2003, (3)

7 钟汉如, 王创生.嵌入式Linux的中断处理与实时调度的实现机制.计算机工程, 2002, 28(10)

8 Arnold Berger.嵌入式系统设计.吕骏 译.北京: 电子工业出版社, 2002

32

第16篇:嵌入式系统基础课程设计报告

河南机电高等专科学校

嵌入式系统基础课程设计报告

系 部: 电子通信工程系 专 业: 班 级: 学生姓名: 学 号:

2012年 06月

嵌入式系统基础课程设计任务书

1.时间:2012年06月11日~2012年06月15日 2.课程设计单位:河南机电高等专科学校

3.课程设计目的:深入学习单片机编程技巧,熟悉电子产品设计制作全过程。能够利用汇编语言完成十字路口交通灯的设计。 4.课程设计任务:

按交通灯的具体要求来写

―――-红色文字为说明,写报告时请先删除!!!

2 嵌入式系统基础课程设计报告

前言:

××××××××××××××××××××××××××××××××××××××××××××××× ----- 宋体,小四,不加粗,单倍行距

实训报告: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

„„„„„„

×××××××××××××××××××××××××××××××

―――-红色文字为说明,写报告时请先删除!!!

心得体会: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

„„„„„„

××××××××××××××××××××××××××××××××××××××××××××××××××

参考文献:

„„„以下红色文字为“参考文献”的示例,写报告时请先删除!!!填写上你自己的“参考文献”

[1] 周小谦,丁功扬,郭日彩,三峡电力系统的形成和发展,电网技术。1998,88(3):p1-3 [2] ----- 宋体,小五,不加粗,单倍行距

第17篇:北京科技大学 嵌入式课程设计报告

《嵌入式控制系统》 课程设计报告

学 院

专业班级

指导教师

_

目录

摘要 ..............................................................................................................................................4

- 1

- 3

引言

随着芯片技术和电子产品智能化的飞速发展,嵌入式技术越来越受到人们的关注,应用领域几乎遍及所有的电子产品:智能机器人、网络通信、军用设备、汽车导航、环境保护、智能仪器等等。嵌入式系统不仅融合了计算机软、硬件技术、通讯技术和半导体微电子技术,而且针对实际应用系统要求,将相应的计算机直接嵌入到应用系统中,并可针对应用需求对软、硬件进行优化、裁减。

嵌入式控制系统是一门新兴的课程,通过本次课程设计可以更好地掌握这门新技术,对今后的发展有很大帮助。

- 5

开发方法和流程,熟悉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 发光二极管的核心组成部分

- 7

图3 控件设计图

其中,显示按钮是作为数码管静态显示的按钮,如显示1235; 亮、灭、闪烁这三个按键是通过GPIO控制发光二极管的状态; 测试按键是实现2,

4、

6、8数码管循环动态显示的按钮;复位按键是实现中断次数清零功能的按钮; Apply按键是启动更改的循环显示周期的按键。

以上就是整个课程设计的全部控制界面,通过不同的按钮操作,实现不同的功能。

5.3基本功能的实现

windowsCE是一个界面友好的嵌入式操作系统,系统提供了丰富了控件,极大的方便了用户的开发。C++是优秀的编程语言,在EVC环境下,编写的难度大大降低,尤其是界面的处理。由于实验平台提供了相应的驱动程序,所以本次实验并不需要了解其硬件操作,大大缩短了一个嵌入式应用的开发速度。通过本次嵌入式实

- 9

图5 LED数码管循环显示2,4,6,7 6.2 LED数码管清零功能实现结果

通过控制面板上的操作按键,实现清零功能,当按键按下去之后,四个LED数码管的显示数字全部都会变为零。见图6

- 11

6.4 频率设置功能实现结果

闪烁周期可以通过键盘输入来进行设置,本课程设计设置的为0~9之间,基值为100ms,通过改变闪烁周期来控制

2、

4、

6、8循环显示的频率。见图8.和图9.

图8 闪烁周期为5时的结果

- 13

力,也增强了我们的团队协作能力。有什么不懂不明白的地方要及时请教老师或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识。

- 15

} //{{AFX_DATA_MAP(CLedDlg) // NOTE: the ClaWizard 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 meage 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

- 17

}

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 unle you set the focus to a control

- 19

WriteFile(m_hDev2,&m_bValue,4,&m_dwBytes,NULL); } void CLedDlg::OnButtonOff() {

}

void CLedDlg::OnButtonFlash() {

}

void CLedDlg::OnTimer(UINT nIDEvent) {

// TODO: Add your meage 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);

- 21

} 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

- 23

flashtime=str[0]-\'0\';

if(flashtime==0)

{

flashtime=1;

} } }

- 25 -

第18篇:嵌入式原理与应用课程设计目的

嵌入式原理与应用课程设计任务书

(08级电气自动化01班与02班)

1.课程设计题目:

1)设计一个LED灯指示控制直流电机控制装置

使用4个LED灯指示,包括直流电机的低速转动与停转,高速转动与停转。

2) 设计一个LED灯指示控制步进制电机控制装置

使用4个LED灯指示,单(单相绕组通电)四拍(A-B-C-D-A。。。)步进制电机的顺时针转动与停转,逆时针转动与停转。

3)设计一个红绿LED灯指示控制人行道过马路装置

使用7个或14个LED灯做一位或两位7段数码管管倒计时控制红绿黄灯亮,实现对人行道和车行道的控制;或用多个LED和蜂鸣器在另一个定时器的指示下控制红绿黄灯亮,实现对人行道和车行道的控制。

2.课程设计目的:

1)理解与掌握嵌入式袁智勇教材5.4节I/O端口。 2)理解嵌入式袁智勇教材6.1节中断概述。

3)理解与掌握嵌入式袁智勇教材6.3节定时器工作原理。。

4) 掌握与使用周立功教程4.2节GPIO,掌握自动化流程控制的通断控制LED灯的控制编程与硬件实现。

5) 掌握与使用周立功教程4.5节定时器0与定时器1,准确的使用定时器0与定时器1进行自动化流程控制直流电机的控制编程与硬件实现;步进制电机的控制编程与硬件实现;及7段数码管倒计时指示交通灯的编程与硬件实现。

6)根据上述理论与资源和嵌入式指导书2440实验182页-188页,写出该课程设计报告。

3.课程设计主要内容:

1)每两至三人一组根据该组所选的题目,可选1-2个题目,绘出该课程设计电路图和列出使用器件明细表;领取明细表器件与焊接工具。完成该电路图的焊接。

2)每组每人根据所选的题目编写该课题程序,调试正确后,烧写到LPCARM2103模块中去;实现该课程设计。

3)使用A4纸每人结合本课程设计目的和课程设计主要内容,撰写一份设计《嵌入式原理与应用课程设计报告》;并包含课题原理论述,实现电路与编程论述,电路图,器件明细表,实现程序,调试烧写过程,课程设计检验测试与实现,展望联想与总结。

4.课程设计资料:

1)《嵌入式系统原理与应用技术》北京航空航天大学出版社教材 袁智勇著 2) 《EasyARM2103教材》广州周立功单片机发展有限公司编 3)直流电机dynamo-1 程序和步进制电机motor-0程序 作者指导教师刘敦放

5.课程设计提交时间:

课程设计报告和课程设计演示和设计实用工具、LPCARM2103模块及仿真器一起在2011年12月15日以前一起交给刘敦放老师。

6.课程设计报告撰写要求

1)报告格式

封面

课程设计报告

题目: 专业班级: 姓名: 指导教师: 日期: 目录 正文

设计任务与要求 设计依据原则

硬件系统设计(设计电路图和列出使用器件明细表)

软件系统设计(实现程序,调试烧写过程,课程设计检验测试与实现)

心得体会、收获,意见与建议

展望联想与总结

参考文献

按“作者,书名,出版社,出版时间,引用教材,引用程序”格式逐一列出

附录

如:图纸(电路图)及完整程序

2)报告要求

用word排版, 电路图绘制图纸,表格、插图均需编号。 注明页次,装订成册(纸质版)。

3)提交资料:课程设计报告纸质版 1份 。

7.嵌入式原理与应用课程设计成绩评定方法:

课程设计报告成绩60%,设计硬件15%,课程设计演示15%,考勤10% 。

嵌入式原理与应用课程设计指导教师

刘敦放

2011-6-15

第19篇:嵌入式心得体会解读

嵌入式心得体会

嵌入式心得体会一:嵌入式学习心得体会

4月10号,为期一个阶段的Linux开发基础培训课程圆满结束,回首这些天所留下的点点滴滴,感触深深,学习上知识点的积累,灵活运用的过程中感受到了Linux操作的快速高效性能,这也是我所追求的效率!

当初初涉培训课程的第一门课程时,都说Linux操作很繁琐复杂,心里总有些顾忌,带着种种不安与些许拼博的决心,开始了自我提升阶段的“充电”,由徐海兵老师教授我们基础课程的培训,我们则像着小学生般认真的记着笔记,仔细听着并学会如何去在实践中运用所学的Linux下的各种强大的命令集。

在Unit 1中,徐老师详细生动的为我们讲述了有关Linux的诞生、初成长以及辉煌的发展至今,今后应用范围则愈来愈广泛,讲解了为Linux这个伟大的OS做出巨大贡献的一位位出色的、伟大的人物,他们那种学习钻研的精神、锲而不舍的信念、勇于把握住难得的机会,从小处着手,踏踏实实的创造出了对人类科技发展做出卓越贡献的Linux(Unix)系统,他们的种种,都值得我们去深刻反省、刻苦学习、传承并永远发展下去。

查看ip地址和重启网络服务是我学的第一个命令: ifconfig eth0、ifconfig eth0 IP地址、service network restart。了解到远程登录软件可用xmanager。

secureCRT是我们常用的,安装好后利用其登录到了Red hat Linux,需要知道Linux主机的ip 地址。徐老师为我们介绍了重要内容:SHELL,即运行程序的程序,如echo $$SHELL可查看SHELL的环境变量是csh还是bash。指令pwd可查看当前所在路径,pawd:更改Linux下的密码,仅限root用户有此权限,当然我们是利用虚拟机VMware程序来运行Linux OS的,懂得了如何设置虚拟机的网卡设置、暂停、恢复、全屏等。

简单的学习后进入Unit 2,命令行的句法让我懂得了用法规则,一系列的命令功能强大:

date 显示当前年月时间星期之类的;

more指令与le重要但不常用;

cat用于查看短小的文件内容,常用!

mkdir命令用于在当前目录下创建新的目录;

ls 显示当前目录下所有文件;cd 更改文件路径,如cd 、cd .当前目录;

rmdir 删除空文件夹;

rm指令很强大,用于删除空目录及非空目录下的指定或全部文件;

man 真男人,帮助手册;

history指令用于显示编写过的命令集,以history 序号 可显示序号所指命令;

echo回写命令,很重要,我需要继续学习;

exit 指从多重SHELL退出来;

Linux账号下,可以增加用户、删除用户、设置密码:useradd、userdel、pawd;注:所有的用户的家目录都在/home下面,唯独root的家是在/root.点文件都是些SHELL的脚本程序,也称隐藏文件;环境变量常见的有:HOME PATH PWD,懂得了绝对路径与相对路径的对比概念。

Unit

3、文件与文件处理的学习中,知道了Linux下支持的六种文件类型:普通文件、目录、设备文件、命名管道、符号链接、socket;Linux下文件系统的组织:倒立的树形结构:/ /bin /boot /dev /home /lib /proc等文件目录,ls –l指令很好很强大,显示文件类型与权限、所有者、字节大小、时间及文件名;touch可创建空文件,复制文件用指令 cp,可选-i、-r等;重命名文件使用 mv [-i];du 显示当前目录所占空间大小;wc 命令 显示列表中文件的行数、字数、字符数;追加:cat [文件列表] 》 目标文件;find指令与grep重要,暂未学习,自己在实践中学习,文件访问权限有:r w x;chmod指令可修改访问权限,如 chmod 777 -R 文件名。

输入输出重定向 每个命令默认打开三个文件:标准输入stdin,标准输出stdout,标准错误stderr,键盘为标准输入,而控制台则是标准输出,文件描述符分别是0,1,2;最重要最常用的为输出重定向 >与错误重定向 2>;

echo 添加的内容 >/ 》 文件;

Linux过滤器和管道:管道操作符:| ;即将某个命令的输出与某个命令的标准输入相连接,从而实现管道功能,例如 ls –l |wc;管道和重定向操作符可同时用于一个命令行。

Unit 5:Linux/Unix进程 进程为程序运行的一个实例,可用ctrl-z挂起进程,或在命令后加上&符号即可;运行在后台的系统进程是守护进程,它为用户提供各种服务。

ps 指令可显示进程属性,有ps l;ps a;ps aux等

ps –l可显示用户ID、进程ID、优先级、TTY以及STAT

bg、fg 分别将进程放后台、前台运行,jobs则是查询所运行的进程的状态;

& 放于命令间表示可同时运行多个命令;

; 表示可顺序执行多个命令

前台程序可用ctrl-c来终止、kill指令

进入Unit 6,神秘的Shell脚本逐渐揭开了她那瑰丽的面纱

环境变量的设置:export MYHOST=IP地址

查询引用 echo $$MYHOST

解常用环境变量:HOME,PATH,TERM,PWD以及PS1 、2,其中PATH最为重要,保存用冒号分割的目录路径名,vim –r /etc/profile可打开路径并修改PATH。

export 显示当前所有的环境变量;

unset 用于清除环境变量;

执行cp 文件名 /bin 后可直接写并运行文件;

Shell的元字符下有许多字符,如* 匹配0个或多个字符;?匹配单个字符;[]中可加入数字或字母,ls [abc]将查询a、b、c字符的文件。

当看到“Linux网络服务器的搭建”时,内心激动万分,一直听说,但未实践过,很好奇,随后徐老师为我们细心讲解了如何设置与操作,首先我知道了Linux下的文件系统类型多种多样,它支持中虚拟文件系统VFS,因此文件系统扩展性很好。

文件归档这一小节,真的很惭愧,太多的不理解,而且必须尽快解决的。

RPM包的安装与使用:rpm –ivh 所要安装的Linux下的程序名;rpm的查询用:rpm –qa;删除用:rpm –e 程序名

SAMBA服务器搭建:(重点)首先在Linux下创建samba服务器,进行设置,分享指定目录,查出Linux下的IP地址,将windows与Linux下的防火墙关闭,ping指令能否ping通,然后更改共享的文件访问权限:chmod 777 –R 目录名;在Linux命令行下进行挂载点设置:mount /目录名 /挂载目录名。

NFS服务器的搭建:(重要)首先在用户名下创建文件夹,用此命令进行挂载:mount –t nfs localhost:/目录名 /挂载点目录名;与不同机器的系统通信操作时用:mount –t nfs 对方IP地址:/共享目录 /自身目录;前提:文件访问权限的更该,需要在同一网段,并ping通对方IP地址,在根目录下可用umount /目录名 来卸载已经挂载的文件系统。

在程序开发的过程这一单元,主要讲述了编程语言的发展、分类、功能以及程序的编译、解释过程,最主要的为程序编辑器:vim:有两种模式 命令模式与编辑模式,分别用 i和esc键来操作,gcc 文件名。后缀 –o 文件名来编译,进入编辑模式后,可用如下:/搜索、:N、dnd、yny、p、wq来进行不同功能的操作。

源代码编排:通常使用indent –kr 文件名即可。重头戏到来:gcc是Linux下标准编译器,调试工具:gdb;源程序。c首先进行预编译(-E)得到。i文件,经(-S)编译成汇编文件。s,(-c)参数进行。s编译成。o目标代码,链接成ELF文件即可,如:gcc 文件名。后缀 –o 文件名。

gdb调试器:在gcc hello.c –o hello –g 中勿忘 –g,使用gdb 文件名即可进入调试模式,指令r、s、n、b等可以逐步调试出程序的出错点。

Unit 10多模块程序的编译与Makefile:Make是非常强大的实用程序,管理多模块程序的编译与链接,直到生成可执行代码,vim makefile进入,设定Makefile的入口目标,注意的是在编写代码过程中tab键会很重要,回车+Tab切记。简单替换如:CC:=gcc、CC+=-g、在下面的代码需加$$()。Make中的内建变量有:$$@代表当前目标名称、$$

>嵌入式心得体会二:嵌入式实验心得体会>>(854字)

学期开始,我们开始学习《嵌入式系统及应用》,由于初次接触嵌入式系统,感觉蛮难的,所以收获不是很大,很多的概念都比较模糊,等到学期结束开始做嵌入式课程设计时,真是茫然无从下手,自从拿到设计主题后,我就像热锅上的蚂蚁,一个字“急”。最后实在没有办法,逼着自己去学习,查资料,总算对嵌入式有了浅层理解。

嵌入式系统本身是一个相对模糊的定义,一个手持的MP3和一个PC104的微型工业控制计算机都可以认为是嵌入式系统。总体来说,嵌入式系统是“用于控制,监视或者辅助操作机器和设备的装备”。一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。

在了解了基础知识之后,我开始进行上机操作,当然,其中遇到很多的难题,很多东西都是第一次接触,又没有别人在旁边指导操作,完全凭借自己去摸索练习。其中的困难可想而知。然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的。可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓“一份耕耘,一份收获。”没有付出,何谈回报呢?再者,通过本次实验,我也学会了如何去分析问题,如何找出自己设计中的不足,继而去排除解决问题,这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。

当然,在这其中,我也发现自己的许多不足之处,由于学期伊始我没有好好学习,才落到如此地步,这也可以说是一个教训吧!我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。只有做好足够的准备,才能事半功倍!

>嵌入式心得体会三:嵌入式学习心得>>(863字)

首先,嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式有如下几个突出的有点1.系统内核小,2专用性强,3系统精简4高实时性OS5嵌入式系统的应用程序可以没有操作系统直接在芯片上运行,6嵌入式系统需要开发工具和环境。

嵌入式系统是近几年才风靡起来的,但是这个概念并非新近才出现。从20世纪七十年代单片机(最早的单片机是Intel公司的 8048,出现在1976年)的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。经过30年的发展,嵌入式技术已经日趋成熟,在中国嵌入式机一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。

其次,嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。

嵌入式系统是软硬结合的学科,通常有两类人会去专研嵌入式:一类是学电子工程、通信工程等偏硬件专业的,另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。我是软件专业的学习嵌入式,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。嵌入式应用在很多方面,具体的可以分为工业控制,交通管理,信息家电,家庭智能管理系统,POS网络及电子商务,环境工程与自然,机器人,机电产品方面应用等方面。其中目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。例外还有很多地方用到了嵌入式系统,最近飞利浦和ARM共同推出32位RISC嵌入式控制器,适用于工业控制,采用最先进的0.18微米CMOS嵌入式闪存处理技术,操作电压可以低至1.2伏,它还能降低25%到30%的制造成本,在工业领域中对最终用户而言是一套极具成本效益的解决方案。

>嵌入式心得体会四:嵌入式系统学习心得>>(1328字)

首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通。他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。

对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的modem射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,只要达到一般程度可能月薪都在15k以上。

另一类就是数字部分了,在大方向上又可分为51/arm的单片机类,dsp类,fpga类,国内fpga的工程师大多是在ic设计公司从事ip核的前端验证,这部分不搞到门级,前途不太明朗,即使做个ic前端验证工程师,也要搞上几年才能胜任。dsp硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。而arm单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大,而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互pk,判定水平高低的依据。而接口设计这块最关键的是看时序,而不是简单的连接,比如pxa255处理器i2c要求速度在100kbps,如果把一个i2c外围器件,最高还达不到100kbps的与它相接,必然要导致设计的失败。这样的情况有很多,比如51单片机可以在总线接lcd,但为什么这种lcd就不能挂在arm的总线上,还有arm7总线上可以外接个winband的sd卡控制器,但为什么这种控制器接不到arm9或是xscale处理器上,这些都是问题。因此接口并不是一种简单的连接,要看时序,要看参数。 一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡乱的来,我遇到一个工程师把方案中的5v变1.8v的dc芯片,直接更换成ldo,有时就会把cpu烧上几个。前几天还有人希望我帮忙把他们以前基于pxa255平台的手持gps设备做下程序优化,我问了一下情况,地图是存在sd卡中的,而sd卡与pxa255的mmc控制器间采用的spi接口,因此导致地图读取速度十分的慢,这种情况是设计中严重的缺陷,而不是程序的问题,因此我提了几条建议,让他们更新试下再说。因此想成为一个优秀的工程师,需要对系统整体性的把握和对已有电路的理解,换句话说,给你一套电路图你终究能看明白多少,看不明白80%以上的话,说明你离优秀的工程师还差得远哪。其次是电路的调试能力和审图能力,但最最基本的能力还是原理图设计pcb绘制,逻辑设计这块。这是指的硬件设计工程师,从上面的硬件设计工程师中还可以分出ecad工程师,就是专业的画pcb板的工程师,和emc设计工程师,帮人家解决emc的问题。硬件工程师再往上就是板级测试工程师,就是c语功底很好的硬件工程师,在电路板调试过程中能通过自已编写的测试程序对硬件功能进行验证。然后再交给基于操作系统级的驱动开发人员。

>嵌入式心得体会五:嵌入式学习心得>>(3652字)

本人大学学的是电子信息科学与技术专业,其实这个专业和嵌入式没有多大的关系,要说有关系就是简单的讲了下C语言语法,学完之后还不知道什么是C语言,只记住了,char,int,string等占几个字节,if, for, while循环什么的,感觉也就能算一些小学就会的题目,全国计算机等级二级也就糊涂的过了。我这个专业没学过C++,一开始不知道什么是向对象,什么叫面向过程,这可能让大家笑话了。不过这说的是实话,大学的时候比较喜欢动手,喜欢硬件方面的东西,也喜欢看书。在大一的时候就听学长说,单片机很难学,在没事的时候就从图书管借了本关于51的书,一开始还真是不怎么懂,然后硬着头皮去看,当我把51的结构看完了,就不像一开始那样一头雾水了,自己在纸上把51的结构图默画一遍,然后再把各个寄存器功能写一下,各个功能口的结构也画一遍,然后就不觉得51有什么难了。其实有些时候不是这个东西你不会,而是在不会的时候自己先告诉自己这个太难了,自己先放弃了。我们学习51芯片,是为了以后的打基础,知道是怎么通过配置寄存器来实现功能。

大二下学期的时候,我们开了51的课,这个课几乎就没怎么去,因为我认为没有必要去听自己会的东西了。后来听别人说avr的资源会比51的丰富的很多,所以就想试试,看看有什么难的,就从网上买了本马潮老师《AVR单片机嵌入式系统原理与应用实践》,一边看书,一边想自己画一个板了,一开始想实现一个点阵屏,实现滚动效果,后来想想做个板也花不少钱呢,为什么不多加一些功能呢,还能多学到些知识,所以就加了温感,红外,铁电存储器等并把所有的扩展口都扩展了出来,备以后用,那时还挺自豪的呢,同学们都很羡慕,不过现在想想其实也没什么了。

大学也听说过嵌入式这个词,不过不太明白是什么意思,09年的时候从网上找到中嵌视频,有四张DVD(大约13G),下载下来后,从头到尾的看了一遍,没什么印象,只记得讲一些不知所云的函数,然后莫名其妙的讲怎么使用那个44b0的开发板,不过听完了,还是有很大收获的,就有一种想装一个linux的冲动,我是大二下学期才有的自己电脑,不过电脑的配置比较低,1g内存,跑虚拟机就像个蜗牛,所以就想着怎么才能装个linux,自己用XP习惯了,如果全换了又舍不得,那时从书上知道linux的文件系统和windows不一样,只有一个根分区,所以也害怕一装linux全盘就被格式化了,不过最后还是欲望战胜了担心,买了张redhat 9的光盘,小心的装这个系统,里边的英文也不是太难,还是知道大概意思的,所以一步步的装,最后装到我的硬盘的最后空间,重新启动,竟可以选择进入哪一个系统了,从这之后,自己就不害怕怎么装系统了,应了那句言,纸上得来终觉浅,绝知此事要躬行。

所以我认为,买一个开发板是完全有必要的,拿到实物操作一下就不会感觉太抽象了。

后来也想学学arm,但不知道arm是什么东西,所以就买了本《从51到arm》,讲的是关于arm的大体结构,看完后感觉,原来arm就是一个速度更快,接口更丰富的单片机啊。

如果想做linux设备驱动的同学应该对arm硬件有一些了解。如果对驱动不感兴趣,完全没有必要去看。交叉编译器会帮我们做好这些事情,他比我们更了解arm结构。

大三下学期开始准备考研了,所以自己这些兴趣就先放下了,报的北邮的信通学院通信专业,当时就是想一定要上个好学校好专业,也没想太多,结果考了的成绩差了点,没有被录取,也不想调剂一个二流的学校,然后就参加工作了,工作中每天都用的到开发板,当我看到一个小板上还可以跑系统的时候感觉很不可思议,以为要很大工程。后来边工作边学习,每天都要看电脑看到眼发疼,晚上也都差不多十二点时才睡觉。感觉到累,不过也感觉到自己在进步。

闲话有点多了,说了很多都是自己大学那点破事。

听很多的初学者说不知道从哪里开始,学习嵌入都要学哪些东西,从网上搜了一下,一大堆的东西要学,一下就推荐十几本书,说看完这本书怎么怎么样,看完那本书怎么怎么样,一下子就给初学者给吓住了,其实完全没必要把网上的那些东西全部看一遍,那样又费时,又感觉工程太大,让初学者没有信心去把每一种都看完。网上说的些方面都要知道,不一定全部都掌握,我们可以退成求其次,每一个都知道一些,当然会的越多越好。今天学点这个明天学点那,换着样来也不会觉得烦。而且还能感觉到每天都有收获。

下面给嵌入式初学者一些自己的我个人建议。

1嵌入式涉及到很多的基础知识:

c语言,关于C语言要知道基本的语法,什么是结构体,什么是共用体,有什么区别,不用强记一些二级考的东西,因在实际中用的很少。

c++要知道什么是类,怎么定义,继承,接口,要深刻理解,当然基本语法也是必不可少的。

操作系统原理也应该知道基本的原理的,我记得我大学没这个课还是去电信学院蹭别的专业的课呢,后来学习发现很多的东西都是在这个课上学到的。什么时间片啊,任务调度啊,都是在那里知道的。

Linux基本命令的使用(vi编辑器必须会用,因为在终端改文件的时候只能用这个),我们现在很多的人都习惯用鼠标了,很少用到命令,我们学习嵌入linux可要改改这个习惯了,linux用命令操作一是效率高,二是功能非常强大,远非图形界面能比的了的,其实我们用图形界面的操作都要转化为命令传给硬件的。

Linux文件系统的管理要清楚,哪个目录存放是什么东西,有什么用,文件权限管理等

Shell编程也要了解一些,在这给大家推荐一个教程,周朝剑的 shell编程,也就七八讲吧,讲的很全面。初学者看前4讲就可以了。

Linux设备驱动的架构要了解,初学者可以以飞凌的OK6410开发板上的led驱动分析一下,结合原理图和linux设备驱动相关书籍把每一行代码都分析明白。关于驱动给大家推荐一本书《LINUX社备驱动程序》中国电力出版社出版的,很经典的,初学者看可能看不太明白,不过要坚持看,最次也得把前6章看完了。

2 看书不要希望一次就会,一次就明白是什么意思,也不要死记硬背,看不明白也没关系,以后遇到了知道去哪里去找就可以了,以后遇到的多了,也就记住了,遇到的少的,忘记也就忘记了。还有,不要直接阅读linux内核源代码,看一些自己把头撞破也想不明白的事,会打击初学者的积极性,要循序渐进,今天学个做个led,明天做个串口,后天说不定就做硬件编解码了。

3、你可以不接受培训,但是不能不买开发板。

如果你想学习嵌入式一定要买块学习板,现在的开发板很便宜了,给很我们初学者减轻了经济负担。看再多的视频,看再多的书,也不如自己动手试一下,看着很简单的东西,做起来就可能遇到很多的问题,遇到问题找到原因,解决问题,只有这样才能学到东西,记得我第一次写led的驱动,想自己试一下,网上也有人写过相关的代码,可是自己一试,就出了好多的问题,那个led弄了我一天才把led灯点亮。所以不要眼高手低。

还有关于培训,现在的培训机构很多,讲的也不错,老师也很好,但是有一个问题,太集中了,而且学生动手的机会也不太多,记得我们公司还招了一个在北京某个培训机构培训半年的员工呢,花了一万多,来了之后也没感觉有多高,问他都学了什么,也就是我前边说的那些基础知识,很多的东西还是不知道的,照着书弄个helloworld模块驱动两天没搞定。不是培训不好,但我个人见解效果并不是很好。记住:只有自己动手做过的东西才是自己的。

现在买一块开发板很便宜,飞凌的OK6410的开发板就不错,源码完全开放,而且资料也很丰富,完全能满足初学者学习用,有人说友善的板子也不错,我个人觉得友善的板子不 错,但是不适合初学者,因为他的很多的东西是不给代码的,用过友善的板子的同学经常有这样的痛苦,想学一个东西,去找他的代码的时候,却找不到,很多友善提供的代码中很多的都是封装好的,只提供给客户一个库,初学者想要找代码的时候就不知道怎么办了。

4 不要好高骛远,要脚踏实地

对于初学者,还有一点小建议,我们拿到一个开发板,很兴奋也很激动,想法自然也很多,想用开发板实现自己的这个想法,实现那个想法,然后又不知道从何下手,然后就去论坛中发一个贴, “那个什么什么怎么实现啊,哪位大侠能详细说一下啊,跪求!!”然后等着别人去回复。见没人回复就抱怨。有想法是好的,我们要实现自己的想法也是有前提的,首先,我们对这部分知识了解吗?如果不了解就去google一下(最好别用百度,不太好用),了解了一些,也就大概知道要怎么做了。如果再遇到问题,再去发贴问,这样也显得咱们有水平。比如自己连串口是什么都不太清楚呢,就问串口通信怎么做啊,就是人家把代码给咱,咱也不明白是怎么回事啊。

5 多看代码,多写代码

见多识广,熟能生巧。多看代码,要从代码中读出代码的意思来。自己平时也要多写代码,多练习(这一点我做的不好,写的少)。

写完已经晚上两点了,思路有些乱,有些也是个人的见解,在有些人看来可能是错误的,每个人有每个人的学习方法,但是我们的目的只有一个——希望我们学到更多的知识。

读书的好处

1、行万里路,读万卷书。

2、书山有路勤为径,学海无涯苦作舟。

3、读书破万卷,下笔如有神。

4、我所学到的任何有价值的知识都是由自学中得来的。——达尔文

5、少壮不努力,老大徒悲伤。

6、黑发不知勤学早,白首方悔读书迟。——颜真卿

7、宝剑锋从磨砺出,梅花香自苦寒来。

8、读书要三到:心到、眼到、口到

9、玉不琢、不成器,人不学、不知义。

10、一日无书,百事荒废。——陈寿

11、书是人类进步的阶梯。

12、一日不读口生,一日不写手生。

13、我扑在书上,就像饥饿的人扑在面包上。——高尔基

14、书到用时方恨少、事非经过不知难。——陆游

15、读一本好书,就如同和一个高尚的人在交谈——歌德

16、读一切好书,就是和许多高尚的人谈话。——笛卡儿

17、学习永远不晚。——高尔基

18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向

19、学而不思则惘,思而不学则殆。——孔子

20、读书给人以快乐、给人以光彩、给人以才干。——培根

第20篇:嵌入式实验心得体会

2016嵌入式实验心得体会

嵌入式实验心得体会是计算机专业应该具备的常用知识,以下这篇范文整理个人对嵌入式系统的认识,和进行操作之后的个人体会,对操作的疑难的反思。下面是这篇嵌入式实验心得体会

嵌入式实验心得体会

学期开始,我们开始学习《嵌入式系统及应用》,由于初次接触嵌入式系统,感觉蛮难的,所以收获不是很大,很多的概念都比较模糊,等到学期结束开始做嵌入式课程设计时,真是茫然无从下手,自从拿到设计主题后,我就像热锅上的蚂蚁,一个字\"急\"。最后实在没有办法,逼着自己去学习,查资料,总算对嵌入式有了浅层理解。 嵌入式系统本身是一个相对模糊的定义,一个手持的Mp3和一个pC104的微型工业控制计算机都可以认为是嵌入式系统。总体来说,嵌入式系统是\"用于控制,监视或者辅助操作机器和设备的装备\"。一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之上是C库,负责把pOSIXApI转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。

在了解了基础知识之后,我开始进行上机操作,当然,其中遇到很多的难题,很多东西都是第一次接触,又没有别人在旁边指导操作,完全凭借自己去摸索练习。其中的困难可想而知。然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的。可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓\"一份耕耘,一份收获。\"没有付出,何谈回报呢?再者,通过本次实验,我也学会了如何去分析问题,如何找出自己设计中的不足,继而去排除解决问题,这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。

当然,在这其中,我也发现自己的许多不足之处,由于学期伊始我没有好好学习,才落到如此地步,这也可以说是一个教训吧!我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。只有做好足够的准备,才能事半功倍!

《嵌入式课程设计心得体会.doc》
嵌入式课程设计心得体会
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

相关推荐

工作心得体会先进事迹心得体会读后感观后感学习培训心得体会作风建设心得体会党员心得体会其他心得体会
下载全文