北邮嵌入式实验报告

合集下载

邝坚_北邮嵌入式实验报告

邝坚_北邮嵌入式实验报告

嵌入式系统期末实验一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、RTOS 及强实时嵌入式系统软件设计规范的基础上,构建自己的实时系统软件框架基本功能,并在其上自拟应用(如部分模拟TCP 的C/S两端通信流程),测试软件框架的相关功能。

环境:VxWorks 的VxSim 仿真环境或2440(ARM920T)内容:必选功能:1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;2. 支持消息驱动模式的软定时器的机制;3. Task 启动同步功能;4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威胁。

可选功能(加分):其它有利于实时处理的有效机制,如:无信号量(互斥)支持的临界资源访问方式,zero copy 等;二、实现的功能1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;STATUS Task(){Initialization(MBox, Data Structure, Timer, etc.)Forever{MsgReceiveIf(…){……}else if(…){……}……}}typedef struct _MESSAGE{int mType; /* 消息类型 0:timer->client*1:client->server 2:server->client*/int mSendId; /* 发送任务的MESSAGE ID */int mRecvId; /* 接收任务的MESSAGE ID */int mData; /* 消息中传递的数据 */}MESSAGE;2. 支持消息驱动模式的软定时器的机制;/* timer(id)向客户端消息队列定时发送的定时器*/STATUS timer(int id){MESSAGE* txMsg;/* 用于从消息队列中接收消息 */int tick;/*创建一个定时,用于提醒发送者任务定时发送消息*/tick=sysClkRateGet();semTake(semSynStart,WAIT_FOREVER);FOREVER{taskDelay((int)(tick*DELAY_SECOND));txMsg = (MESSAGE*)memMalloc(MAX_MSG_LEN);txMsg->mType = 0;txMsg->mSendId = MID_TIMER(id);txMsg->mRecvId = MID_CLIENT(id);txMsg->mData = 0;printf("tTimer%d send message to tClient%d!\n",id,id);if(msgQSend(msgQIdClient[id],(char*)&txMsg,MAX_MSG_LEN,WAIT_FOREVER,MSG_ PRI_NORMAL) == ERROR ){return (ERROR);}}return (OK);}3. Task 启动同步功能;由manager()创建的任务优先级最高,先创建timer()、server()、client()的任务,让他们都在等待信号量semSynStart而被阻塞,最后创建manager()的任务,占据CPU,等待其他所有任务都被阻塞,解锁所有等待信号量的任务,让它们同时启动。

嵌入式实验报告总结

嵌入式实验报告总结

嵌入式实验报告总结嵌入式实验报告总结近年来,嵌入式系统在各个领域中得到了广泛的应用。

嵌入式系统是指将计算机系统嵌入到其他设备或系统中,以实现特定功能的一种计算机系统。

在本次嵌入式实验中,我深入学习了嵌入式系统的原理和应用,并通过实际操作,加深了对嵌入式系统的理解。

实验一:嵌入式系统的基本概念和发展历程在本实验中,我们首先了解了嵌入式系统的基本概念和发展历程。

嵌入式系统的特点是紧凑、高效、实时性强,并且适用于各种各样的应用场景。

通过学习嵌入式系统的发展历程,我们了解到嵌入式系统在不同领域的应用,如智能家居、医疗设备、汽车电子等。

这些应用领域的嵌入式系统都有着各自的特点和需求,因此在设计嵌入式系统时需要根据具体应用场景进行优化。

实验二:嵌入式系统的硬件平台与软件开发环境在本实验中,我们学习了嵌入式系统的硬件平台和软件开发环境。

硬件平台是嵌入式系统的基础,包括处理器、内存、外设等。

而软件开发环境则提供了开发嵌入式系统所需的工具和库函数。

我们通过实际操作,搭建了嵌入式系统的硬件平台,并使用软件开发环境进行程序的编写和调试。

通过这个实验,我深刻理解了硬件平台和软件开发环境对嵌入式系统的影响,以及它们之间的协同工作。

实验三:嵌入式系统的实时操作系统在本实验中,我们学习了嵌入式系统的实时操作系统。

