当前位置:文档之家› ARM裸机驱动开发说明书

ARM裸机驱动开发说明书

ARM裸机驱动开发说明书
ARM裸机驱动开发说明书

附件1:

学号:

实验设计说明书

题目ARM裸机驱动

学院计算机科学与信息工程学院

专业计算机科学与信息技术

班级12嵌入式

学生姓名古应波、卢圣

指导教师朱超平

2015年6月10日

写在前面

本文档以ARM9(三星2410/2440)为平台,介绍了如何实现裸机驱动程序的编写。初次接触裸机程序,感觉什么都是一头雾水,由于对硬件的不熟悉,所以前期花了很多时间来熟悉S3C2440的硬件原理图,初步熟悉了硬件原理之后,发现其实简单的逻辑驱动程序开发并不是很难。学习就应该这样,循序渐进。把一步步把简单的东西弄懂了,便没有复杂的了,所谓水到渠成。这篇文章是面对初学者的,把很多问题简化了。希望对刚接触ARM裸机程序开发的同学有所帮助。

由于时间和技术的限制,程序还存在不少bug,欢迎指正。

目录

第一节、项目建立 (3)

第二节、相关参数的配置 (4)

第三节、程序的编译、烧写、执行 (7)

第四节、串口驱动 (8)

第五节、LED驱动 (11)

第六节、按键及蜂鸣器驱动 (12)

第七节、步进电机驱动 (13)

第八节、RTC驱动 (14)

第九节、定时器驱动 (16)

第十节、中断驱动 (17)

第十一节、数码管驱动 (18)

第十二节、I2C矩阵键盘驱动 (19)

第十三节、LCD驱动 (20)

第十四节、触摸板驱动 (24)

第十五节、驱动整合 (26)

串口模式: (26)

LCD模式: (27)

第一节、项目建立

本次项目使用的软/硬件包括:

CodeWarrior for ARM Developer Suite v1.2(以下简称ADS).

MagicARM2440硬件仿真平台

工程建立步骤:

打开ADS,选择File->New。在弹出的面板框中选择ARM Executable Image,项目名填写Test(可根据自己需要自行更改),项目存储位置此处选择F://ADS/Test(可根据自己需要自行更改)。注意:项目的储存位置一定不要包含中文路径,否则会出现不可预期的错误。

建立项目工程组织文件夹。在屏幕的中部点击右键,选择Create Group新建项目的组织文件夹,方便对源文件进行管理。如下图

其中head、startUP、target文件包含了2440所有的寄存器配置以及其他基本参数文件。Console文件夹包含了串口头文件和驱动程序。File文件夹包含了Lcd使用到的字库和图片。I2C文件夹包含了I2C总线头文件和驱动文件以及7290芯片的驱动文件,src文件夹包含所有的自行编写的其他驱动程序文件。

第二节、相关参数的配置

想要编译生成的二进制文件在ARM裸机上成功跑起来,有几个地方需要进行重新设置,具体步骤如下:

选择Release下的Release setting。

在Target setting一栏中选择post-linker为ARM fromELF,其余默认

在ARM Assember和ARM C Compile中的Target/Target and source中分别选择ARM920T

在Linker的output选项卡中设置RO Base和RW Base分别为0x00000000、0x30000000。Options选项卡下的Image Entry Point设置为0x00000000,Layout选项卡下的Object设置为StartUP.o,Section设置为StartUP。

在ARM fromELF设置里面选择output formmat为binary(二进制文件)。输出文件名设置为test.bin。此处也可以选择Inter32bit hex(32位16进制文件),相应的输出文件名设置test.hex。(注意:输出文件名一定要添加文件后缀名,否则会出现文件类型错误)

第三节、程序的编译、烧写、执行

当程序编写完成后,需要选择make命令生成我们需要的可执行文件

生成的可执行文件存放在项目文件夹下的项目名_Data\Release文件夹下,打开该文件夹可以看到可执行的十六进制文件已经存在。

接着打开电脑上的JFlash烧写器,进行相关参数配置后烧写进开发板的flash1中,重启开发板,就可以看到程序正在执行。

至此,整个项目的前期准备工作处理完毕,接下来将进行第一个裸机驱动的编写。第四节、串口驱动

