热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编译ok6410linux内核,OK6410新手学习心得(一)Linux中加入led驱动及测试程序详解...

51单片机我们在大学都学过,51也是我们一个嵌入式接触的第一个处理器,它的结构不算复杂。我们学习51单片机,我们可以清楚的说出51单片机中

51单片机我们在大学都学过,51也是我们一个嵌入式接触的第一个处理器,它的结构不算复杂。我们学习51单片机,我们可以清楚的说出51单片机中的资源,累加器A和B,程序状态寄存器,程序计数器,6个中断源,r0-r7工作寄存器等等,其实arm处理器也可以说是一个单片机,只不过它的速度更快,寄存器更多了些,位数多了些(32位),分了几种工作模式,指令多了些等等,不过只要我们有51的学习经验,学习arm并不是很困难的事情。

不过我们学习arm不能在像学习51单片机那样,希望把所有的东西都知道,弄清楚里面的结构,这个是不可能的,也是完全没有必要的。我们学习arm处理器要学习与应用相关的部分。官方给出的芯片手册是一个工具,而不是教材,我们没有哪个工程师能够把那个一千多页的文档从头到尾的看一遍,三星在写手册的时候也有偷工减料的地方,比如6410的有些部分就是直接拿2440的手册中的。我们用到哪一部分,我们再去查相应的部分就可以了。Arm芯片手册中关于芯片的结构和相关的使用说明说的很详细,以前写过关于裸机LED的小程序,那个小程序只是一个简单的GPIO的操作,不过对于刚入门的初学者来说,这个小程序能让我们大概的了解arm芯片。还有那个led的程序运行是有前提的,arm运行之前要先初始化,上次我们直接是在启动uboot启动后运行的我们的led程序,uboot把做了初始化的工作。

学习arm和学习51系列的基本内容相同,arm的基本内容主要包括中断响应过程,arm指令集,存储器结构和汇编语言的程序结构,并没有比51更多多的内容,从这几方面去学习arm,我们会发现学习arm并不是很困难的事。我们不要把arm想的太复杂,太神秘,就像我们没有接触单片机之前,我们并不知道什么是单片机,也不知道单片机能做什么,当我们学完之后,我们感觉其实也没什么难的。Arm也是一样的,我建议初学者买本关于arm入门的书,从头看一遍有个系统的掌握。我给大家推荐一本《从51到ARM—32位嵌入式系统入门》北京航空航天大学出版社出版的。这本书是我在大学的时候接触到的第一本arm的书,这本书讲的很基础,引领我们从51过渡到ARM,很多的地方都是讲51和ARM的对比,让我们看完之后,感觉arm就是一个“超级”的51。建议关于汇编的指令部分先可以不看,因为那个很长,也不好记,而且日后工作也不怎么用。只有我们在移植与CPU直接打交道的时候才用的着。

先看一下百度百科是怎么定义操作系统的,操作系统(Operating System,简称OS)是管理电脑硬件与软件资源的程序,同时也是计算机系统的内核与基石。操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。如果我们想学操作系统,关于操作系统很多我前辈都推荐我们先学ucos,可以说麻雀虽小五脏俱全,代码量少,不过里面的基本的机制还是都有的。

我们没有必要学习arm中的详细的结构,我们大概了解arm的体系结构就可以了,就像学习51的时候用C语言编程,也不知道是怎么生成的二进制可执行的文件的。我们想玩操作系统也可不太关心arm结构,编译器会帮助我们完成这个复杂的工作。

操作系统一定意义上也可以看作是一个软件,只不过这个软件管理我们的资源,调度任务,管理内存,管理中断等。Linux是一个多任务,多用户的一个网络操作系统,一台linux机器可以同时运行不同用户的多个任务,一个cpu怎么来实现呢?我们可以听歌的同时也可以浏览网页,而另一个人可能也在通过网络登录这台机器做着自己的开发工作。这就是操作系统要做的。把每个任务分成时间片,轮换着让cpu去执行,只不过这个速度太快了,以至于我们认为我们的任务同时在运行。我们可以把linux想成是一个“大管家”,管理着资源任务。初学者先不要想linux内部究竟是怎么管理的,内部是怎么样的结构,也不要一开始就拿一本linux内核详解来看,整天翻着天书,看不到100页就看不下去了。由浅入深,从简单到复杂,慢慢的我们就会知道什么是linux了,时机到了,不用怎么去看就已经很明了了。