实时操作系统是嵌入式系统中非常重要的一部分,它能够保证系统对外界事件的响应速度和可靠性。

我们通过实际操作,学习了实时任务的创建和调度,以及实时操作系统的中断处理机制。

实时操作系统的学习让我更加深入地了解了嵌入式系统的实时性要求和相关的调度算法。

实验四:嵌入式系统的通信与网络在本实验中,我们学习了嵌入式系统的通信与网络。

嵌入式系统通常需要与其他设备或系统进行通信,以实现数据的传输和共享。

我们学习了嵌入式系统的通信协议和网络协议,如UART、SPI、I2C、TCP/IP等。

通过实际操作,我掌握了这些通信和网络协议的使用方法,以及在嵌入式系统中如何进行数据的传输和处理。

北邮嵌入式实验报告

北邮嵌入式实验报告

北京邮电大学嵌入式系统开发实验报告学院:班级:姓名:学号:序号:目录一、实验目的 (1)二、实验设备 (1)三、基础实验(实验一~实验七) (1)1.实验五 (1)2.实验六 (1)3.实验七 (1)四、驱动程序 (5)1.设备驱动程序的概念 (5)2.驱动程序结构 (6)3.设备注册和初始化 (7)4.设备驱动程序的开发过程 (8)五、基本接口实验 (8)1.实验十二简单设备驱动程序 (9)2.实验十三CPU GPIO驱动程序设计 (9)3.实验十四中断实验 (10)4.实验十五数码管显示实验 (12)5.实验十六LED点阵驱动程序设计 (19)6.实验十七AD驱动实验 (23)7.实验十八DA驱动实验 (26)六、实验中遇到的问题及解决方法 (30)七、实验总结及心得 (31)一、实验目的通过实验熟悉Linux环境,并掌握一些基本接口驱动的写法和用C语言编写简单的实验程序。

学习LINUX开发环境的搭建,通讯配置等。

并熟练掌握LINUX驱动程序的编写及开发流程。

对嵌入式系统有进一步的了解。

二、实验设备1.一套PXA270EP嵌入式实验箱2.安装Redhat9的宿主PC机,并且配置好ARM Linux的开发环境三、基础实验(实验一~实验七)实验一~七为基础实验,目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的HelloWorld程序进行测试。

由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。

1.实验五实验五为宿主PC机配置了TFTP服务。

TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。

在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。

2.实验六实验六为宿主PC机配置了NFS服务。

NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。

嵌入式实验四实验报告

嵌入式实验四实验报告

嵌入式实验四实验报告实验四:嵌入式编程设计
实验设计目的:
1. 学习使用嵌入式开发工具进行编程设计;
2. 学习使用C语言编写嵌入式程序;
3. 学习使用GPIO模块进行输入输出;
4. 学习使用中断处理函数。

实验器材:
1. 嵌入式开发板;
2. USB数据线;
3. 电脑;
4. LED灯;
5. 电阻;
6. 蜂鸣器;
7. 其他必要的电路元件。

实验步骤:
1. 连接开发板和计算机,安装开发板驱动程序;
2. 打开嵌入式开发工具,创建一个新的工程;
3. 在工程中添加一个C文件,编写程序;
4. 编写程序实现以下功能:
- 使用GPIO模块控制LED灯的亮、灭;
- 使用GPIO模块读取按键状态;
- 使用GPIO模块控制蜂鸣器的开、关;
- 使用Timer模块计时;
- 使用中断处理函数处理外部中断;
- 其他必要的功能;
5. 编译程序,下载到开发板;
6. 运行程序,测试功能是否正常。

实验结果与分析:
实验结果应当是LED灯、蜂鸣器、按键正常工作,可以通过按键控制LED灯的亮、灭、蜂鸣器的开、关。

实验总结:
通过本次实验,我学会了使用嵌入式开发工具进行编程设计,掌握了使用C语言编写
嵌入式程序的方法。

通过实验,我深入理解了嵌入式系统的原理和实现方法,对嵌入
式系统的应用有了更加深入的了解。