在MagicARM2440的裸机驱动程序开发中,个人觉得串口的作用应该是放在第一位的,因为后续的所有程序编写不可能一次性成功,在所有的调试的中,串口调试是一个很好的选择,所以选择串口作为我们的一个切入点。

首先我们来看一下UART.H文件,其中声明了串口操作的所有函数。其功能在注释中有相应的解释。具体实现代码请参考源码,此处只截取几个比较重要的部分进行讲解。

主要需要关注的一点是串口初始化函数。由于板子上提供了两个串口,所以对于使用哪一个串口需要进行选择,相应的寄存器选择应该结合MargicARM2440的硬件电路图,根据板子上使用的寄存器组进行相应的控制、数据寄存器的初始化,详细设置请参考实验代码如下图:

注意:在这里设置的相应的参数应该牢记,使用电脑的超级终端或者其他串口工具新建链接的时候相应的参数设置应该和此处的参数保持一致,否则不能保证开发板和电脑之间的正确通信。

另外需要特别注意的是Uart_SendString()函数和Uart_Printf()函数,从表面上看起来这两个函数都是向串口打印字符串,其实这两个函数还是有很大区别的,SendString函数只是单纯的检查发送缓冲区的数据,当其不为空时向串口发送字符数据,它并不关心发送的数据本身是否符合要求,这在某些情况下并不是特别适用,比如需要打印一个字符串,其中有需要替换的变量,单纯使用SendString就需要调用另外的语句进行格式控制,因此,为了减少后续输出的麻烦,在这里我重写了一个Printf函数,把所有的格式控制写到函数里面来,这样后面的代码中使用起来就可以和C语言的Printf函数一样方便了。详细代码如下图:

使用Uaet_SendString()函数用法:(每次输出都需要转换一次格式)

sprintf(disp_buf,"Y-Posion[AIN7]is%04d\n",point_adc);

UART_SendStr(disp_buf);

使用Uart_Printf()函数用法:(和C语言的Printf函数使用方式基本相同相同)Uart_Printf("转换前Y=%d.",point[1]);

当所有的代码实现完成后,就可以对程序进行测试了,主函数如下:(其他详细代码请参看源码)

经过编译、下载后,打开超级终端,按照代码中的设置一样进行参数设置后,重启开发板,终端首先会打印出Hello World!,然后等待用户输入,当用户按下一个按键时,终端的显示窗会打印出相应的键值,至此说明串口驱动程序编写成功。

第五节、LED驱动

LED应该是本次实验最简单的一个部分,根据电路原理图可以查得,4个LED(1~4)分别接了GPE11、GPE12、GPH4和GPH6这4个引脚,同时还可以看到LED为共阴极方式接入,所以只需要向相应的引脚写1即可点亮,在此之前需要对GPE和GPH寄存器进行初始化设置,其代码如下图:

初始化完成后,就可以对LED进行相应的操作了。

LED_DispNum()函数,控制LED1~LED4显示指定16进制数值。LED4为最高位,LED1为最低为,点亮表示该位为1。

测试功能:使用GPIO控制LED1~LED4及蜂鸣器,先蜂鸣器响一声,全部闪烁5次,然后指示0~F的16进制数值。具体代码如图:(其他详细代码请参看源码)

经过编译、下载,成功后重启开发板,将看到LED灯全部闪烁5次,然后指示0~F 的16进制数值,则说明LED驱动成功。

第六节、按键及蜂鸣器驱动

通过查询开发板硬件电路图,可以得到按键接入点为GPF4引脚,蜂鸣器接入点为GPH10引脚,在这里按键作为信号源输入,蜂鸣器作为信号源输出,和LED操作一样,只需要在相应的位进行写1或者清0即可,在此之前需要对这两个寄存器进行操作。其设置如下图:

初始化成功后可使用以下代码进行测试:(其他详细代码请参看源码)

经过编译、下载之后,重启开发板,当按下外部按键KEY时,蜂鸣器发声,取消后发声停止,则说明按键及蜂鸣器驱动成功。