学习嵌入式linux编程,我们接触到的大多是linux设备驱动程序的编程。说了半天没有头绪的东西,还是来点实际的东西。今天我就给大家简单的分析一下飞凌的led驱动程序,有了我们前面led的裸机的程序的基础,这个led的驱动也就简单多了。

大家最好是看一下linux设备驱动程序一书的前六章,这样不会对linux中的led中的一些函数太陌生。首先要对linux的字符设备驱动框架有一个大概的了解。

打开linux的源码目录,找到drivers/char/s3c6410-led.c

ccd6e2db9bb0bdb3229e6ef2f9806b08.png

打开看一下源码,飞凌的这个led驱动程序可以运行,不过不太好,我改了一个小地方,我也看了友善的led的程序,两者如出一辙,不知道是谁copy谁的。大家有兴趣的可以看一下,ioctl中的switch语句,已经有了switch为什么还要在里面用if语句呢,看来高手也有犯小错误的时候。主要起控制led灯亮灭的是这个函数。

static long s3c6410_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)//控制函数

{

if (arg > 4){//因为只有四个led灯,如果大于四就返回一个错误

return -EINVAL;

}

switch(cmd) {              //根据命令来设置亮灭

unsigned tmp;

tmp = readl(S3C64XX_GPMDAT);

case 0://打开

tmp &&#61; (~(1<

break;

case 1://关闭

tmp |&#61; (1<

break;

default:

return -EINVAL;

writel(tmp,S3C64XX_GPMDAT);//数据写回寄存器

printk (DEVICE_NAME": %d %d\n", arg, cmd);

return 0;

}

}

代码中有简单的注释&#xff0c;这里就不多说&#xff0c;我们怎么来测试我们的驱动可以用了呢&#xff1f;

我们写一个测试程序来看一下。

写一个流水灯吧&#xff0c;源码发给大家。

在linux下编译执行

f3cc36b4631787c813b738a90d74277e.png

就可以生成ledtest&#xff0c;注意如果把arm-linux-gcc的路径加到PATH环境变量中去&#xff0c;否则会出现找到不命令的错误。

把ledtest通过串口发到开发板中&#xff0c;因为没有执行权限&#xff0c;先运行chmod 777 ledtest

然后再./ledtest

93ecc7fff4237873a30a3727ec6e4022.png

就可以看到流水灯闪动了。

2798d80fe118e1443e383742554d1c16.png

由于闪动的有点快&#xff0c;手机拍下来显示成两个亮了。其实是闪动的。

还有再给大家说一下怎么来把led驱动加到内核中呢&#xff0c;linux的编译用的是makefile管理的&#xff0c;初学者对于makefile的基本结构要知道一些&#xff0c;不用把整个makefile的文档都看一遍&#xff0c;但也要把知道大概,  makefile的格式规则是这样的

target : prerequisites

command

我们打开char目录下的makefie看一下&#xff0c;

57cd4f29e4af812961dc11883be5ad4a.png

这一行是把led的驱动加入内核的关键&#xff0c;而我们在编译的时候要配置是加入内核还是编译成模块呢&#xff0c;我们运行make menuconfig的时候是怎么出现的配置的呢&#xff1f;这个要看我们的Kconfig文件

01836c02933f179ea84346e4a2977c86.png

这个里面的FORLINX6410_LEDS和前面的Makefile中的文件

34b11258801c96a72a65d5884a688e2d.png只差了一个前缀&#xff0c;这个就是我们在make menuconfig 的时候的配置选项。

进入到Device DriversàCharacter devices找到LedS driver forlinx6410