在今后的学习和工作中,我将能够更好地运用嵌
入式技术解决实际问题。

嵌入式系统地七次实验报告_2011011172_房庆

嵌入式系统地七次实验报告_2011011172_房庆

中国石油大学(北京)嵌入式系统实验报告班级:计算机13-1学号:2011011172姓名:房庆日期:2015 年4月13 日第四章实验4 Linux驱动程序的编写一、实验目的1.掌握Linux驱动程序的编写方法2.掌握驱动程序动态模块的调试方法3.掌握驱动程序添加到内核的方法二、实验内容1.学习Linux驱动程序的编写流程2.学习驱动程序动态模块的调试方法3.学习驱动程序添加到内核的流程三、实验设备1.PentiumII以上的PC机、Linux操作系统、EL-ARM830+实验箱四、实验步骤1.改写helloworld.c程序:内核头文件与C语言标准头文件有所不同,为实现内核驱动程序在终端输出helloworld 需要进行如下几项修改:a.头文件:内核头文件与标准C不同,需引用的头文件如下:b.宏定义:在module.h中定义了有关于内核版本的宏,为避免显示内核版本错误,在文件开头前定义宏常量,详细定义如下:c.程序入口出口:内核程序入口不再是main,出口也不是return,而是一对成对出现的module_init和module_exit,其声明与定义方式如下,声明为static是为了增强内核驱动稳定性。

d.打印字符串:如上图打印字符串采用的为printk函数,在init函数汇总,字符串开头为<0>,是为了设置较高优先级,可以在终端打印出字符串。

如果优先级较低会输出到日志文件中。

e.编译:本程序在虚拟机编译采用gcc –c helloworld.c对的格式,生成helloworld.o的文件。

.o类型的文件才能加载到内核中。

改写之后的完整程序如下:其中,MODULE_LICENSE("GPL");中的"GPL"是指明了这是GNU General Public License的任意版本。

如果不声明会显示no license的如下Warning信息:其他MODULE_的声明如下:MODULE_AUTHOR // 声明作者MODULE_DESCRIPTION // 对这个模块作一个简单的描述,这个描述是"human-readable"的MODULE_VERSION // 这个模块的版本MODULE_ALIAS // 这个模块的别名MODULE_DEVICE_TABLE // 告诉用户空间这个模块支持什么样的设备2.在虚拟机环境下,正常编译通过且无警告后生成helloworld.o文件。

嵌入式实训课实验报告

嵌入式实训课实验报告

一、实验背景嵌入式系统在现代工业、消费电子、智能家居等领域扮演着越来越重要的角色。

为了让学生深入了解嵌入式系统的设计原理和开发过程,提高学生的实践能力和创新精神,我们开设了嵌入式实训课程。

本次实验报告将针对实训课程中的部分实验进行总结和分析。

二、实验目的1. 掌握嵌入式系统的基本原理和开发流程。

2. 熟悉嵌入式开发工具和环境。

3. 熟练使用C语言进行嵌入式编程。

4. 学会调试和优化嵌入式程序。

三、实验内容本次实训课程共安排了五个实验,以下是每个实验的具体内容和实验步骤:实验一:使用NeoPixel库控制RGB LED灯带1. 实验目的:学习使用NeoPixel库控制RGB LED灯带,实现循环显示不同颜色。

2. 实验步骤:(1)搭建实验平台,连接NeoPixel LED灯带。

(2)编写程序,初始化NeoPixel库,设置LED灯带模式。

(3)通过循环,控制LED灯带显示不同的颜色。

实验二:使用tm1637库控制数码管显示器1. 实验目的:学习使用tm1637库控制数码管显示器,显示数字、十六进制数、温度值以及字符串,并实现字符串滚动显示和倒计时功能。

2. 实验步骤:(1)搭建实验平台,连接tm1637数码管显示器。

(2)编写程序,初始化tm1637库,设置显示模式。

(3)编写函数,实现数字、十六进制数、温度值的显示。

(4)编写函数,实现字符串滚动显示和倒计时功能。