注意事项:想要蜂鸣器发声,需要短接开发板上的JP10引脚,否则看不到效果。另外,由于设置的按键为低电平有效,所以在按下的一瞬间有噪声干扰,属于正常现象。

第七节、步进电机驱动

结合电路原理图,课发现步进电机一共有4个输入引脚,其分别为GPC0,GPC5,GPC6和GPC7,为了保证每一次外部脉冲步进电机转动一个相位,需要进行如下设置:

当所有的初始化完成后,使用如下主函数进行测试:(其他详细代码请参看源码)

经过编译、下载,并且正确短接开发板上相应的引脚后,重启开发板,将看到步进电机

正向转动,则说明此次驱动成功。

注意:观察步进电机实验现象,需要短接开发板上的JP8引脚,否则没有实验现象出现。

第八节、RTC驱动

RTC为系统内部时钟,由开发板上的纽扣电池供电,产生的系统时钟为储存器提供时钟信号,保证了存储器的正常工作。由于系统的引脚已经内置,所以只需要找到相应的控制寄存器对其进行设置之后就可以按照需要使用系统时钟,此处我们采用每隔一秒读取一次系统时钟的方式来检查RTC是否正常工作。其初始化代码如下:

当初始化工作完成之后,就可以编写主函数来对程序进行测试了,这里和前面几个实验有所区别的是,RTC读取出来的系统时钟,是无法显式的表现给编程人员的,所以这里需要借助串口来打印出我们需要的信息,这也是为什么前面第一个实验就要做串口的目的。其主函数代码如下:(其他详细代码请参看源码)

经过编译、下载成功后,需要打开电脑上的超级终端,按照实验一的步骤进行相应的设置之后,重启开发板,将看到在我们的超级终端屏幕上每隔一秒将打印一条当前的系统时间(开发板)。

注意:显示的系统时间可能和当前世界时间不一样,这是正常的,因为开发板内置的就是这个时间,并没有和网络同步,此属于正常现象。

第九节、定时器驱动

定时器的作用可以用来为内设提供时钟信号,亦可以用来计时等操作。

定时器驱动的设计,还需要考虑好定时时长,根据选定的定时时长计算好预分频系数等相关参数,本次驱动选择定时0.5秒;相关参数设置如下:

其中断服务程序如图:

经过编译、下载成功后,检查电路连接无误后,重启开发板,如果听到蜂鸣器每隔0.5秒响一次,则说明定时器驱动成功。

第十节、中断驱动

对于中断驱动来说,其实原理和定时器相差不大,主要就是中断的初始化和中断服务函数不一样,其中断初始化函数设计如下:

中断服务程序:

第十一节、数码管驱动

对数码管的操作,其实是通过I2C总线和7290芯片一起来实现的,因此我们第一步需要对I2C总线有所了解。

I2C总线是飞利浦公司提出来的一线式总线,所有外设都挂载在这根总线上,每个外设都有属于自己的独立的子地址,CPU和外设之间需要进行数据传输的时候总是需要通过一种应答机制来完成,每一次的数据交换都需要给出相应的硬件地址和操作位数。以读取数据为例,需要给出从机地址,器件子地址缓冲区指针(第一字节用来表示子地址字节个数)、接收数据缓冲区、接收数据个数。

初步理解了I2C工作方式后再来看7290芯片也即是数码管控制芯片的工作方式,其实无非是对I2C总线的一个运用而已,程序如图:

对于数码管的测试也很简单,调用驱动7290芯片的函数向I2C总线写数据即可,其主函数如图所示:(详细代码请参看源码)

经过编译、下载成功后,重启开发板,将会看到开发板上的数码管依次全显示0、2、4、6、8,接着从右至左显示1~8,至此说明数码管驱动成功。

第十二节、I2C矩阵键盘驱动

和数码管一样,4*4矩阵键盘也属于一个I2C从元件,并且也受7290芯片控制,所以对于矩阵键盘的操作和上一个驱动大体一致,就不在过多强调,具体实现细节请参看下面的源码:(详细代码请参看源码)

嵌入式Linux应用软件开发流程