61536f7567859211edd9e7df5b11d588.png

我们选上这一项就是编译进内核&#xff0c;如果是M&#xff0c;就是要编译成模块&#xff0c;可以动态加载&#xff0c;如果是空就是不编译。Make menuconfig的时候就是如何剪裁操作系统了&#xff0c;我们可以把不需要的或者没有必要的驱动不选上&#xff0c;重新编译&#xff0c;就可以得到自己剪裁过的内核了

驱动大体就是这样加入到内核的。不过这只是个简单的驱动&#xff0c;复杂的驱动也有点复杂&#xff0c;这里不介绍。

移植内核的过程有点复杂&#xff0c;不可能一两句说的清楚&#xff0c;大体的步骤就是先移植与arm体系结构相关的部分&#xff0c;先让linux在平台上跑起来&#xff0c;先移植nand驱动和串口驱动&#xff0c;这样我们可以从串口查看调试信息&#xff0c;以便我们进行其它驱动的移植&#xff0c;然后再移植各个相关的驱动。与6410相关的内核代码在源代码的arch/arm/mach-s3c64xx/文件夹下。驱动的设备驱动都在drivers目录下&#xff0c;char目录下是字符设备驱动&#xff0c;block目录下是块设备驱动程序等等&#xff0c;我们只要一看名字应该都知道大概是什么驱动。我们初学者大多接触的是字符设备驱动。

对于初学者不要有太多的忧虑&#xff0c;不要想我不是这个专业的&#xff0c;很多都不会&#xff0c;本人大学学的是电子信息工程&#xff0c;和嵌入式也没有太大的关系&#xff0c;操作系统不懂&#xff0c;arm结构不明白&#xff0c;我们可以慢慢学&#xff0c;没有谁一下子就把能把操作系统或者是arm说清楚的&#xff0c;我们多接触&#xff0c;一天会一点&#xff0c;不会想一口吃个胖子&#xff0c;嵌入式讲内功的&#xff0c;其实前边我和大家说&#xff0c;这个可以不用全会&#xff0c;那个不必全知道&#xff0c;是个让大家不至于一学嵌入式就被困难吓回去的做法&#xff0c;我是想让大家在尽短的时间内了解嵌入式的全貌&#xff0c;知识还是越多越好的。

fb584dcc07959caedf1402f50d598185.png



推荐阅读
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • Python网络爬虫入门:利用urllib库进行数据抓取
    Python网络爬虫入门:利用urllib库进行数据抓取在数据科学和Web开发领域,Python凭借其简洁高效的特性成为首选语言。本文主要介绍了如何在Windows环境下使用Python的urllib库进行基本的网络数据抓取。考虑到命令行操作的不便,作者选择了Jupyter Notebook作为开发环境,不仅简化了配置过程,还提供了直观的数据处理和可视化功能。通过实例演示,读者可以轻松掌握urllib的基本用法,为深入学习网络爬虫技术打下坚实基础。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  •  DRV8825步进电机驱动控制器与双轴稳定平台的集成应用
    本研究基于TI公司的DRV8825步进电机驱动芯片,将其与现有的双轴稳定平台集成,开发出一种具备自动测量功能的新型平台。该平台通过精确控制步进电机,实现了高精度的定位和测量,适用于多种精密测量和自动化应用场景。关键词:DRV8825,步进电机,双轴稳定平台,自动测量,精密控制 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • Go语言中Goroutine与通道机制及其异常处理深入解析
    在Go语言中,Goroutine可视为一种轻量级的并发执行单元,其资源消耗远低于传统线程,初始栈大小仅为2KB,而普通线程则通常需要几MB。此外,Goroutine的调度由Go运行时自动管理,能够高效地支持成千上万个并发任务。本文深入探讨了Goroutine的工作原理及其与通道(channel)的配合使用,特别是在异常处理方面的最佳实践,为开发者提供了一套完整的解决方案,以确保程序的稳定性和可靠性。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
author-avatar
手机用户2502922477
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有