实验三:使用ds18x20库和onewire库读取DS18B20温度传感器的数据1. 实验目的:学习使用ds18x20库和onewire库读取DS18B20温度传感器的数据,并输出温度值。

2. 实验步骤:(1)搭建实验平台,连接DS18B20温度传感器。

(2)编写程序,初始化ds18x20库和onewire库。

(3)编写函数,读取温度传感器的数据,并输出温度值。

实验四:使用ESP32开发板连接手机热点,并实现LED1作为连接指示灯1. 实验目的:学习使用ESP32开发板连接手机热点,并通过LED1指示灯显示连接状态。

嵌入式技术及应用实验中断实验报告

嵌入式技术及应用实验中断实验报告

实验步骤与结果分析1、建立工程1)、在工程文件中包含如下文件(int、doc、user、lib、start)2)、选择STM32F103VB芯片3)、分别添加如下文件2、运行过程(1) 使用Keil uVision3 通过ULINK仿真器连接EduKit-M3实验平台,打开实验例程NVIC_test子目录下的NVIC.Uv2例程,编译链接工程;(2) 点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接EduKit-M3实验平台并下载调试代码到目标系统的RAM中;(3) 程序正常启动运行后,会有以下结果:当第一次发生EXTI9 中断后(按下EduKit-M3实验平台上Key按钮),SysTick 中断的优先级比EXTI0中断优先级高。

因此当EXTI0中断发生时(按下Wakeup按钮),将先执行主要程序代码分析/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);主从优先级的选择Group_1,有先占优先级1位,从优先级3位//配置一个比特为抢占优先级/* Enable the EXTI0 Interrupt */ //使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;主优先级的选择PreemptionPriorityValueNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级等于0.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable the EXTI9_5 Interrupt */ //使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Configure the SysTick Handler Priority: Preemption priority and sub priority */ //配置SysTick处理程序优先级:抢占优先级和子优先级NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, !PreemptionPriorityValue, 0);while (1){if(PreemptionOccured != FALSE)//当PreemptionOccured != FALSE)抢占发生{GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));Delay(0x5FFFF);}}void GPIO_Configuration(void){/* Configure PC6, PC7, PC8 and PC9 as output push-pull */ 使能为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //使能其速度为50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //使能为推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);/* Configure GPIOA Pin0 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure GPIOB Pin9 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为推挽输出入GPIO_Init(GPIOB, &GPIO_InitStructure);}GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);/* Configure EXTI Line0 to generate an interrupt on falling edge */ 配置EXTI Line0产生一个中断在下降沿EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);(写不完时,可调整表结构。

北邮研究生嵌入式系统实验课程——第4-2节 VxWorks任务间通信

北邮研究生嵌入式系统实验课程——第4-2节 VxWorks任务间通信