从软件工程的角度来说,嵌入式应用软件也有一定的生命周期,如要进行需求分析、系统设计、代码编写、调试和维护等工作,软件工程的许多理论对它也是适用的。 但和其他通用软件相比,它的开发有许多独特之处: ·在需求分析时,必须考虑硬件性能的影响,具体功能必须考虑由何种硬件实现。 ·在系统设计阶段,重点考虑的是任务的划分及其接口,而不是模块的划分。模块划分则放在了任务的设计阶段。 ·在调试时采用交叉调试方式。 ·软件调试完毕固化到嵌入式系统中后,它的后期维护工作较少。 下面主要介绍分析和设计阶段的步骤与原则: 1、需求分析 对需求加以分析产生需求说明,需求说明过程给出系统功能需求,它包括:·系统所有实现的功能 ·系统的输入、输出 ·系统的外部接口需求(如用户界面) ·它的性能以及诸如文件/数据库安全等其他要求 在实时系统中,常用状态变迁图来描述系统。在设计状态图时,应对系统运行过程进行详细考虑,尽量在状态图中列出所有系统状态,包括许多用户无需知道的内部状态,对许多异常也应有相应处理。 此外,应清楚地说明人机接口,即操作员与系统间地相互作用。对于比较复杂地系统,形成一本操作手册是必要的,为用户提供使用该系统的操作步骤。为使系统说明更清楚,可以将状态变迁图与操作手册脚本结合起来。

在对需求进行分析,了解系统所要实现的功能的基础上,系统开发选用何种硬件、软件平台就可以确定了。 对于硬件平台,要考虑的是微处理器的处理速度、内存空间的大小、外部扩展设备是否满足功能要求等。如微处理器对外部事件的响应速度是否满足系统的实时性要求,它的稳定性如何,内存空间是否满足操作系统及应用软件的运行要求,对于要求网络功能的系统,是否扩展有以太网接口等。 对于软件平台而言,操作系统是否支持实时性及支持的程度、对多任务的管理能力是否支持前面选中的微处理器、网络功能是否满足系统要求以及开发环境是否完善等都是必须考虑的。 当然,不管选用何种软硬件平台,成本因素都是要考虑的,嵌入式Linux 正是在这方面具有突出的优势。 2、任务和模块划分 在进行需求分析和明确系统功能后,就可以对系统进行任务划分。任务是代码运行的一个映象,是无限循环的一段代码。从系统的角度来看,任务是嵌入式系统中竞争系统资源的最小运行单元,任务可以使用或等待CPU、I/O设备和内存空间等系统资源。 在设计一个较为复杂的多任务应用系统时,进行合理的任务划分对系统的运行效率、实时性和吞吐量影响都极大。任务分解过细会不断地在各任务之间切换,而任务之间的通信量也会很大,这样将会大大地增加系统的开销,影响系统的效率。而任务分解过粗、不够彻底又会造成原本可以并行的操作只能按顺序串行执行,从而影响系统的吞吐量。为了达到系统效率和吞吐量之间的平衡折中,在划分任务时应在数据流图的基础上,遵循下列步骤和原则:

ARM嵌入式系统中双口RAM的驱动开发及应用_图文.

ARM开发与应用 中文核心期刊《微计算机信息>(嵌入式与SOC)2007年第23卷第3—2期 文章编"号:1008-0570(2007)03—2—0134—03 ARM嵌入式系统中双口RAM的驱动开发及应用 Applicationanddriverdevelopmentofdual-port RAM inembeddedsystem (1.中国科学院声学研究所;2.中国科学院研究生院)张震1,2李淑秋1 ZHANGZHEN LISHUQIU 摘要:基于ARM的RISC处理器广泛应用于各种数字系统中.本文以AT91RM9200为系统平台,设计了一种基于双口RAM的 实时数据接口,针对双口RAM的“乒乓”传输方式在Linux2.6下设计并开发了其驱动程序,最终实现了数据源与处理器问不 间断、快速的数据传输。 关键词:嵌入式系统;双端口RAM;Linux2.6;驱动程序中图分类号:1.1B鹞.1文献标识码:A Abstract:RISCprocessorsbasedon

ARM are wildly usedinvariousdigitalsystems.Thisarticletook AT91RM9200 as systemplat? form,anddesigned a real-timedatainterfacebased on dual-port RAM(DPRAM),and also developedthedriverforLinux2.6 to implementthe“Ping-Pong”transmissionoftheDPRAM.Moreover,continuesandfast

