目 录
1 前言. 5
1.1实习单位简介... 5
1.2 实习任务简介... 5
2 LINUX简介. 6
2.1 嵌入式系统... 6
2.1.1 定义... 6
2.1.2 嵌入式系统的应用... 6
2.1.3嵌入式系统的特点... 8
2.1.4嵌入式LINUX开发的学习... 8
2.2 Linux入门... 8
2.2.1 Linux与UNIX关系... 9
2.2.2 LINUX的常用命令... 9
3 C程序入门. 10
3.1 什么是程序... 10
3.2 指令分类... 10
3.3 编程的本质... 10
3.4 程序调试... 10
3.5 C语言初步... 10
4 嵌入式开发环境的搭建. 11
4.1 安装步骤... 11
5 串口操作及文件操作. 14
5.1 串口操作... 14
5.1.1 串行通讯原理... 14
5.1.2 程序分析... 14
5.1.3 串口设置... 15
5.1.4 串口的读写操作... 15
5.2 Linux下文件操作... 15
5.2.1 文件I/O操作... 15
5.2.2 UNIX哲学之一:一切皆为文件... 16
6 LED显示. 19
7.1 A/D 转换器... 20
7.1.1 AD转换器的分类... 20
7.1.2 A/D 转换的重要指标... 20
7.1.3 ARM 自带的十位A/D. 20
7.1.4 关键代码分析... 20
7.2 直流电机实验... 20
8 实习总结. 22
8.1 实习中遇到的问题... 22
8.2 实习收获和总结... 22
1 前言
1.1实习单位简介
北京恩思博科技太原皓博教育中心 北京恩思博科技太原皓博培训机构是北京恩思博科技下设的以培训计算机软件开发和商务英语日语为主的教育机构,以学生就业为导向,同时为追求教学质量,公司在北京组建了一支雄厚的师资队伍,并配备了一流的教学设施,在保证学生的学习效果的同时适应了软件开发企业的要求,学校将一如既往的秉承勤俭显本色、创新铸灵魂、质量如生命、人才立根本的办学理念,全方位服务于广大学子!
1.2 实习任务简介
n 熟悉linux命令
n 熟悉linux下文件操作及串口操作熟悉linux命令
n 学习linux下文件操作
n 熟悉linux下软件开发的基本方法
n 熟悉嵌入式Linux系统开发
n makefile的编写
n 配置串口对串口进行操作
n 在linux下C程序的编写进一步熟悉嵌入式Linux系统开发
n 熟悉linux下LED的操作
n 完成一个LED流动显示的功能
n 熟悉 ARM 本身自带的PWM,掌握相应寄存器的配置。
n Linux 下编程实现ARM 系统的PWM 输出,从而控制直流电机。
n 了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配。
n 学习嵌入式linux下AD转换程序的编写
n 学习简单的多线程概念
n 结合LED显示功能,将AD转换后电压的百分比显示在8段LED上
2 LINUX简介
2.1 嵌入式系统
2.1.1定义
以应用为中心、以计算机技术为基础、软件硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
2.1.2嵌入式系统的应用
嵌入式视频服务器
智能玩具与机器人
现代化家庭
汽车电子
2.1.3嵌入式系统的特点
低功耗,体积小,专用性强
使用固态存储器
系统精简
稳定性要求高
需要专用开发工具
2.1.4嵌入式LINUX开发的学习
嵌入式linux系统软件开发:
熟悉Linux的主要操作;
?熟悉并可以编译Linux内核;
熟悉嵌入式Linux系统开发的整体流程;
熟悉Linux系统并丐能够熟练编写Linux应用程序包括网络和图形;
了解Linux设备驱动开发;
了解系统移植
嵌入式Linux驱动程序开发:
? Linux字符设备驱动程序;
? 内核内存管理和中断管理;
? 块设备驱动程序和MTD, 以及文件系统;
?网络驱动程序;
?USB设备驱动程序开发;
? 帧缓冲驱动和DMA;
系统移植:
系统移植的方法;
? 制作BootLoader;
? 编译调试内核;
? 定制文件系统;
Linux内核:
进程调度和可抢占内核实现分析;
? 内存管理;
? 内核中的定时;
? 中断和异常;
? 系统调用和IP;
?文件系统;
2.2 Linux入门
官方定义:Linux 具备现代一切功能完整的 UNIX 系统所具备的全部特征,其中包括真正的多任务、虚拟内存、共享库、需求装载、共享的写时复制程序执行、优秀的内存管理以及 TCP/IP 网络支持等。Linux 的发行遵守 GNU 的通用公共许可证。Linux 起初为基于 386/486 的 PC 机开发,但现在,Linux 也可以运行在 DEC Alpha、SUN Sparc、M68000,以及MIPS 和 PowerPC 等计算机上。
2.2.1 Linux与UNIX关系
n Linux内核是一个全功能的、支持POSIX标准的、类Unix的操作系统内核,该系统吸收了BSD和System V 的优点,同时摒弃了它们的缺点。
n Linux从Unix的各个流派中不断吸取成功经验,模仿Unix的优点,抛弃Unix的缺点。Linux 成为了Unix系列中的佼佼者:高速、健壮、完整,而且抛弃了历史包袱 。
2.2.2 LINUX的常用命令
登录和退出,输入命令,Bash的内部命令,Bash的使用技巧,帮助命令,Bash外部命令,网络命令,文件操作,文本操作,系统权限,打包压缩,设备加载,模块操作,文件与文件名等。(具体指令略)
3 C程序入门
3.1 什么是程序
n 程序(Program)告诉计算机应如何完成一个计算任务.
n 程序由一系列指令(Instruction)组成,指令是指示计算机做某种运算的命令.
3.2 指令分类
n 输入: 从键盘、文件或者其它设备获取数据。
n 输出: 把数据显示到屏幕,或者存入一个文件,或者发送到其它设备。
n 基本运算: 执行最基本的数学运算(加减乘除)和数据存取。
n 测试和分支: 测试某个条件,然后根据不同的测试结果执行不同的后续指令。
n 循环: 重复执行一系列操作。
3.3 编程的本质
n 把复杂的任务分解成子任务,把子任务再分解成更简单的任务,层层分解,直到最后简单得可以用以上所述指令来完成。
编译执行过程
3.4 程序调试
调试中常见的错误:
n 编译时错误
n 运行时错误
n 逻辑错误和语义错误
3.5 C语言初步
(因之前学过,具体内容略,详情见《C程序设计语言》)
4 嵌入式开发环境的搭建
4.1 安装步骤
1.安装虚拟机VMware 7.0
和常规软件安装的方法相同。
注意:如果PC机上带有还原卡或还原软件,不要重启,每次重启系统后要重装,所以最好将还原卡或还原软件卸载。
2.拷贝虚拟机镜像文件ubuntu8.10bak到Windows XP
注意:硬盘的空间足够大
3.将pc机和实验箱的网线和串口线分别连接
注意:
(1)串口线连接在实验箱RS232-0串口上(实验箱上方左侧串口)。
(2)串口不支持热插拔,连接时需要断开电源,至少保证有一方断开电源。
4.打开超级终端设置串口,并开启实验箱电源,启动实验箱系统:
超级终端位置如下:
设置连接名称: 选择串口:
设置串口详细属性如下:
启动电源开关在超级终端可以看到启动信息,如下:
5.开启Linux虚拟机并设置网络
(1) 用VMware打开linux虚拟机。linux虚拟机的用户名:haubo 密码:123456
(2) 打开linux虚拟机桌面上的终端。
(3) 在终端上输入ifconfig以查看linux虚拟机 IP地址。
如果IP地址不为192.168.0.21则需要执行:
sudo ifconfig eth0 192.168.0.21
备注: 命令行中将会提示输入密码,输入123456即可,输入密码时没有回显
(4)查看linux虚拟机的网络和实验箱是否连通
ping 192.168.0.121
如果能ping通,再从实验箱ping linux虚拟机,即在超级终端上执行:
ping 192.168.0.21
注意:如果linux和实验箱不能ping通可能在以下几个方面存在问题:
(1) pc机即windows的IP和实验箱的IP的不是在一个网段,可以将其设置为192.168.0.22
(2) 虚拟机的网络设置不正确
6.挂载linux虚拟机的目录到实验箱的系统上
在超级终端上执行:
mount -t nfs 192.168.0.21:/home/haubo/app /mnt/nfs
查看是否挂载成功,在超级终端上执行:
ls /mnt/nfs
如果有内容,则挂载成功
测试是否挂载成功,在超级终端上执行:
cd /mnt/nfs
ls
./hello
可以在超级终端上看到了hello world的字符串输出,嵌入式linux开发环境搭建完成!
5 串口操作及文件操作
5.1 串口操作
5.1.1串行通讯原理
异步串行I /O 方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O 可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。
?在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
串行通信字符格式:
实用RS-232C 通讯连线:
5.1.2程序分析
头文件
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*linux标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <pthread.h> /*线程库定义*/
打开串口
intfd;
fd= open( "/dev/tts/0", O_RDWR); /*以读写方式打开串口*/
if (-1 == fd){ /* 不能打开串口一*/
perror(" 提示错误!");
}
5.1.3串口设置
?最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置structtermios结构体的各成员值,关于该结构体的定义可以查看
structtermio
{
unsigned short c_iflag; /* 输入模式标志*/
unsigned short c_oflag; /* 输出模式标志*/
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};
5.1.4串口的读写操作
其余的操作(读\写\关闭)和标准文件操作相同
5.2 Linux下文件操作
5.2.1文件I/O操作
?系统调用就是用在程序中调用操作系统所提供的一些子功能。
?指操作系统提供给用户程序的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的特殊服务。
?系统调用并丌直接不程序员迚行交互,它仅仅通过软中断的形式向内核提交请求,以获得内核服务的接口。
?在linux中用户编程接口(API)遵循了在UNIX中最流行的应用编程界面标准—POSIX标准。这些系统调用编程接口主要通过C库(libc)实现的。
?系统命令实际上是可执行程序。
系统调用、API、系统命令的关系:
errno
无论什么时候系统调用失败了,都将errno设置成一组预定义的错误值中的一个.
#include <errno.h>
#include <stdio.h>
void perror(const char *s);
#include <string.h>
char *strerror(interrnum);
5.2.2 UNIX哲学之一:一切皆为文件
1.Linux文件种类:
普通文件
目录文件
链接文件
设备文件
2.文件描述符
文件描述符是一个非负整数,是一个索引值
0 STDIN_FILENO
1 STDOUT_FILENO
2 STDERR_FILENO
包含在<unistd.h>
文件描述符的范围是0 ~ OPEN_MAX
Linux 下OPEN_MAX为1048576
3.不带缓冲的文件I/O操作
(1)open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
intopen(const char *pathname, intflags);
intopen(const char *pathname, intflags, mode_tmode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
·参数含义
?pathname是要打开或创建的文件的名字。
?oflag参数可用来说明此函数的多个选择项。
?mode对于open函数而言,仅当创建新文件时才使用第三个参数。
?以下三个常数中必须指定一个,且仅允许指定一个(这些常数定义在<fcntl.h>头文件中):
?O_RDONLY 只读打开。
?O_WRONLY 只写打开。
?O_RDWR 读、写打开。
·可选项
?以下可选项可以同时指定0个或多个, 和必选项按位或起来作为flags参数。
O_APPEND 每次写时都加到文件的尾端。
O_CREAT 若此文件丌存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果丌存在则创建此文件成为一个原子操作。
O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
O_NONBLOCK 如果p a t h n a m e指的是一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
·必选项
? 第三个参数mode指定文件权限,可以用八迚制数表示,比如0644表示-rw-r--r--,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,详见open(2)的Man Page。要注意的是,文件权限由open的mode参数和当前迚程的umask掩码共同决定。
(2)close
?可用close函数关闭一个打开文件:
?#include <unistd.h>
?intclose (intfiledes);
?返回:若成功为0,若出错为-1
当一个迚程终止时,它所有的打开文件都由内核自劢关闭。很多程序都使用这一功能而丌显式地用c l o s e关闭打开的文件。
(3)read函数
?用r e a d函数从打开文件中读数据
#include <unistd.h>
ssize_tread(intfeledes, void *buff, size_tnbytes) ;
返回:读到的字节数,若已到文件尾为0,若出错为-1。
如r e a d成功,则返回读到的字节数。如已到达文件的尾端,则返回0。
实际读到的字节数少于要求读字节数
·读普通文件时,在读到要求字节数乊前已到达了文件尾端。例如,若在到达文件尾端乊前还有3 0个字节,而要求读1 0 0个字节,则r e a d返回3 0,下一次再调用r e a d时,它将返回0 (文件尾端)。
·当从终端设备读时,通常一次最多读一行。
·当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
(4)write函数
用w r it e函数向打开文件写数据。
#include <unistd.h>
ssize_twrite(intfiledes, const void * buff,
size_tnbytes) ;
返回:若成功为已写的字节数,若出错为-1。
其返回值通常不参数nbytes的值丌同,否则表示出错。w r it e出错的一个常见原因是:磁盘已写满,或者超过了对一个给定迚程的文件长度限制。
·堵塞与非堵塞
?读常规文件是丌会堵塞的,丌管读多少字节,read一定会在有限的时间内返回.
?从终端和网络读则丌一定,如果终端输入丌足一行,read一个终端设备就会堵塞.
?如果在open一个设备时指定了O_NONBLOCK,read和write就丌会堵塞.
?以read为例,如果设备没有数据到达就返回-1,同时置errno位
·非堵塞工作模式
while(1)
{
非堵塞read(设备1);
if(设备1有数据到达)
处理数据;
非堵塞read(设备2);
if(设备1有数据到达)
处理数据;
…
{sleep(n);}
}
6 LED显示
LED编码过程:
unsigned char LEDCODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//这个是10 个数字的编码
·//在这里主要是用到编码的过程
·LEDWORD=(LEDCODE[i]<<8)|LEDCODE[9-i];
·那是因为LEDWORD 是一个16 位的数。我们是需要将两个8 字数码管同时显示,所以将LEDCODE[i]左移8 位,然后再加上个位使得十位和个位同时显示
点阵显示电路:
7 A/D 转换器与直流电机实验
7.1 A/D 转换器
7.1.1 AD转换器的分类
双积分型的A/D 转换器
?逐次逼近型的A/D 转换器
7.1.2 A/D 转换的重要指标
?分辨率(Resolution)
?精度(Accuracy)
7.1.3 ARM 自带的十位A/D
?ARM S3C2410 芯片自带一个8路10 位A/D 转换器,并且支持触摸屏功能。ARM2410 开发板只用作3 路A/D 转换器,其最大转换率为500K,非线性度为正负1.5 位,其转换时间可以通过下式计算:如果系统时钟为50MHz,比例值为49,则为
?A/D 转换器频率=50 MHz/(49+1) = 1 MHz
?转换时间=1/(1 MHz / 5cycles) = 1/200 kHz(相当于5us)= 5 us
7.1.4关键代码分析
static structfile_operationss3c2410_fops = {
owner: THIS_MODULE,
open: s3c2410_adc_open,
read: s3c2410_adc_read,
write:s3c2410_adc_write,
release: s3c2410_adc_release,
};
7.2 直流电机实验
脉冲调制(PWM)变速原理:
PWM信号延迟及信号分配电路:
等效电路: PWM电路中电流和电压波讨论:
8 实习总结
8.1 实习中遇到的问题
从20##年2月28日开始我在太原皓博培训中心实习,实习目的是通过学习LINUX理论进行动手操作,巩固所学的知识,提高处理实际问题的能力,为毕业设计的顺利进行做好充分的准备,并为自己能顺利与社会环境接轨做好准备。
虽然在大三下半学期进行过LINUX的学习,但是在实习中仍旧遇到了问题。也许是因为对之前知识掌握的不够熟练,也许是所学的知识真正有难度,听老师讲的时候觉得没有那么难,但是真正自己动手的时候就发觉难处了。比如在程序中检查问题,似乎比编程序还要难,花费很久也找不出来,一遍一遍的试,甚至有点灰心了。再比如检查仪器连接时,问题总出在很小问题上,必须要认真耐心的一步一步的做,才能找到错误出在哪里。同时,还依赖于同组的同学的合力协作,才能完成每一步的工作。
8.2 实习收获和总结
虽然只有短短三周的实习时间,但是在这时间中有巨大的收获。
首先,在工作中要有良好的学习能力,要有一套学习知识的系统,遇到问题自己能通过相关途径自行解决能力。扎实的专业知识是你提高工作水平的坚实基础.在学校学习专业知识时,可能感觉枯燥无味,但当你工作以后,你才会发现专业知识是多么的重要。
因为在工作中遇到问题各种各样,并不是每一种情况都能把握。在这个时候要想把工作做好一定要有良好的学习能力,通过不断的学习从而掌握相应技术,来解决工来中遇到的每一个问题。这样的学习能力,一方面来自向老师们的学习,向工作经验丰富的人学习。另一方面就是自学的能力,在没有另人帮助的情况下自己也能通过努力,寻找相关途径来解决问题。
其次、良好的人际关系是我们顺利工作的保障。
在工作之中不只是同技术、同设备打交道,更重要的是同人的交往。所以一定要掌握好同事之间的交往原则和社交礼仪。这也是我们平时要注意的。团结协作,善于沟通.团结协作指的是部门内部.你这个部门肯定不止你一个人,作为部门担当,你若想把本部门的事做的出色,那你必须把部门成员团结起来,发挥集体的力量,那样才能事半功倍!善于沟通是指部门之间.任何一个公司都是由众多部门组成的.部门之间的沟通是必要的也是必须的.
另外在工作之中自己也有很多不足的地方。例如:缺乏实践经验,缺乏对相关行业的标准掌握等。所在我常提醒自己一定不要怕苦怕累,在掌握扎实的理论知识的同时加强实践,做到理论联系实际。另一方面要不断的加强学习,学习新知识、新技术更好的为人民服务。
在实习期间,我学到了很多东西,不仅有学习方面的,更学到了很多做人的道理,对我来说受益非浅。我学会了如何更好地与别人沟通,如何更好地去陈述自己的观点,如何说服别人认同自己的观点。相信这些宝贵的经验会成为我今后成功的最重要的基石。实习是每一个大学毕业生必须拥有的一段经历,它使我们在实践中了解社会,让我们学到了很多在课堂上根本就学不到的知识,也打开了视野,增长了见识,为我们以后更好地服务社会打下了坚实的基础。这次实习生活,对我而言有着十分重要的意义。它不仅使我在理论上对LINUX这个领域有了全新的认识,而且在实践能力上也得到了提高,真正地做到了学以致用。在一次次理论与实践相结合的过程中,在老师们悉心指导下,我不但对LINUX有了系统的理解,从无数次的失败中吸取了宝贵的经验教训,而且随着时间的推移,自己的意志也得到了磨练,恐惧心理也逐渐地消失了。我时刻提醒自己,唯有不断努力,才能与时俱进。总之,这次实习的意义,对我来说已不再是完成学分、完成毕业实习的任务,而是在开启“生命之旅”大门的过程中迈出了第一步。我一定会好好地珍惜这个机会,并为自己所喜爱的电子科技努力贡献自己的聪明才智。
以前作为一名学生,主要的工作是学习;现在即将踏上社会,显然,自己的身份就有所变化,自然重心也随之而改变,现在我的主要任务应从学习逐步转移到工作上。从学生过渡到上班族,是十分关键的阶段。回想自己在这期间的工作情况,不尽如意。对此我思考过,学习经验自然是一个因素,然而更重要的是心态的转变没有做到位。现在发现了这个不足之处,应该还算是及时吧,因为我明白了何谓工作。在接下来的日子里,我会朝这个方向努力,我相信自己能够把那些不该再存在的“特点”抹掉。感谢老师和同学在这段时间里对我的指导和帮助,我从中受益非浅。
通过这次毕业实习,把自己在学校学习的到理论知识运用到社会的实践中去。一方面巩固所学知识,提高处理实际问题的能力。另一方面为顺利进行毕业设计做好准备,并为自己能顺利与社会接轨做好准备。毕业实习是我们从学校走向社会的一个过渡,它为我们顺利的走出校园,走向社会为国家、为人民更好服务做好了准备。