创建信号量
SEM_ID semBCreate( options, initialState)
– Options 为阻塞在该信号量的任务规定排队的类 型(SEM_Q_PRIORTY或SEM_Q_FIFO) – initialState 初始化信号量为可用(SEM_FULL)或 不可用(SEM_EMPTY)
VxWorks提供三种类型的信号量
–二进制信号量:最快和常用的信号量,提供阻塞方式,用 于实现同步或互斥 –互斥信号量:用于实现互斥问题的特殊的二进制信号量, 解决具有互斥、优先级继承、删除安全和递归等情况 –计数信号量:类似于二进制信号量,记录信号量被释放的 次数。适合于一个资源的多个实例需要保护的情况
LOCAL SEM_ID fooBinSemId, fooMutexId; LOCAL FOO_BUF fooBuffer; fooSet(); 互斥信号量 … 共享内存 fooGet(); …
链表
lstLib库提供对双向链表进行操作的函数
List Descriptor Header Tail User node1 User node2 NODE
任务锁的使用
taskLock()/taskUnlock()
– 禁止所有其它任务执行 – 当非常频繁地做某事时使用 – 注意要保持critical region短
funcA () {
taskLock (); . . /* critical region of code that cannot be interrupted */ . taskUnlock ();
等待事件的任务调用semTake(),并一直阻塞 到得到信号量 检测到事件的任务或中断调用semGive();解锁 了等待事件的任务
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京邮电大学嵌入式系统开发实验报告学院:班级:姓名:学号:序号:目录一、实验目的 (1)二、实验设备 (1)三、基础实验(实验一~实验七) (1)1.实验五 (1)2.实验六 (1)3.实验七 (1)四、驱动程序 (5)1.设备驱动程序的概念 (5)2.驱动程序结构 (6)3.设备注册和初始化 (7)4.设备驱动程序的开发过程 (8)五、基本接口实验 (8)1.实验十二简单设备驱动程序 (9)2.实验十三CPU GPIO驱动程序设计 (9)3.实验十四中断实验 (10)4.实验十五数码管显示实验 (12)5.实验十六LED点阵驱动程序设计 (19)6.实验十七AD驱动实验 (23)7.实验十八DA驱动实验 (26)六、实验中遇到的问题及解决方法 (30)七、实验总结及心得 (31)一、实验目的通过实验熟悉Linux环境,并掌握一些基本接口驱动的写法和用C语言编写简单的实验程序。

学习LINUX开发环境的搭建,通讯配置等。

并熟练掌握LINUX驱动程序的编写及开发流程。

对嵌入式系统有进一步的了解。

二、实验设备1.一套PXA270EP嵌入式实验箱2.安装Redhat9的宿主PC机,并且配置好ARM Linux的开发环境三、基础实验(实验一~实验七)实验一~七为基础实验,目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的HelloWorld程序进行测试。

由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。

1.实验五实验五为宿主PC机配置了TFTP服务。

TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。

在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。

2.实验六实验六为宿主PC机配置了NFS服务。

NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。

当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。

每次重启宿主PC机时,都须先输入命令:service nfs restart,以启动nfs服务。

3.实验七实验七通过用c语言编写的简单程序HelloWorld,测试前面几个实验是否成功配置好环境,从超级终端可以看到HelloWorld程序的运行结果。

实验步骤如下:1)硬件连接:连接宿主PC 机和一台PXA270-RP目标板。

2)打开宿主PC 机电源,进入Linux操作系统。

3)启动RedHat 9.0 的图形界面,如下图,若您是以root 身份登陆在文本模式下,则输入命令startx启动图形界面。

进入RedHat 9.0 图形界面后,打开一个终端窗(Terminal)。

4)输入minicom然后回车,minicim设置为115200 8NI无流控。

5)打开PXA270_RP目标板电源,按目标板上的BOOT键,在minicom中应该会看到如下图:6)在minicom终端窗口中,如图,输入下列四条命令rootifconfig eth 192.168.0.50 upmount -o nolock 192.168.0.100:/ /mntcd /mnt此时,先将该窗口最小化,在后面的第10 操作步骤中还将会回到该窗口中进行操作。

7)宿主机上打开一个终端窗口(Terminal),点击【红帽/SystemTools/Terminal】启动终端窗口,输入下列4 条命令:①cd /home②mkdir HW③cd HW④vi HelloWorld.c /*请您输入程序7.1 程序清单*/此时会显示一个空白的屏幕,这条命令的含义是,使用Vi 编辑器,对一个名叫HelloWorld.c的文件进行编辑,我们看到的空白窗口是对文件进行编辑的窗口,如下图。

就像在Windows系统下面使用写字板等一样道理。

在vi 里面先单击键盘 A 键,然后左下角会变成—INSER。

输入程序的时候和其他编辑器是一样的,如下图。

当输入程序完毕后,单击键盘Esc 键,然后按“:”(冒号)此时左下角会出现冒号然后输入“wq”最后按“Enter”确认存盘退出vi 编辑器,如下图。

8)在上面同一个终端窗口中,输入下列2 条命令交叉编译HelloWorld.c源程序,并查看生成的.o 目标文件,如图7-10,图7-11:①arm-linux-gcc–oHelloWorldHelloWorld.c②ls等到再次出现提示符,代表程序已经正确编译。

如果此步出现错误信息,请查看错误信息,并且重新编辑原来的C文件,修改错误。

直到正确编译。