CAN总线在嵌入式Linux下驱动程序的实现

CAN总线在嵌入式Linux下驱动程序的实现 时间:2009-11-05 09:41:22 来源:微计算机信息作者:黄捷峰蔡启仲郭毅锋田小刚 1 引言 基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。文章采用CAN总线,基于嵌入式系统32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。文章重点解决了CAN总线在嵌入式操作系统下驱动程序实现的问题。对于用户来说,CAN设备在嵌入式操作系统驱动的实现为用户屏蔽了硬件的细节,用户不用关心硬件就可以编出自己的用户程序。实验结果表明驱动程序的正确性,能提高整个系统的抗干扰能力,稳定性好,最大传输速率达到1Mb/s;硬件的错误检定特性也增强了CAN的抗电磁干扰能力。 2 系统硬件设计 系统采用S3C44B0X微处理器,需要扩展CAN控制器。常用的CAN控制器有SJA1000和MCP2510,这两种芯片都支持CAN2.0B标准。SJA1000采用的总线是地址线和数据线复用的方式,但是嵌入式处理器外部总线大多是地址线和数据线分开的结构,这样每次对SJA1000操作时需要先后写入地址和数据2次数据,而且SJA1000使用5V逻辑电平。所以应用MCP2510控制器进行扩展,收发器采用82C250。MCP2510控制器特点:1.支持标准格式和扩展格式的CAN数据帧结构(CAN2.0B);2.0~8字节的有效数据长度,支持远程帧;3.最大1Mb/s的可编程波特率;4.2个支持过滤器的接受缓冲区,3个发送缓冲区; 5.SPI高速串行总线,最大5MHz; 6.3~5.5V宽电压范围供电。MCP2510工作电压为3.3V,能够直接与S3C44B0X微处理器I/O口相连。为了进一步提高系统抗干扰性,可在CAN控制器和收发器之间加一个光隔6N137。其结构原理框图如图1: 图1.S3C44B0X扩展CAN结构框图图2.字符设备注册表 3 CAN设备驱动程序的设计 Linux把设备看成特殊的文件进行管理,添加一种设备,首先要注册该设备,增加它的驱动。设备驱动程序是操作系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。在linux中用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出请求,

基于项目驱动的嵌入式综合开发

实训报告 实训名称:基于项目驱动的嵌入式综合开发姓名: 院(系): 专业班级: 学号: 指导教师: 实习时间:

一、实训目的 (一)实习目的 本实训课程是针对嵌入式软件专业学生专门设计的,通过本课程设置的几个嵌入式综合项目的系统学习,可以使学生由浅入深的对嵌入式Linux系统进行全面学习,能够独立胜任嵌入式Linux应用开发、系统开发、驱动开发等多方面工作,并注重敬业团队精神培养。 1)增强学生的理论联系实际的能力 2)通过实训了解企业项目开发流程和学习新技术的方法 3)通过实训项目了解企业项目开发过程中文档的整理方法和问题的分析方法 4)通过实训项目加强学生对基础课程的运用能力,使其认识到基础知识的重要性5)通过实训争强学生对本专业和未来工作岗位的理解,端正心态,明确就业目标6)通过实训争强学生的编程技能,培养其良好的编码风格和编码习惯 (二)方法 本实训课程安排在学校实验室统一进行实训,学生上机独立完成规定实训项目。 (三)任务 要求每位同学独立完成实训题目的编程、调试、优化与测试,并交付使用。要求强化编程思维、编程能力和代码优化的能力,撰写《实训报告》(含:需求分析、总体设计、算法分析及设计中遇到的主要问题和解决方法,设计中尚存的不足与心得体会)。上交完成的所有源程序及相关文件。

