tag 标签: in

相关帖子
相关博文
  • 热度 14
    2016-5-2 17:20
    725 次阅读|
    0 个评论
    将NeoEco450w中的24-pin中的Pin-16与Pin-17用回形针短接后电源工作
  • 热度 20
    2016-3-29 11:18
    1111 次阅读|
    3 个评论
    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下。    在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。 C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。 学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。以前我是用 VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C、纯数学、纯逻辑的题目,不涉及界面这些东西, 很适合煅炼你的编程能力。          回到主题,首先我们要明白你的目的是什么,大概来说所谓嵌入式Linux可以分为两部分:底层系统、应用开发。     如果你是想做应用开发,那么你去把C语言、数据结构、JAVA什么的学好吧。嵌入式应用开发和PC上的 应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序 和PC上的程序开发没什么差别。另外,当你有能力去优化时,你已经不用来问这个问题了。具体到某个例子, 比如说开发界面,在PC上我们用VC;在嵌入式Linux里也许我们用QT也许用Android,这个时候你应该去学学QT、 Android的编程。但是基础还是C或JAVA,在此基础上去熟悉它们的接口。你学过VC的话,也是要花时间去了解 那些类、控件的。   如果你的目的是想学习底层系统,这是我的专长,倒是可以说一点。   在回答这个问题之前,我先回答:不少人问我,到底是学驱动还是学应用?   我只能说凭兴趣,并且驱动和应用并不是截然分开的 1. 我们说的驱动,其实并不局限于硬件的操作,还有操作系统的原理、进程的休眠唤醒调度等概念。    想写出一个好的应用,想比较好的解决应用碰到的问题,这些知识你应该懂 2. 做应用门槛低,特别是现在的ANDROID,纯JAVA。做应用的发展路径个人认为就是业务纯熟。    比如在通信行业、IPTV行业、手机行业,你了解行业的需求。所以,当领导的人,多是做应用的。 3. 做驱动,其实我不想称为“做驱动”,而是想称为“做底层系统”,做好了这是通杀各行业。我工作几年,    做过手机、IPTV、会议电视,但是这些产品对我毫无差别,因为我只做底层。他们的业务跟我没关系。    当应用出现问题,他们解决不了时,我就会从内核角度给他们出主意,给他们提供工具。    做底层的发展方向,个人认为是技术专家。 4. 其实,做底层还是做应用,之间并没有一个界线,有底层经验,再去做应用,你会感觉很踏实。    有了业务经验,你再了解一下底层,很快就可以组成一个团队。       回到怎么学的问题上。嵌入式Linux底层系统包含哪些东西?不要急,举一个例子你就知道了。 1. 电脑一开机,那些界面是谁显示的?是BIOS,它做什么?一些自检,然后从硬盘上读入windows,并启动它。    类似的,这个BIOS对应于嵌入式Linux里的bootloader。这个bootloader要去Flash上读入Linux内核,并启动它。 2. 启动windows的目的是什么?当然是上网聊天什么的了。这些上网、聊天工具在哪?    在C盘、D盘上。所以, windows要先识别出C盘、D盘。在Linux下我们称为根文件系统。 3. windows能识别出C盘、D盘,那么肯定能读写硬盘才行。这涉及的东西称为驱动程序。当然不仅仅是硬盘,还有网卡、USB等等。    嵌入式Linux能从Flash上读出并执行应用程序,肯定也得有Flash的驱动程序啊,当然也不仅仅是Flash。           先说到这里吧,嵌入式LINUX里含有bootloader,内核, 驱动程序、根文件系统这4大块。 一、bootloader:     它就是一个稍微复杂的裸板程序。但是要把这裸板程序看懂写好一点都不容易。Windows下好用的工具弱化了我们的编程能力。 很多人一玩嵌入式就用ADS、KEIL。你能回答这几个问题吗? 1. 一上电,CPU从哪里取指令执行?    答:一般从Flash上指令。 2. 但是Flash一般是只能读不能直接写的,如果我用到全局变量,这些全局变量在哪里?    答:全局变量应该在内存里 3. 那么谁把全局变量放到内存里去?    答:长期用ADS、KEIL的朋友,你能回答吗?这需要"重定位"。在ADS或KEIL里,重定位的代码是制作这些工具的公司帮你写好了。        你可曾去阅读过? 4. 内存那么大,我怎么知道把"原来存在Flash上的内容"读到内存的"哪个地址去"?    答:这个地址用"链接脚本"决定,在ADS里有scatter文件,KEIL里也有类似的文件。但是,你去研究过吗? 5. 你说重定位是把程序从Flash复制到内存,那么这个程序可以读Flash啊?    答:是的,要能操作Flash。当然不仅仅是这些,还有设置时钟让系统运行得更快等等。       先自问自答到这里吧,bootloader这一个裸板程序,其实有3部分要点: 1. 对硬件的操作 2. 对ARM体系处理器的了解 3. 程序的基本概念:重定位、栈、代码段数据段BSS段什么的。        对硬件的操作,需要看原理图、芯片手册。这需要一定的硬件知识,不求你能设计硬件,但是至少能看懂; 不求能看懂模拟电路, 但是要能看懂数字电路。这方面的能力我是在学校里学到的,微机原理、数字电路这2本书(书名忘了)就足够了。但是我怀疑你有无耐 心把这2本书看完。我不知道现在有没有更快捷的书。想速成的话,就先放掉这块吧,不懂就问GOOGLE、发贴。 另外,芯片手册是肯定要读的,别去找中文的,就看英文的。开始是非常痛苦,以后就会发现那些语法、词汇一旦熟悉后, 读任何芯片手册都很容易。 对ARM体系处理器的了解, 看杜春蕾的ARM体系架构与编程吧,里面讲有汇编指令,有异常模式、MMU等。也就这3块内容需要你了解。 程序的基本概念,王道当然是去看编译原理了。可惜,这类书绝对是天书级别的。劝你若非超级天才还是别去看了。就看我写的 嵌入式Linux应用开发完全手册和第1期视频吧,别担心,不用花钱。照着视频把硬件相关的实验做了,这些概念就清楚了。我还没有 发现第2套讲这些概念的书或视频,允许我盲目吹嘘一回。   对于bootloader,我学习时是先看了ARM体系架构与编程,然后自己写程序把各个硬件的实验都做了一遍,比如GPIO、时钟、 SDRAM、UART、NAND。把它们都弄清楚了,组台在一起就很容易看懂u-boot了 总结一下,看懂硬件原理图、看芯片手册,这需要你自己去找资料。剩下的,就按嵌入式Linux应用开发完全手册和第1期视频的章 节目录去学习吧。     二、内核: 想速成的人,先跨过内核的学习,直接学习怎么写驱动。 想成为高手,内核必须深刻了解。注意,我说的是了解,我没奢望去写出一个内核。 要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。 推荐两本书: 1. 通读linux内核完全注释,请看薄的那本(浮燥的社会讲求速度, 呵), 2. 选读Linux内核情景分析, 想了解哪一块就读哪一节     三、驱动: 驱动包含两部分:硬件本身的操作、驱动程序的框架。 又是硬件,还是要看得懂原理图、读得懂芯片手册,多练吧。   说到驱动框架,有一些书介绍一下。LDD3,即Linux设备驱动,老外写的那本,里面介绍了不少概念,值得一读。但是,它的作用 也就限于介绍概念了。我基本上是入门之前用它来熟悉一下概念,入门后就扔掉了。 驱动方面比较全的介绍,应该是宋宝华的linux设备驱动开发详解了,老实说我只看过目录,有不少人说好,这里推荐一下。 要想深入了解某一块,Linux内核情景分析绝对是超5星级推荐。你别指望把它读完,1800多页,上下两册呢。我是某一块不清楚 时,就去翻一下它。任何一部分,这书都可以讲上2、3百页,非常详细。并且是以某个目标来带你分析内核源码。它以linux 2.4为例, 但是原理相通,同样适用于其它版本的linux。   还有没有其他介绍?呵呵,当然有了,韦东山Linux视频第2期。嵌入式Linux应用开发完全手册里对驱动讲得不多,不够深入。 于是我录制了这期视频。不仅仅教你怎么写怎么改驱动,还教你为什么这样写这样改驱动。 每一个驱动都是现场编写: 1. 用绘图板画图讲解──相当于学校里老师在黑板上画图讲解,很直观    绝对不是对着PPT念。 2. 用source insight当场写程序,从第1行开始写,每一课都是这样。我讲了20多个驱动,就写了20多个程序。 3. 写完就编译、测试。 4. 很全面,字符设备驱动、块设备、网卡驱动3大类齐全,硬件介绍、驱动框架分析、测试3大类齐全。     培训机构里教的内容,远不及这期视频丰富。我在多个培训机构讲过课,从没看到哪个老师敢每一课都当场讲解当场编写代码 当场测试,除我之外!也没看到哪个培训机构讲完这些内容──因为时间不够,讲完起码要一个月,但是这部分基本只有2周授课时间。   把你手上的开发板所涉及的硬件,都去尝试写一个驱动吧。有问题就先"痛苦地思考",思考的过程中你会把很多不相关的知识 串联起来,最终贯通。     四、根文件系统: 大家有没有想过这2个问题: 1. 对于Linux做出来的产品,有些用作监控、有些做手机、有些做平板。那么内核启动后,挂载根文件系统后,应该启动哪一个应用程序呢?    答:内核不知道也不管应该启动哪一个用户程序。它只启动init这一个应用程序,它对应/sbin/init。        显然,这个应用程序就要读取配置文件,根据配置文件去启动用户程序(监控、手册界面、平板界面等等)        这个问题提示我们,文件系统的内容是有一些约定的,比如要有/sbin/init,要有配置文件 2. 你写的hello,world程序,有没有想过里面用到的printf是谁实现的?    答:这个函数不是你实现的,是库函数实现的。它运行时,得找到库。        这个问题提示我们,文件系统里还要有库。               简单的自问自答到这里,要想深入了解,可以看一下busybox的init.c,就可以知道init进程做的事情了。        当然,也可以看嵌入式Linux应用开发完全手册里构建根文件系统那章。     说一下我的学习经历吧。 1. 我在学校时读的是物理电子专业,其实课程里没有教怎么设计电路,只是教了些电子电路方面的知识。PCB的设计    是在实验室里自学的,只设计过2层板,现在忘记得差不多了。但是保留了看原理图、看芯片手册的能力。 2. 选修了软件学位,对软件设计挺感兴趣,但是也只是学了C语言、数据库而已。凭着兴趣做了不少竞赛题。没能力去    参加竞赛,但是把C语言练得很扎实。 3. 在实验室、在第1家公司,就是设计些简单的PCI卡,写一下windows的驱动程序 4. 在第2家公司,用51单片机做车载电话,开始走上纯软件的道路。 5. 开始感到单片机的不足,辞职半年闭门学Linux,从red hat怎么操作开始。步骤就是先看ARM体系架构与编程,    再自己写裸板程序操作硬件,接着到分析u-boot。同时看linux内核完全注释,对LINUX框架有所了解。    在写裸板时,建议各位加强对中断的理解,内核就是用中断来完成各种功能的。 6. 分析完u-boot,就开始进行简单的驱动编程了,这时候,能力还很弱。 7. 开始去中兴上班,工作2年,编写各类驱动、解决各类问题(驱动问题、帮助定位应用问题),能力得到煅炼。            总结一下: 1. 硬件方面的书: 微机原理、数字电路,高校里的教材。毕业多年,忘名了。 2. Linux方面的书:     ARM体系架构与编程        嵌入式Linux应用开发完全手册     Linux设备驱动,老外写的那本     linux设备驱动开发详解     linux内核完全注释      Linux内核情景分析      更多内容欢迎交流: qq:1064191232(李老师)   欢迎大家进入华南地区最大的单片机嵌入式学习群:138054083。共同交流、学习。
  • 热度 14
    2016-3-25 11:34
    966 次阅读|
    1 个评论
    1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器 2、Shell 编程基础 Shell简介 认识后台程序Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作 熟悉Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序 编写一个带有循环语句的shell脚本程序 3、Linux 下的 C 编程基础 linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化 熟悉Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序 4、嵌入式系统开发基础 嵌入式系统概述 交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核 嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot 编译并下载Linux内核 编译并下载Linux应用程序 5、嵌入式系统移植 Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念 能够移植Linux内核移植Linux2.6内核到 ARM9开发板 6、嵌入式 Linux 下串口通信 串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM 能够熟悉进行串口通信 熟悉文件I/O 编写串口通信程序 编写多串口通信程序 7、嵌入式系统中多进程程序设计 Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念 能够编写多进程程序编写多进程程序 编写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制 熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序 8、嵌入式系统中多线程程序设计 线程的基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序 9、嵌入式 Linux 网络编程 网络基础知识 嵌入式Linux中TCP/IP网络结构 socket 编程 常用 API函数 分析Ping命令的实现 基本UDP套接口编程 许可证管理 PPP协议 GPRS 了解嵌入式Linux网络体系结构 能够进行嵌入式Linux环境下的socket 编程 熟悉UDP协议、PPP协议 熟悉GPRS 使用socket 编写代理服务器 使用socket 编写路由器 编写许可证服务器 指出TCP和UDP的优缺点 编写一个web服务器 编写一个运行在 ARM平台的网络播放器 10、GUI 程序开发 GUI基础 嵌入式系统GUI类型 编译QT 进行QT开发熟悉嵌入式系统常用的GUI 能够进行QT编程使用QT编写“Hello,World”程序 调试一个加入信号/槽的实例 通过重载QWidget 类方法处理事件 11、Linux 字符设备驱动程序 设备驱动程序基础知识 Linux系统的模块 字符设备驱动分析 fs_operation结构 加载驱动程序了解设备驱动程序的概念 了解Linux字符设备驱动程序结构 能够编写字符设备驱动程序编写Skull驱动 编写键盘驱动 编写I/O驱动 分析一个看门狗驱动程序 对比Linux2.6内核与2.4内核中字符设备驱动的不同Linux 块设备驱动程序块设备驱动程序工作原理 典型的块设备驱动程序分析 块设备的读写请求队列了解Linux块设备驱动程序结构 能够编写简单的块设备驱动程序比较字符设备与块设备的异同 编写MMC卡驱动程序 分析一个文件系统 对比Linux2.6内核与2.4内核中块设备驱动的不同 12、文件系统 虚拟文件系统 文件系统的建立 ramfs内存文件系统 proc文件系统 devfs 文件系统 MTD技术简介 MTD块设备初始化 MTD块设备的读写操作了解Linux系统的文件系统 了解嵌入式Linux的文件系统 了解MTD技术 能够编写简单的文件系统为 ARM9开发板添加 MTD支持 移植JFFS2文件系统 通过proc文件系统修改操作系统参数 分析romfs 文件系统源代码 创建一个cramfs 文件系统       更多内容欢迎交流qq:1064191232(李老师)   欢迎大家进入华南地区最大的单片机嵌入式学习群:138054083。共同交流、学习。
  • 热度 18
    2015-12-25 15:17
    1215 次阅读|
    0 个评论
       自从大二我就开始接触单片机,开始学习51单片机编程及电路图绘制,经过一段时间的学习,发现嵌入式很有意思。后来在师兄的推荐下,我到图书馆借了韦东山老师写的《嵌入式Linux应用开发完全手册》,开始学习嵌入式linux,在虚拟机安装Linux,熟悉Linux环境,各种命令。根据书本的指引,我很快入门了,主要是书写得很好。结合书本视频,也就是韦东山嵌入式Linux第一期视频,我被嵌入式深深吸引住了。最后决定继续购买韦老师的后期视频,快速提高技术水平。        下面我来记录一下我的学习过程及心得。        首先了解需要用到的工具及源码,如下: 交叉编译工具:arm-linux-gcc-4.4.3.tar.gz linux内核:linux-2.6.22.6.tar.bz2,补丁:linux-2.6.22.6_jz2440.patch u-boot源码:u-boot-1.1.6.tar.bz2,补丁:u-boot-1.1.6_jz2440.patch busybox源码:busybox-1.7.0.tar.bz2 yaffs2制作工具:yaffs_source_util_larger_small_page_nand.tar.bz2 jffs2制作工具路径:F:\韦东山\CD1_主光盘\GUI\xwindow\X\deps   以上源码和工具均来自韦东山光盘。 一、u-boot移植        首先通过观看u-boot相关的视频,了解大概情况后开始移植。 工具和源码在路径:F:\韦东山\CD1_主光盘\system。   tar xjf u-boot-1.1.6.tar.bz2   //解压缩 cd u-boot-1.1.6  //进入目录 patch -p1 ../u-boot-1.1.6_jz2440.patch //打补丁,-p1是指忽略第一个目录 root@ubuntu:/share/u-boot-1.1.6# make 100ask24x0_config  //产生配置文件 Configuring for 100ask24x0 board... make all  //编译 结果会遇到这个问题,发现浮点错误,因为gcc造成,所以修改以下文件 gedit cpu/arm920t/config.mk undefined reference to ‘raise’  //提示错误                                                将cpu /arm920t/config.mk 改为 PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8 /     -msoft-float PLATFORM_CPPFLAGS +=  # ===========================================================# # Supply options according to compiler version PLATFORM_CPPFLAGS +=$(call cc-option,) PLATFORM_RELFLAGS +=$(call cc-option,$(call cc-option,)) 在uboot的根目录中把Makefile中的PLATFORM_LIBS 修该为如下值  PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc -lc -L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib 然后重新 make distclean,make 100ask24x0_config,  make   应就能通过了,最后可生产u-boot.bin 通过jlink下载u-boot.bin到nor flash 下载成功后,从nor flash启动,选择k命令, 开启dnw,选择dnw的USB Port下载uImage, 在u-boot界面输入b即可启动内核。 启动u-boot后,要保证能ping通虚拟机linux。
  • 热度 22
    2015-12-25 15:16
    1201 次阅读|
    0 个评论
       自从大二我就开始接触单片机,开始学习51单片机编程及电路图绘制,经过一段时间的学习,发现嵌入式很有意思。后来在师兄的推荐下,我到图书馆借了韦东山老师写的《嵌入式Linux应用开发完全手册》,开始学习嵌入式linux,在虚拟机安装Linux,熟悉Linux环境,各种命令。根据书本的指引,我很快入门了,主要是书写得很好。结合书本视频,也就是韦东山嵌入式Linux第一期视频,我被嵌入式深深吸引住了。最后决定继续购买韦老师的后期视频,快速提高技术水平。        下面我来记录一下我的学习过程及心得。        首先了解需要用到的工具及源码,如下: 交叉编译工具:arm-linux-gcc-4.4.3.tar.gz linux内核:linux-2.6.22.6.tar.bz2,补丁:linux-2.6.22.6_jz2440.patch u-boot源码:u-boot-1.1.6.tar.bz2,补丁:u-boot-1.1.6_jz2440.patch busybox源码:busybox-1.7.0.tar.bz2 yaffs2制作工具:yaffs_source_util_larger_small_page_nand.tar.bz2 jffs2制作工具路径:F:\韦东山\CD1_主光盘\GUI\xwindow\X\deps   以上源码和工具均来自韦东山光盘。 一、u-boot移植        首先通过观看u-boot相关的视频,了解大概情况后开始移植。 工具和源码在路径:F:\韦东山\CD1_主光盘\system。   tar xjf u-boot-1.1.6.tar.bz2   //解压缩 cd u-boot-1.1.6  //进入目录 patch -p1 ../u-boot-1.1.6_jz2440.patch //打补丁,-p1是指忽略第一个目录 root@ubuntu:/share/u-boot-1.1.6# make 100ask24x0_config  //产生配置文件 Configuring for 100ask24x0 board... make all  //编译 结果会遇到这个问题,发现浮点错误,因为gcc造成,所以修改以下文件 gedit cpu/arm920t/config.mk undefined reference to ‘raise’  //提示错误                                                将cpu /arm920t/config.mk 改为 PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8 /     -msoft-float PLATFORM_CPPFLAGS +=  # ===========================================================# # Supply options according to compiler version PLATFORM_CPPFLAGS +=$(call cc-option,) PLATFORM_RELFLAGS +=$(call cc-option,$(call cc-option,)) 在uboot的根目录中把Makefile中的PLATFORM_LIBS 修该为如下值  PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc -lc -L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib 然后重新 make distclean,make 100ask24x0_config,  make   应就能通过了,最后可生产u-boot.bin 通过jlink下载u-boot.bin到nor flash 下载成功后,从nor flash启动,选择k命令, 开启dnw,选择dnw的USB Port下载uImage, 在u-boot界面输入b即可启动内核。 启动u-boot后,要保证能ping通虚拟机linux。
相关资源