9)重新打开第7 步最小化的开有minicom的终端窗口,即到PXA270-RP目标板的mnt目录下,请您输入下列 3 条命令,运行HelloWorld编译成功的HelloWorld目标程序:①cd home/HW /*回到minicom中目标板的/mnt/home/HW目录下*/②ls③./ HelloWorld /*此时会看到如下图*/四、驱动程序1.设备驱动程序的概念设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。

驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:对设备初始化和释放;对设备进行管理,包括实时参数设置,以及提供对设备的操作接口;读取应用程序传送给设备文件的数据或者回送应用程序请求的数据;检测和处理设备出现的错误。

Linux操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作。

对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。

这意味着:由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。

应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。

打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。

设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。

其中类型和主设备号结合在一起惟一地确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。

由于Linux 中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括open()、read()、write()、ioctl()、close()等。

应用程序发出系统调用命令后,会从用户态转到核心态,通过内核将open()这样的系统调用转换成对物理设备的操作。

2.驱动程序结构一个设备驱动程序模块的基本框架在系统内部,I/O设备的存取通过一组固定的入口点来进行,入口点也可以理解为设备的句柄,就是对设备进行操作的基本函数。

字符型设备驱动程序提供如下几个入口点:open入口点。

打开设备准备I/O操作。

对字符设备文件进行打开操作,都会调用设备的open入口点。

open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。

如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。

close入口点。

关闭一个设备。

当最后一次使用设备完成后,调用close子程序。

独占设备必须标记设备方可再次使用。

read入口点。

从设备上读数据。

对于有缓冲区的I/O操作,一般是从缓冲区里读数据。

对字符设备文件进行读操作将调用read子程序。

write入口点。

往设备上写数据。

对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。

对字符设备文件进行写操作将调用write子程序。

ioctl入口点。

执行读、写之外的操作。

select入口点。

检查设备,看数据是否可读或设备是否可用于写数据。

select 系统调用在检查与设备文件相关的文件描述符时使用select入口点。

3.设备注册和初始化设备的驱动程序在加载的时候首先需要调用入口函数init_module(),该函数最重要的一个工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册。

register_chrdev的定义为:intregister_chrdev(unsigned int major, const char *name, struct file_ operations *fops);其中,major是为设备驱动程序向系统申请的主设备号,如果为0,则系统为此驱动程序动态分配一个主设备号。

name是设备名,fops是对各个调用的入口点说明。

此函数返回0时表示成功;返回-EINVAL,表示申请的主设备号非法,主要原因是主设备号大于系统所允许的最大设备号;返回-EBUSY,表示所申请的主设备号正在被其他设备程序使用。

如果动态分配主设备号成功,此函数将返回所分配的主设备号。

如果register_chrdev()操作成功,设备名就会出现在/proc/dvices文件中。

Linux在/dev目录中为每个设备建立一个文件,用ls–l命令列出函数返回值,若小于0,则表示注册失败;返回0或者大于0的值表示注册成功。

注册以后,Linux 将设备名与主、次设备号联系起来。

当有对此设备名的访问时,Linux通过请求访问的设备名得到主、次设备号,然后把此访问分发到对应的设备驱动,设备驱动再根据次设备号调用不同的函数。

当设备驱动模块从Linux内核中卸载,对应的主设备号必须被释放。

字符设备在cleanup_ module()函数中调用unregister_chrdev()来完成设备的注销。

unregister_chrdev()的定义为:intunregister_chrdev(unsigned int major, const char *name);包括设备注册在内,设备驱动的初始化函数主要完成的功能是有以下5项。

(1)对驱动程序管理的硬件进行必要的初始化。

对硬件寄存器进行设置。

比如,设置中断掩码,设置串口的工作方式、并口的数据方向等。

(2)初始化设备驱动相关的参数。

一般说来,每个设备都要定义一个设备变量,用以保存设备相关的参数。

在这一步骤里对设备变量中的项进行初始化。

(3)在内核注册设备。

调用register_chrdev()函数来注册设备。

(4)注册中断。

如果设备需要IRQ支持,则要使用request_irq()函数注册中断。

相关文档
最新文档