三、实训报告 3.1 项目1名称 智能手环 3.1.1 实训内容 本次实训内容是制作智能手环,需要实现计步,测量温度,显示时间,电量,报警等功能。具体模块如下: (1)LED模块:显示电量 (2)ADC模块:模数转换 (3)PWM模块:蜂鸣器报警 (4)KEY模块:按键控制 (5)RTC模块:实时时钟 (6)计步以及温度显示模块 (7)总体实现 3.1.2 实训过程及相关结果 首先需要搭建软硬件环境,安装Ubuntu系统,安装交叉编译工具链。然后需要下载调试硬件连接,安装串口驱动等。环境搭建完成之后需要实现相应的每一个功能,具体功能如下: (1)LED模块:显示电量 此模块主要功能为点亮LED灯,以此来实现手环的点亮显示功能。 原理图如下: 在项目目录下分别创建led.c,led.h,main.c文件,根据芯片手册所分析的对应寄存器数据,在

编写嵌入式Linux设备驱动程序的实例教程

编写嵌入式Linux设备驱动程序的实例教程 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1、对设备初始化和释放; 2、把数据从内核传送到硬件和从硬件读取数据; 3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4、检测和处理设备出现的错误。 在linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如

果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理。把

嵌入式驱动开发期末复习

1、嵌入式Linux的设备文件的属性是由3部分信息组成的,它们分别是 2、字符型设备主设备号的添加和注销分别通过调用函数register_chrdev和unregister_chrdev 来实现,这两个函数原型在linux/fs.h 文件说明。 3、假定目标板的/lib目录下有模块文件leds.o,该目录也是用户的当前目录,则可以使用$insmod /lib/leds.o 命令安装leds.o模块,使用$rmmod leds.o 删除该模块。 4、Linux驱动程序的加载有两种方式,一种是静态加载方式,另一种是动态加载方式。 5、Makefile文件中的命令行必须以Tab 键开头,否则报语法错。 6、搭建嵌入式开发环境,连接目标板,一般使用ftp 、 nfs、串口调试方 式连接。 7、mini6410开发板触摸屏驱动使用了input框架。 8、块设备以块为单位传输数据。 9、信号量的物理意义是当信号量值大于零时表示可分配资源的个数;当信号量值小于零 时表示等待该资源的任务的个数。 选择题 1、关于交叉编译描述正确的是 D 。 A. 编译器运行在目标机,生成的可执行文件在宿主机上运行 B.编译器运行在宿主机,生成的可执行文件在宿主机上运行 C.编译器运行在目标机,生成的可执行文件在目标机上运行 D.编译器运行在宿主机,生成的可执行文件在目标机上运行 2、Linux网络设备驱动中用于在Linux网络子系统中的各层之间传递数据的数据结构为 B A.net_device B. sk_buff C. net_dev D. skb 3 有关Linux内核裁剪下列说法错误的是 B 。 A.可以使用make menuconfig命令进行内核的配置 B. 所有的配置项都可以按以编译入内核,编译成模块,不编译三种方式配置 C.使用make zImage命令会编译生成内核镜像文件zImage D. 嵌入式Linux内核编译时应该采用交叉编译器 4、不需要编译内核的情况是 D 。 A 删除系统不用的设备驱动程序时 B 升级内核时 C 添加新硬件时 D 将网卡激活 5、RTC属于 A 总线设备。 A.platform B.PCI https://www.doczj.com/doc/7413112843.html,B D.SPI 6、Linux文件系统的目录结构是一棵倒挂的树,文件都按其作用分门别类地放在相关的目 录中。现有一个外部设备文件,它应该在 C 目录中。 A./bin B./etc C./dev D./lib 7、用下列 A 命令可以查看Linux驱动程序注册时自动分配的主设备号。 A. cat /proc/devices B. cat /bin/devices C. vi /proc/devices D. vi /user/local/devices 8、使用 B 命令可以查看程序hello是基于哪一种体系结构指令集编译的。 A. cat hello B. vi hello C. ./hello D. file hello 9、NAND FLASH和NOR FLASH的区别正确的是 D 。

嵌入式Linux内核驱动开发学习路线图

