第一篇:嵌入式Linux应用开发(中断实验指导)
嵌入式Linux应用开发
——中断按键点亮LED实验
一、中断控制设计流程
<1>由中断控制器汇集各类外设发出的中断信号,然后向CPU发出处理请求。
<2>CPU保存当前程序的运行环境,调用中断服务程序(ISR,Interrupt Service Rout)处理这些中断。
<3>在ISR中通过读取中断控制器、外设相关寄存器来识别当前中断是哪个中断,并进行相应处理。
<4>清除中断:通过读写中断控制器和外设的相关寄存器来实现。
<5>最后恢复被中断程序的运行环境(即前面保存的各个寄存器等),继续执行。
二、程序设计组成框架
程序由head.s、init.c、interrupt.c、makefile四个程序模块组成head.s:初始化,设置中断模式、系统模式的栈,设置中断处理函数,设置
各类异常的向量地址。
init.c: 关看门狗(WATCHDOG),否则CPU会不断重启。初始化LED、初始化外部中断、使能外部中断、设置外设中断的触发方式。interrupt.c:设计代码根据识别出来的中断(即按键)点亮LED,然后清除
中断。写上主函数,主函数只是个不做任何工作的无限循环。Makefile: Linux中使用make命令编译程序以提高编译效率,makefile既是
make所要执行的命令。
三、程序设计结果
将所编写程序通过H-JTAG烧写到实验箱中观察结果,按下按键,LED亮;再次按下按键,LED灭,循环往复。
第二篇:嵌入式linu学习心得
嵌入式Linux学习心得
1、Linux命令
ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录
cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息
mkdir:创建目录
fdisk: 查看硬盘分区信息,-l以列表方式查看
->代表是链接文件,类似window下的快捷方式。
cp: 复制命令,例子cp 文件名 /home/dir/
mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d
man:查看某个命令的帮助,man 命令
2、各系统目录的功能
drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。
/boot/gruff.conf: 启动引导程序
/dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。
/home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。
/lost+found:系统意外终止,存放一些可以找回的文件。
/mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如
果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d
/opt:用户安装的应用程序
/proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息
对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。
/sbin: 系统管理的一些工具。如poweroff关机工具。
/usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码
/var:存放是临时变量
3、
第三篇:嵌入式开发工程师
任职要求:
1、大学本科及以上学历,2年以上工作经验,计算机电子通讯类专业毕业;
2、能够熟练使用POWER PCB或PROTEL或ORCAD等电路设计软件进行PCB设计;
3、熟悉电子元器件,能独立设计数字及模拟电路,拥有单片机开发工作经验,懂得RF433无线及红外遥控等相关知识;
4、熟练使用C语言,有嵌入式开发工作开发及智能家居防盗报警产品经验者优先。
岗位职责:
1、新产品项目设计开发工作;
2、为相关部门及项目提供技术支持;
3、产品售后返修分析,品质不断提升性能改进;
4、组织对新研发产品的制样、验证、试产、量产等工作的确认与审核。
第四篇:嵌入式实验总结
如今,嵌入式系统已经在众多电气电子产品上应用,有人预测今后5年发展形势看好。嵌入式是典型的交叉学科,电信、电子、电气、计算机、通信等等都有涉及。
嵌入式理论、实践要求多、门槛高,只有理论、实践同步才能在积累中更好的渐次掌握,这学期我们针对嵌入式入门做了一些实验,通过自己动手和实验箱、实验软件打交道,对嵌入式编程形成初步了解,为今后进一步发展打基础。
实验环境:
武汉创维特公司JXARM9-2410开发板、PC;
Linux、windows操作平台;
DNW、VMwareWorkstation应用软件;
《ARM9嵌入式技术及Linux高级实践教程》、实验参考资料等;
实验内容及目标:
阅读样例程序,进行:
1.熟悉JXARM9-2410开发板、相关应用软件的使用,能成功运行示例实验程序(demo-led);
2.使用VMware,修改demo-led源程序,使开发板上数码管按照demo-led显示方式显示;
3.使用VMware、DNW,修改相关源程序,实现开发板键盘输入的字符在DNW中显示;
4.使用VMware、DNW,修改相关源程序,实现对直流电机转动状态的控制;
观看教学视频,进行交叉编译:
1.加载linux内核;
2.配置、编译linux内核;
3.Windows、linux跨平台文件共享;
4.编译、运行linux程序(helloworld)
5.Linux下编译数码管显示驱动程序;
6.Linux下编译摄像头、GPRS驱动程序;
学习嵌入式是一个漫长的过程,学好它还是需要一番的功夫。通过嵌入式实验由浅入深的动手实践,我渐渐对嵌入式有了具体概念,也逐渐对其产生了兴致和好奇心。
对于初学者,还有一点小建议,不要好高骛远,要脚踏实地.
第五篇:嵌入式实验二
1.实验二:利用中断实现 OLED 动态显示实验
1.1 实验名称
1.2 实验目的
(1)深入学习、理解、掌握 OLED 字符显示方法
(2)深入学习、理解、掌握 OLED 图形显示方法(3)学习、理解、掌握中断使用方法
1.3 实验过程与分析
1.3.1 回答实验报告中的实验问题
(1)ISR是什么?简述一下中断的作用和使用方法
答:ISR是中断服务程序。作用是通过处理器执行事先编好的某个特定的程序。使用方法就是在main中写一个中断程序,然后在startup.s中进行注册。
(2)嵌入式系统中有哪些应用有定时性循环处理的要求?举几个例子
答:在各种网络的应用中,设计的一些部件,如计数器,时钟等。
(3)定时时间间隔如何修改?
(4)选作内容5-8的编程思路是什么?若做的话应该怎样实现? 答:编程思路:先画直线和竖线,组成一个正方形,将各个参数填写到函数答:通过改变SysTickPeriodSet(SysCtlClockGet()/100)后面的100这个参数。
RIT128x96x4ImageDraw(buf,,);
第6个选作:判断画的原点x,原点y,和画原点x+的长,画原点y+画宽的值要在0-128和0-96。
第7个选作:把RIT128x96x4StringDraw(“hello”,,);就是把画的灰度定义为一个变量x。最后就会出现由不同的亮度而形成的波浪。
第8个就是利用随机函数产生画的原点,随机的在屏幕上进行显示。
(5)拖影现象如何解决?计数值显示为什么没有拖影? 答:在程序结束后执行清屏语句:计数显示是每次重新赋值,所以不会出现拖影。
1.3.2 实验中遇到的问题及解决方法
(1)字符和下方横线,从左至右移动,无法同时到达
通过最大宽度128除以阀值,调整了字符和横线的速度,解决(2)附加字符循环移动,移动到一半,不见了
查看函数排错,得以解决
(3)基本问题做完时,字符显示完整,添加附加任务后,字符显示不全
未解决...1.4实验结果总结 实验结果(附照片)
总结(自己的收获)1.5心得体会
#include
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf2[] = {
0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 };unsigned char buf3[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf4[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf5[] = {
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf6[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf7[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf8[] = {
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };
unsigned char r1[] = {
0xff,0xff };unsigned char r2[] = {
0xf0,0x0f };unsigned char r3[] = {
0xf0,0x0f };unsigned char r4[] = {
0xff,0xff };
unsigned char c1[] = {
0x0f,0xf0 };unsigned char c2[] = {
0xf0,0x0f };unsigned char c3[] = {
0xf0,0x0f };unsigned char c4[] = {
0x0f,0xf0 };void SysTick_Handler(void){ Event = 1;} void printX(){ }
int main(){
int count = 0,i,Light=0,x=0,z=0,y=0,zz=0,yy=0,c=0,cc=0,a=0,aa=0;unsigned char buf[5];
//存(数字)字符串
unsigned char name[20] = “";unsigned char number[20] = ”“;SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ);RIT128x96x4Init(1000000);RIT128x96x4Clear();
串
SysTickPeriodSet(SysCtlClockGet()/ 10);
//调频率
SysTickEnable();SysTickIntEnable();while(1){
if(Event){
RIT128x96x4Clear();
Event = 0;
sprintf(buf,”%3i“,count);
//通过sprintf将数字转换为字符
| if(Light >= 15)
{
Light=0;
} else {
Light++;} RIT128x96x4StringDraw(name, 50, 55, 15-Light);RIT128x96x4StringDraw(number, 50, 65, Light);sprintf(buf,”%d",count);;RIT128x96x4StringDraw(buf, 50, 75, 12);
count++;if(count>=200){
count=0;} RIT128x96x4ImageDraw(buf2,(int)(x*0.50), 5, 20, 1);RIT128x96x4ImageDraw(buf3,(int)(x*0.50), 7, 20, 1);RIT128x96x4ImageDraw(buf4,(int)(x*0.50), 9, 20, 1);RIT128x96x4ImageDraw(buf5,(int)(x*0.50), 11,20, 1);RIT128x96x4ImageDraw(buf6,(int)(x*0.50), 13, 20, 1);RIT128x96x4ImageDraw(buf7,(int)(x*0.50), 15, 20, 1);RIT128x96x4ImageDraw(buf8,(int)(x*0.50), 17, 20, 1);RIT128x96x4ImageDraw(buf1, 0, 20,(int)(x*0.60), 1);RIT128x96x4ImageDraw(c1,(int)(60+c*1.20),(int)(5+a*0.85), 4, 1);RIT128x96x4ImageDraw(c2,(int)(60+c*1.20),(int)(7+a*0.85), 4, 1);RIT128x96x4ImageDraw(c3,(int)(60+c*1.20),(int)(9+a*0.85), 4, 1);RIT128x96x4ImageDraw(c4,(int)(60+c*1.20),(int)(11+a*0.85), 4, 1);RIT128x96x4ImageDraw(r1,(int)(z*0.30),(int)(50+y*0.20), 4, 1);RIT128x96x4ImageDraw(r2,(int)(z*0.30),(int)(52+y*0.20), 4, 1);RIT128x96x4ImageDraw(r3,(int)(z*0.30),(int)(54+y*0.20), 4, 1);RIT128x96x4ImageDraw(r4,(int)(z*0.30),(int)(56+y*0.20), 4, 1);if(x<=200&&x>=0)
//直线 {
x++;} if(x>=200){
x=0;} if(c<=50&&c>=-50)
//圆形循环 {
if(cc==0)c++;
if(cc==1)c--;} if(c>=50){
cc=1;} if(c<=-50){
cc=0;} if(a<=100&&a>=0){
if(aa==0)a++;
if(aa==1)a--;} if(a>=100){
aa=1;} if(x<=0){
aa=0;} if(y<=200&&y>=0){
if(yy==0)y++;
if(yy==1)y--;} if(y>=200){
yy=1;} if(y<=-200){
yy=0;} if(z<=400&&z>=0){
if(zz==0)z++;
if(zz==1)z--;} if(z>=400){
zz=1;} if(z<=0){
//矩形反弹
}
zz=0;
} } } return 0;