【原创】嵌入式Linux内核驱动开发学习路线图 -------作者:尚观嵌入式 为什么选择学习嵌入式? 嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一,同时也是当今IT 领域仅存的几个金领职位之一。当前的中国IT人才面临严重的“后继乏人”,而且这种缺口由于培训缺乏、教育模式等原因造成的,而缺口最大的,就是高级IT人才。如果你从事的IT培训不专业,面对竞争越来越激烈的职场,基本找不到工作。据专家预测,嵌入式每年人才缺口在30万左右。 嵌入式行业平均薪资分布 嵌入式职业发展讲解视频 视频中主要讲解什么样的人适合从事嵌入式行业、嵌入式行业从业人员需要具备哪些基本素质、嵌入式行业的特点以及嵌入式行业的现状与发展。 嵌入式研发方向职业生涯讲解视频(1)嵌入式研发方向职业生涯 讲解视频(2) 嵌入式研发方向职业生涯讲解视频(3) 嵌入式研发方向职业生涯讲解视频(4)嵌入式研发方向职业生涯讲解视频(5) ARM+Linux嵌入式底层内核驱动方向学习总体路线图

基础学习Ⅰ---Linux入门 目前嵌入式主要开发环境有Linux、Wince等;Linux因其开源、开发操作便利而被广泛采用。而Linux操作系统也只是一个简单的操作系统,简单的使用对于嵌入式开发人员来说价值并不很高,真正有价值的是掌握Linux的基本服务和Linux的设计理念、思想,这对于嵌入式开发人员的长期发展是很极其重要的。Linux 系统有很多发行版,RedHat、Ubuntu、Fedora等。作为嵌入式开发人员,我们没有必要把精力放到使用哪个Linux发行版上,而是尽快把Linux系统尽快安装好。如果打算坚持长期学习,那么建议您把自己的电脑做成双系统,而不要在虚拟机上安装。 Ubuntu系统下载地址:https://www.doczj.com/doc/7413112843.html,/?a=index&m=index&c=iframe&url=http%3A%2F%2Fwww.ubuntu.or https://www.doczj.com/doc/7413112843.html,%2Fdesktop%2Fget-ubuntu%2Fdownload%2F A)经典书籍推荐:

嵌入式Linux驱动程序开发要点(20210201123523)

嵌入式Linux驱动程序开发要点 在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。|字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件 I/O 一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来 进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。 每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的、不同的硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问驱动程序。 系统调用时操作系统内核与应用程序之间的接口,设备驱动程序是操作系统内核 与机器硬件之间的接口。设备驱动程序是内核的一部分,它完成以下功能: ?对设备初始化和释放 ?把数据从内核传送到硬件和从硬件读取数据 ?读取应用程序传送给设备文件的数据和回送应用程序请求的数据 ?佥测和处理设备出现的错误 MTD(Memory Tech no logy Device )设备是闪存芯片、小型闪存卡、记忆棒之类的设备,它们在嵌入式设备中的使用正在不断增加。MTD驱动程序是在Linux下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序,使用MTD驱动程序的 优点在于他们能更好的支持、管理给予闪存设备,有基于扇区的擦除和读/写操作的 更好的接口。 驱动程序结构 Linux的设备驱动程序可以分为3个主要组成部分: 1. 自动配置和初始化子程序,负责监测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化时被调用一次。 2. 服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进行运行环境有关的函数。 3. 中断服务子程序,又称为驱动程序的下半部分。在Linux系统中,并不是直接从 中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接 收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产 生,因而在中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何

嵌入式Linux驱动开发基础总结(上篇)

嵌入式Linux驱动开发基础总结(上篇) 1, linux驱动一般分为3大类: *字符设备*块设备*网络设备 2, 开发环境构建: *交叉工具链构建*NFS和tftp服务器安装 3, 驱动开发中设计到的硬件: *数字电路知识*ARM硬件知识*熟练使用万用表和示波器*看懂芯片手册和原理图 4, linux内核源代码目录结构: *arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。*block/: 部分块设备驱动程序;*crypto: 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法;*documentation/: 文档目录,没有内核代码,只是一套有用的文档;*drivers/: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。*fs/: 所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统, 例如fat和ext2;*include/: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在include/linux子目录下,与intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;*init/: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的好的起点之一;*ipc/: 这个目录包含核心的进程间通讯的代码;*kernel/: 主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/i386/kernel下;*lib/: 放置核心的库代码;*mm/:这个目录包括所有独立于cpu 体系结构的内存管理代码,如页式存储

相关主题
文本预览
相关文档 最新文档