【超详细】嵌入式软件学习大纲

目录

随便聊聊

  前两天上传了我自己在整个大学阶段单片机的学习历程(个人感觉已经非常详细和真实了,包括自己在某个阶段遇到的问题,单片机学习的困难点都有描述),感兴趣的朋友们可以去了解一下,从今天开始,打算将自己学到的关于嵌入式方面(不是单片机)的知识和感想来与大家分享,因为个人正在学习嵌入式的缘故,近期分享的内容以嵌入式学习为主,单片机方面打算以后有时间再与大家分享。
  今天做的这个文章,主要是先把自己学习嵌入式软件方面的学习大纲与大家分享一下,有感兴趣的朋友或者正在学习嵌入式的朋友可以一起努力,相互讨论,往后分享的内容都会是以今天发布学习大纲的顺序来分享,当然其他朋友在学习的过程中遇到什么问题,可以在评论区评论一下,我懂的地方会单独做些文章来解释,或者直接在评论区恢复,希望各路朋友多多支持,非常荣幸与大家共成长同进步!
  好了,下面开始我们正式的内容:

什么是嵌入式?

我对嵌入式的看法

  如果要了解嵌入式,大家必须要先了解什么是PC、什么是单片机。在我最早学习单片机的时候,天真的以为学单片机就是在学嵌入式,等到自己逐渐去了解嵌入式以后,才发现原来自己曾经那么可爱(单片机、嵌入式在学习路线、学习难度、学习周期上的差别还是很大的),为了让更多的嵌入式小白走出这样误区,下面简单介绍一下他们分别的概念,和学习上的差别。

单片机系统与嵌入式系统的差别

  要了解单片机,就要追溯到上世纪早期在没有大规模集成电路技术的时代,计算机的设计原理,那时的计算机CPU、随机存储器RAM、只读存储器ROM、各种外设I/O和中断系统ROM等这些都是分离在电路板的各个角落里。直到20世纪70年代左右,随着科学技术的不断发展,利用大规模集成电路技术把CPU和数据存储器(RAM)、程序存储器(ROM)及其他I/O通信口集成在一块芯片上,构成一个最小的计算机系统,这个就是单片机。
  那么跟单片机先比较嵌入式有哪些不同的地方呢?单片机产品和嵌入式产品都是电子产品,整个SOC都以CPU作为核心内嵌各种存储器,都有一些外围硬件作为辅助,也都是通过软件控制硬件。在功能上有很多的相似之处。但是在SOC性能上有非常巨大的差别,例如在内存方面,嵌入式系统的SOC明显比单片机大很多。现在将单片机与嵌入式系统SOC内存资源进行比较(顺便与PC机SOC进行比较):
  1、一般单片机系统中内存需求小,而且希望开发尽肯能的简单,因单片机SOC内嵌小容量的SRAM加小容量的NorFlash。
  2、嵌入式系统内存需求大,因为大容量的Norflash相对较贵,因此嵌入式SOC一般采NANDFlash+Dram+Sram+少量Srom。
  3、一般PC机都是:小容量的NorFLash+大容量的硬盘(类似于Nandflash)+大容量的Dram。
  可见在硬件上三者之间就存在较大的差别。
  嵌入式系统和单片机系统在CPU方面也是有一定差异:是否有MMU(分页内存管理单元,它是一种负责处理CPU的内存访问请求的计算机硬件),当然操作系统方面两者也具有一定差异,单片机系统因为内存资源较少的缘故,因此在操作系统移植方面一般只能跑一些简单的RTOS,像51单片机这样的简单SOC甚至连一些轻量级的RTOS都跑不了,哪怕能跑也没人会用它去跑操作系统(有朋友跟我说能跑,他跑过,纯粹是自己在玩呢,是不是),而嵌入式系统就比较牛了,一般在嵌入式系统中都会跑Linux、Android操作系统。(一般分需不需要比较友好的人机交互界面,不需要的一般都是跑LINUX,像平板、手机一般都是跑的Android,当然Android是基于Linux内核的,这个大家也要了解一下)最后,单片机与嵌入式在应用领域也是有较大差异的,单片机一般应用在操作简单的智能家电(如智能台灯),嵌入式一般运用领域较广(例如工业领域、汽车、航空航天等等都需要嵌入式)。这也是我们学习嵌入式的原因所在。

PC系统与嵌入式系统的差别

  好了分析完单片机与嵌入式的差别,我们再来了解一下什么是PC机,PC机与嵌入式的差别体现在哪?
  PC是什么呢?PC指的就是个人计算机,它是指一种大小、价格和性能适用于个人使用的多用途计算机(这是PC机的一大特点即通用性)。台式机、笔记本电脑到小型笔记本电脑和平板电脑以及超级本等都属于个人PC机。
  PC与嵌入式在硬件的差异在上面我们分析过了,现在我复制粘贴一下:
  1、嵌入式系统内存需求大,因为大容量的Norflash相对较贵,因此嵌入式SOC一般采NANDFlash+Dram+Sram+少量Srom。
  2、一般PC机都是:小容量的NorFLash+大容量的硬盘(类似于Nandflash)+大容量的Dram。
  说实话个人PC机在内部资源上是优于嵌入式系统的,但是这不是PC与嵌入式最大的区别,下面我附嵌入式的定义给大家看看:
  嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统;国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统;从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。
  其实很多学弟学妹表示自学比较困难,这是正常的,看到这么一大串晦涩难懂的文字定义,换谁都很难看下去,下面给大家解释一下:嵌入式系统与PC在分层上是很相似的:都分为硬件层、中间层、系统软件层和应用软件层组成,那么他们差别在哪呢,看上面定义有一句话非常关键:“软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统”,软硬件可裁剪,这是嵌入式最显著的特点,嵌入式系统可以根据对系统功能要求的不同在软件及硬件上做出扩展或裁剪。更大的一个特点在于嵌入式系统是“专用计算机系统”,而PC机是通用的计算机系统,这体现在哪呢?举个例子:“你是一个嵌入式软件开发工程师你用的电脑是Thinkpad x1,你朋友可能是个牙医,他能不能也用Thinkpad x1呢,他当然也可以。”而嵌入性系统就没有这样的通用性:“你做的一款在挖掘机里面的嵌入式系统和他用来给病人拔牙的嵌入式系统是不可能通用的”。

单片机与嵌入式在学习模式上的差别

主流的芯片平台

  主流的单片机平台有:51单片机、PIC、STM32、AVR、MSP430等等。
  主流的嵌入式平台有:ARM、PPC、MIPS等

开发模式的差别

  在开发模式上,两者有哪些区别呢?
  1、单片机开发多为裸机开发,程序规模小,多为单个程序员独立开发,在做一下比较复杂的产品时,也是会用到一些高端的电片机例如:基于ARM cortex-M3 架构的STM32系列单片机,并可以在单片机中跑一些简单的RTOS(例如UCos、FreeRTOS等)。
  2、嵌入式开发几乎全部基于嵌入式操作系统,目前使用Linux与Android系统。

编程语言的差别

  编程语言方面的差异:单片机主要使用C语言(少有汇编),与标准C略有不同,在结构体、指针、共用体及它们与数组的结合等C语言高级特性方面使用较少,而嵌入式则不同,嵌入式软件开发主要有分为底层、应用层。底层多使用C及汇编(并且高级特性运用较多)。应用层则多使用C++、JAVA等高级语言,嵌入式针对基于C语言的数据结构、算法运用能力要求较高。

软硬件组成的差别

  在软硬件组成方面:单片机学习多涉猎到简单的外设(如Uart串口、I2C、ADC、LCD、GPIO等)而嵌入式系统则会涉猎到更多复杂的外设(如有线网卡、WIFI、蓝牙、TCP、USB、音视频图片的编解码等),这些复杂外设在单片机裸机程序下是很难去写出来的(不是写不出,是没必要写出),在操作系统下,本身是提供相关基础架构及库函数的。

嵌入式到底适不适合你学?

嵌入式学习与编程语言和英语水平的差别

  在编程语言方面嵌入式开发主要使用C语言,有的朋友会问我:我C语言一窍不通能不能学习嵌入式?我认为是可以的,不过前提是先去学习一下简单的C语言基础,不需要你学的特别精深,但是基础的知识内容还是要懂的。当然嵌入式开发还会用到汇编语言,这个可以在学习嵌入式裸机的时候边学裸机边学ARM汇编(没必要吧汇编学的太精通,当然如果你有的是时间,那当然多多益善),在嵌入式中间层的开发上会用到C++多一些,个人建议用到哪一步学到哪一步,不建议把C\C++\汇编\java都学好再来看嵌入式(那都猴年马月了),应用层会用到其他各种高级语言(难道你都要挨个学一遍?),其实你能把C学精学好,就OK了,其他语言用到的时候几天就能学到不错的程度。
  嵌入式学习与英语的关系(这个还是蛮重要的,因为很多朋友都反映英语水平不好,是不是不适合学嵌入式):我想说的是英语非常重要,需要你去积累学习,因为首先一点,我们编程时用英语写,但是C中关键是在于关键字,这个在编程的过程中大都就记住了,那么嵌入式学习英语的重要性体现在哪?在阅读Datasheet上,那么有朋友就会觉得自己英语不好就不适合嵌入式学习了,这是不对的,我英语也不怎么好,前期我们看datasheet可以依赖于桌面词典嘛,虽然阅读起来速度会很慢,但不失为一种办法,在后期慢慢积累的过程中,我们的英语水平和看文档的能力就好不断提高了。so,英语不好不是学不好嵌入式的理由,这个世界上不存在笨人,只存在懒人。
  下面补充一点:嵌入式学习数电模电等等这些专业课的关系,首先嵌入式分为嵌入式软件和嵌入式硬件两部分,嵌入式硬件的学习是离不开十点数电模电、电路这些专业课的,甚至相关的微积分计算、复变函数计算、基本的傅里叶变换、拉式变换和Z变换都是要了解的,当然掌握了基本计算方法以后可以利用MATLAB软件进行运算。嵌入式软件学习的话对硬件专业方面的需求不那么紧张,但是软件设计也是需要硬件辅助的,总而言之模电数电这些专业课程的学习对嵌入式学习是有影响的,但不是必须去专门学习。可以通过后期的积累慢慢总结学习。

哪些专业的朋友更适合嵌入式学习

  有的朋友本来是学外语专业的学文学专业的,感觉嵌入式是个未来的大趋势,就打算跨行学习,我觉得这不是不可但是很难,为什么难呢?你想想你跟学外语专业的,对计算机领域可能一窍不通,对一下基本的名次都没有太多的概念,你说你学起来难不难,固然很难,但不是不能学,也有很多跨行来做软件开发的一样可以做到很好。这个还是个人的,那么接下来分析一下那些专业更适合嵌入式的学习:自动化专业(我就是学这个专业的,想了解我的学习历程可以去看我的另一篇经验分享文章,写的很详细)、电子信息类专业、计算机类专业、测控类专业、机械电子类专业都可以。
  总的来说,我认为任何事物的学习最关键的都不是专业,你是不是这个专业的与你以后将要学习什么事物是没有必然联系的,有必然联系的是你自己的态度和你是不是对它有特别大的兴趣(尤其是技术性很强的学科,你不喜欢他,他就是再好你也不一定能学的进去),当前你能学到什么程度这取决于你的毅力,你会学的多快这取决于你的学习能力和专注程度,所以朋友们一旦决定要学习它,就请拼劲全力吧!

嵌入式学习路线

  好了现在到了终点了,如果你打算要好好学习嵌入式了,那么下面的内容也许对你有一定帮助,嵌入式的学习是分阶段的,每个阶段有不同的学习内容,具体分几个阶段,每个阶段需要学习什么内容,我们可以接着往下看。嵌入式软件是一个系统非常庞大的学科,嵌入式的学习路线很长,内容很杂很多,学习曲线很陡打算学习的朋友要做好心理准备,俗话说跟什么样的老师学习十分重要,在这里再做一下关于嵌入式软件学习老师的推荐:朱有鹏老师,一个好的老师对你学习的深浅、学习周期的长短、学习效果的好坏有着非常密切的关系,如果你想学习嵌入式软件,那么我推荐你跟朱有鹏老师来学习(本人亲身体验),朱老师讲的细致入微,面面俱到,又通俗易懂,朱老师有免费的体验课:零基础教你学习Linux、和基于Linux的C语言学习,两个体系的课程都是免费的,他讲的好不好,我不多说大家自己去体会,我是在淘宝上买的他的课(我不是托哈,是真的学习有不错的感觉来给大家推荐,以后不再做相关的推荐)1500RMB左右,全套课程800小时左右,外加一套三星S5PV210(基于ARM Cortex-A8架构)的开发板,一站式讲解,包含嵌入式学习的各个角落。当然如果预算不够也可以跟着学习大纲来自学,但是难度一定是不小的。好了不多说,下面介绍一下我的嵌入式软件学习的大纲:

一、预备知识(基础学习)

  这部分包括Linux基础学习和C语言基础学习,如果你的基础不错可以直接跳过(后期我在做相关分享时也会直接跳过这里,只挑一下晦涩难理解的地方重点分享):

预备知识第一部分-linux基础学习大纲

1.了解当前主流操作系统及其特点					
2.了解什么是双系统与虚拟机						
3.基于VMware搭建自己的linux开发环境												
4.了解什么是隐藏文件与非隐藏文件(与windows系统做对比学习)								
5.了解什么是相对路径与绝对路径(与windows系统做对比学习)									
6.了解linux内核&各个发行版的差别									
7.了解GUI(图形用户界面)和cmdline(命令行)					
8.linux常用命令:例如ls、cd	、pwd&mkdir&mv&touch&cp	、rm&cat&rmdir 、ln(软连接与硬连接)、man、apt-get、										
9.学习linux中的文件类型标记方法															
10.学习什么是编辑器&vi和vim的关系
11.了解vi的两种工作模式								
12.学习vi高级应用:查找&快速切换行&设置显示行号				
13.学习linux命令行中一些符号的含义			
14.学习vi高级应用:行删除&行复制粘贴		
15.了解普通用户与特权用户 su命令切换用户			
16.rwx与linux中权限表示										
17.懂得ubuntu中使用sudo暂时获取root权限			
18.学习linux高阶命令:find、grep&which&whereis、uname&关机重启命令、tree&mount&df、用户管理&权限管理及其他可能用到的高阶命令

预备知识第一部分-C基础学习大纲

1.C语言基本概念
2.C语言程序开发的一般步骤
3.使用printf进行格式化输出	
4.VMware中共享文件夹功能的使用	
5.C语言数据类型之整形	
6.数据类型之整形回顾	
7.数据类型之浮点型
8.数据类型之字符型
9.有符号数和无符号数	
10.C语言运算符之算术运算符
11.复合算术运算符	
12.++与--运算符和代码风格问题
13.运算符总结和顺序结构
14.第一种选择结构if else
15.for循环	
16.第二种选择结构switch case结构
17.循环结构while和do while
18.C语言之函数
19.函数三要素:定义声明和调用
20.函数的形参和实参
21.函数的返回值、函数名
22.C语言之数组
23.数组的初始化
24.不同数据类型的数组
25.sizeof运算符
26.字符数组和字符串
27.C语言之指针
28.C语言之结构体
29.C语言之共用体(Union)	
30.C语言之宏定义
31.宏定义和枚举
32.C语言进阶篇

二、ARM裸机学习

  这里的ARM裸机学习与STM32的裸机学习是完全不同的,这里的裸机学习基于嵌入式系统硬件的,不再是基于windows下的IDE进行开发,而是在Linux中拥有ARM-linux交叉编译链进行开发,通过usb、SD卡多种方式进行烧写。当然ARM裸机的学习不单单是学习ARM裸机,他同样是的针对Linux的基本操作的训练,及学习makefile的制作重定位连接文件的制作等等,对下一步学习Uboot及Linux内核有着至关重要的作用,好了废话不多说,直接上大纲:

ARM琐碎知识的学习(至关重要)

  这部分主要是针对ARM的背景知识和零散杂碎知识的学习,目的是为之后的正式学习做铺垫。这些内容对于初学者来说非常重要。

1.了解ARM的成长史
2.了解ARM的商业模式和生态系统
4.了解开发板的各个版本号学习
5.学习SoC和CPU的区别&外设概念的引入
6.了解主流学习型主芯片
7.详细了解开发板
8.了解嵌入式和单片机的区别
9.学习嵌入式系统的构成特点和演进方向
10.学习什么是交叉编译
11.了解CPU的设计原理、数据总线和地址总线
12.学习Jlink、SD卡等辅助设备的使用及使用原因

ARM裸机第二部分-ARM体系结构与汇编指令

  这部分是ARM裸机学习的第二部分,主要内容是ARM体系结构(指令集和CPU的关系、RISC与CISC、冯诺依曼结构与哈佛结构等)、S5PV210的地址映射、内存外存的连接方式,S5PV210的启动过程详解,S5PV210的编程模式与内部通用寄存器、异常向量表,ARM常用汇编指令等。

1.学习可编程器件的编程原理
2.学习指令集对CPU的意义
3.了解RISC和CISC的区别
4.了解统一编址&独立编址&哈佛结构&冯诺依曼结构
5.深入了解软件编程控制硬件的关键-寄存器
6.学习ARM体系结构要点
7.了解S5PV210的内存映射详解
8.学习CPU和外部存储器的接口
9.学习S5PV210的启动过程详解
11.学习如何在开发板上选择不同启动方式
12.了解ARM的编程模式和7种模式
13.了解ARM的37个寄存器详解
14.学习ARM的异常处理方式
15.学习ARM汇编指令集(简单学习即可))

ARM裸机第三部分-开发板、原理图和数据手册

1.开发板硬件手册带读
2.开发板刷系统(USB\SD两种方式)
3.X210核心板、底板原理图导读
4.S5PV210数据手册导读	
5.x210的dnw刷机
6.linux下使用dd命令刷写uboot

ARM裸机第四部分-GPIO和LED

1.裸机实验体验之usb启动配合dnw工具下载
2.裸机实验体验之SD卡下载
3.自己动手安装交叉编译工具链
4.Makefile大侠隆重登场
5.mkv210_image.c文件详解
6.一步步点亮LED1_硬件工作原理及原理图查阅
7.一步步点亮LED2_数据手册查阅及相关寄存器浏览
8.一步步点亮LED3_从零开始手写汇编点亮LED
9.一步步点亮LED4_使用位运算实现复杂点亮要求
10.一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
11.一步步点亮LED6_再难一点的流水灯效果
12.反汇编工具objdump的使用简介	

ARM裸机第五部分-SDRAM和重定位relocate

1.汇编写启动代码之关看门狗
2.汇编写启动代码之设置栈和调用C语言
3.汇编写启动代码之开iCache
4.重定位引入和链接脚本
5.代码重定位实战
6.SDRAM引入
7.SDRAM初始化
8.汇编初始化SDRAM详解

ARM裸机第六部分-S5PV210的时钟系统

1.SoC时钟系统简介
2.S5PV210的时钟系统简介
3.S5PV210时钟域详解
4.S5PV210时钟体系框图详解
5.时钟设置的关键性寄存器
6.汇编实现时钟设置代码详解
7.C语言实现时钟设置代码详解

ARM裸机第七部分-串口通信详解

1.通信涉及的几个基础概念
2.串口通信的基本概念
3.串口通信的基本原理
4.S5PV210串行通信接口详解
5.S5PV210串行通信编程实战
6.uart stdio的移植
7.串口实验烧录问题总结

ARM裸机第八部分-按键和CPU的中断系统

1.什么是按
2.轮询方式处理按键
3.串口输出和按键消抖
4.S5PV210的中断体系介绍
5.异常向量表的编程处理
6.S5PV210的向量中断控制器
7.S5PV210中断处理的主要寄存器
8.S5PV210中断处理的编程实践
9.外部中断
10.中断方式处理按键编程实践

ARM裸机第九部分-定时器、看门狗和RTC

1.什么是定时器
2.S5PV210中的定时器
3.S5PV210的PWM定时器1
4.S5PV210的PWM定时器2
5.S5PV210的PWM定时器3
6.蜂鸣器和PWM定时器编程实践1
7.蜂鸣器和PWM定时器编程实践2
8.看门狗定时器
9.看门狗定时器的编程实践
10.实时时钟RTC
11.RTC编程实战

ARM裸机第十部分-SD卡启动详解

1.主流的外存设备介绍
2.SD卡的特点和背景知识
3.SD卡的编程接口
.4.S5PV210的SD卡启动详解1
5.S5PV210的SD卡启动详解2
6.S5PV210的SD卡启动实战1
7.S5PV210的SD卡启动实战2
8.解决X210开发板的软开关按键问题

ARM裸机第十一部分-NandFlash和iNand

1.NandFlash的接口
2.NandFlash的结构
3.NandFlash的常见操作及流程分析
4.S5PV210的NandFlash控制器
5.Nand操作代码解析
6.iNand介绍
7.SD卡/iNand操作
8.SD/iNand代码实战分析1
9.SD/iNand代码实战分析2
10.SD/iNand代码实战分析3

ARM裸机第十二部分-I2C通信详解

1.什么是I2C通信
2.由I2C学通信时序
3.S5PV210的I2C控制器
4.X210板载gsensor介绍
5.I2C总线的通信流程
6.I2C通信代码分析1
7.I2C通信代码分析2

ARM裸机第十三部分-ADC

1.ADC的引入
2.ADC的主要相关概念
3.S5PV210的ADC控制器
4.AD转换的编程实践1
5.AD转换的编程实践2

ARM裸机第十四部分-LCD显示器

1.LCD简介
2.LCD的接口技术
3.LCD如何显示图像1
4.LCD如何显示图像2
5.LCD的六个主要时序参数1
.6.LCD的六个主要时序参数2
7.LCD显示的主要相关概念
8.颜色在计算机中的表示
9.S5PV210的LCD控制器
10.LCD编程实战1-LCD控制器初始化
11.LCD编程实战2-显示像素&刷背景
12.LCD编程实战3-横线竖线斜线&画圆
13.LCD编程实战4-写英文中文字符
14.LCD编程实战5-画图
15.LCD编程实战6-画图测试及调试
16.未完成事项展望	

ARM裸机第十五部分-触摸屏TouchScreen

1.输入类设备简介
2.电阻式触摸屏的原理
3.S5PV210的电阻触摸屏控制器
4.电容触摸屏的原理
5.ft5x06电容触摸IC简介

ARM裸机第十六部分-shell原理和问答机制引入

1.shell是什么鬼
2.shell实战1-从零写最简单shell
3.shell实战2-将简易shell移植到开发板中
4.shell实战3-定义标准命令集及解析
5.shell实战4-添加第一个命令
6.shell实战5-添加其他命令1
7.shell实战6-添加其他命令2
8.shell实战7-实现开机倒计时自动执行命令1
9.shell实战7-实现开机倒计时自动执行命令2
10.shell实战8-初步实现环境变量			

二、C语言进阶

内存这个大话题

1.程序运行为什么需要内存1
2.程序运行为什么需要内存2
3.位、字节、半字、字的概念和内存位宽
4.内存编址和寻址、内存对齐
5.C语言如何操作内存
6.内存管理之结构体
7、内存管理之栈
8、内存管理之堆
9、复杂数据结构

C语言位操作

1.常用位操作符
2.位与位或位异或在操作寄存器时的特殊作用
3.如何用位运算构建特定二进制数
4.位运算实战演练1
5.位运算实战演练2
6.技术升级:用宏定义来完成位运算

指针才是C的精髓

1.指针到底是什么?
2.指针带来的一些符号的理解
3.野指针问题
4.const关键字与指针
5.深入学习一下数组
6.指针与数组的天生姻缘
7.指针与强制类型转换
8.指针、数组与sizeof运算符
9.指针与函数传参
10.输入型参数与输出型参数	

C语言复杂表达式与指针高级应用

1.指针数组与数组指针
2.函数指针与typedef
3.函数指针实战1
4.函数指针实战2
5.再论typedef
6.二重指针
7.二维数组
8.二维数组的运算和指针

数组&字符串&结构体&共用体&枚举

1.程序中内存从哪里来1
2.程序中内存从哪里来2
3.程序中内存从哪里来2
4.程序中内存从哪里来4
5.C语言的字符串类型
6.字符串和字符数组的细节
7.C语言之结构体概述
8.结构体的对齐访问1
9.结构体的对齐访问2
10.结构体的对齐访问3
11.offsetof宏与container_of宏
12.共用体union
13.大小端模式1
14.大小端模式2
15.枚举

C语言宏定义与预处理、函数和函数库

1.C语言预处理理论
2.C语言预处理代码实战
3.宏定义1
4.宏定义2
5.函数的本质
6.函数的基本使用
7.递归函数
8.函数库
9.字符串函数
10.数学库函数
11.自己制作静态链接库并使用
12.自己制作动态链接库并使用

三、uboot与linux内核移植

uboot学习前传

1.为什么要有uboot
2.为什么是uboot
3.uboot必须解决哪些问题
4.uboot的工作方式
5.uboot的常用命令1
6.uboot的常用命令2
7.开发板和主机的ping通
8.uboot的常用命令3
9.uboot的常用命令4
10.uboot的常用环境变量1
11.uboot的常用环境变量2

补基础之shell和Makefile

1.shell介绍
2.动手写第一个shell
3.shell编程学习1
4.shell编程学习2
5.shell中的循环结构
6.shell中其他值得关注的知识点
7.Makefile基础回顾
8.Mafile补充学习1
9.Makefile补充学习2

零距离初体验uboot

1.X210官方uboot配置编译实践1
2.X210官方uboot配置编译实践2
3.uboot的源码目录分析1
4.uboot的源码目录分析2
5.uboot的源码目录分析3
6.SourceInsight的基本使用

uboot配置和编译过程详解

1.uboot主Makefile分析1
2.uboot主Makefile分析2
3.uboot主Makefile分析3
4.uboot主Makefile分析4
5.uboot主Makefile分析5
6.uboot主Makefile分析6
7.uboot配置过程详解1
8.uboot配置过程详解2
9.uboot的链接脚本

uboot源码分析1-启动第一阶段

1.start.S引入
2.start.S解析1
3.start.S解析2
4.start.S解析3
5.start.S解析4
6.start.S解析5
7.start.S解析6
8.start.S解析7
9.uboot重定位详解
10.start.S解析8
11.start.S解析9
12.start.S解析10
13.start.S解析11

uboot源码分析2-启动第二阶段

1.start_armboot函数简介
2.start_armboot解析1
3.内存使用排布
4.start_armboot解析2
5.start_armboot解析3
6.start_armboot解析4
7.start_armboot解析5
8.start_armboot解析6
9.start_armboot解析7
10.start_armboot解析8
11.start_armboot解析9
12.start_armboot解析10
13.start_armboot解析11
14.start_armboot解析12
15.start_armboot解析13
16.start_armboot解析14
17.uboot启动2阶段总结

uboot源码分析3-uboot如何启动内核

1.uboot和内核到底是什么
2.启动内核第一步:加载内核到DDR中
3.zImage和uImage的区别联系
4.zImage启动细节
5.uImage启动
6.do_bootm_linux函数
7.传参详解
8.uboot启动内核的总结

uboot源码分析4-uboot的命令体系

1.uboot命令体系基础
2.uboot命令解析和执行过程分析
3.uboot如何处理命令集1
4.uboot如何处理命令集2	
5.uboot中增加自定义命令

uboot源码分析5-uboot的环境变量

1.uboot的环境变量基础
2.环境变量相关命令源码解析1
3.环境变量相关命令源码解析2
4.环境变量相关命令源码解析3
5.uboot内部获取环境变量

uboot源码分析6-uboot的硬件驱动部分

1.uboot与linux驱动
2.iNand/SD驱动解析1
3.iNand/SD驱动解析2
4.iNand/SD驱动解析3

uboot的移植1-从三星官方uboot开始移植

1.移植前的准备工作
2.ubuntu14.04上网及安装openssh
3.移植初体验
4.时钟和DDR的配置移植
5.DDR地址另外配置
6.DDR地址另外配置2
7.inand驱动问题的解决
8.一些小问题的修补
9.网卡驱动移植1
10.网卡驱动移植2
11.网卡驱动如何工作
12.使用自己移植的uboot启动内核

uboot的移植2-从uboot官方标准uboot开始移植

1.选择合适的官方原版uboot
2.先初步浏览官方原版uboot
3.mkconfig脚本分析
4.先解决官方版本uboot的烧录运行
5.start.S文件分析与移植1
6.start.S文件分析与移植2
7.添加DDR初始化1
8.添加DDR初始化2
9.添加uboot第二阶段重定位1
10.添加uboot第二阶段重定位2
11.CPU时钟信息显示移植1
12.CPU时钟信息显示移植2
13.CPU时钟信息显示移植3
14.board和DDR配置显示移植
15.board_init_r移植
16.uboot2013.10中SD/MMC驱动浏览
17.SD卡驱动移植1
18.SD卡驱动移植2
19.SD卡驱动移植3
20.环境变量的移植
21.环境变量的测试和配置移植
22.网卡驱动的移植1
23.网卡驱动的移植2

uboot杂记-logo显示和fastboot原理等

1.X210的uboot中LCD操作分析
2.logo显示和LCD屏幕分辨率适配
3.fastboot的基本分析
4.uboot的fastboot代码分析1
5.uboot的fastboot代码分析2

话说linux内核

1.内核和发行版的区别
2.内核和驱动的关联
3.内核和应用程序、根文件系统的关联
4.linux内核的模块化设计
5.选择合适版本的内核

内核的配置和编译原理

1.linux内核源码目录结构1
2.linux内核源码目录结构2
3.内核配置和编译体验
4.内核的配置原理1
5.menuconfig的使用和演示
6.menuconfig的工作原理
7.Kconfig文件详解1
8.Kconfig文件详解2
9.menuconfig的实验学习思路

内核的启动过程分析

1.做好内核分析的准备工作
2.head.S文件分析1
3.内核启动的汇编阶段
4.内核启动的C语言阶段1
5.内核启动的C语言阶段2
6.内核启动的C语言阶段3
7.内核启动的C语言阶段4
8.内核启动的C语言阶段5
9.内核启动的C语言阶段6
10.init进程详解1
11.init进程详解2
12.cmdline常用参数
13.内核中架构相关代码简介

内核的移植1-从三星官方内核开始移植

1.内核移植初体验
2.初步移植以看到启动信息
3.内核中机器码的确定
4.解决内核启动中的错误
5.iNand的问题和安排
6.网卡驱动的移植和添加实验
7.内核启动第一阶段的调试方法

根文件系统的原理

1.根文件系统概述
2.根文件系统的形式
3.自己制作ext3格式的根文件系统
4.nfs方式启动自制简易文件夹形式的rootfs
5.到底什么是linuxrc
6.rootfs中还应该有什么
7.VFS简介

根文件系统构建实验及过程详解

1.根文件系统的构建路线
2.busybox的移植实战
3.inittab详解
4.busybox源码分析1
5.busybox源码分析2
6.rcS文件介绍1
7.rcS文件实战1
8.rcS文件介绍2
9.profile文件和用户登录理论
10.用户登录实战
11.动态链接库的拷贝
12.开机自启动与主流rcS格式介绍
13.制作ext2格式的镜像并烧录启动

buildroot的引入和介绍

1.X210的bsp介绍
2.mk文件分析
3.buildroot引入

四、linux应用编程和网络编程

linux中的文件IO

1.应用编程框架介绍
2.文件操作的主要接口API
3.一个简单的文件读写实例
4.open函数的flag详解1
5.open函数的flag详解2
6.文件读写的一些细节
7.linux系统如何管理文件
8.lseek详解
9.多次打开同一文件与O_APPEND
10.文件共享的实现方式
11.文件描述符的复制1
12.文件描述符的复制2
13.fcntl函数介绍
14.标准IO库介绍

文件属性

1.linux中各种文件类型
2.常用文件属性获取
3.stat函数的应用案例
4.文件权限管理1
5.文件权限管理2
6.读取目录文件

获取系统信息(系统时间、随机数、proc中的文件)

1.关于时间的概念
2.linux系统中的时间
3.时间相关API实战1
4.时间相关API实战2
5.linux中使用随机数
6.proc文件系统介绍
7.proc文件系统的使用

进程(进程环境、进程控制、进程关系、守护进程、进程间通信)

1.程序的开始和结束
2.进程环境
3.进程的正式引入
4.fork创建子进程
5.父子进程对文件的操作
6.进程的诞生和消亡
7.父进程wait回收子进程
8.waitpid介绍
9.exec族函数及实战1
10.exec族函数及实战2
11.进程状态和system函数
12.进程关系
13.守护进程的引入
14.编写简单守护进程
15.使用syslog来记录调试信息
16.让程序不能被多次运行
17.linux的进程间通信概述
18.linux的IPC机制1-管道
19.SystemV IPC介绍

信号

1.什么是信号
2.常见信号介绍
3.进程对信号的处理
4.alarm和pause函数

高级IO

1.非阻塞IO
2.阻塞式IO的困境
3.并发式IO的解决方案
4.IO多路复用原理
5.IO多路复用实践
6.异步IO
7.存储映射IO

线程

1.再论进程
2.线程的引入
3.线程常见函数
4.线程同步之信号量1
5.线程同步之信号量2
6.线程同步之互斥锁 
7.线程同步之条件变量

网络基础

1.网络通信概述
2.网络通信基础知识1
3.网络通信基础知识2
4.网络通信基础知识3
5.网络通信基础知识4
6.网络通信基础知识5

linux网络编程

1.linux网络编程框架
2.TCP协议的学习1
3.TCP协议的学习2
4.socket编程接口介绍
5.IP地址格式转换函数实践
6.soekct实践编程1
7.soekct实践编程2
8.socket实践编程3
9.socket编程实践4

五、linux驱动开发

驱动怎么学

1.什么是驱动1
2.什么是驱动2
3.模块化设计
4.linux设备驱动分类
5.驱动程序的安全性要求
6.驱动应该这么学

字节设备驱动基础

1.开启驱动开发之路
2.最简单的模块源码分析1
3.最简单的模块源码分析2
4.最简单的模块源码分析3

字符设备驱动高级

1.注册字符设备驱动新接口1
2.注册字符设备驱动新接口2
3.注册字符设备驱动新接口3
4.注册字符设备驱动新接口4
5.字符设备驱动注册代码分析1
6.字符设备驱动注册代码分析2
7.自动创建字符设备驱动的设备文件
8.设备类相关代码分析1
9.设备类相关代码分析2
10.静态映射表建立过程分析
11.动态映射结构体方式操作寄存器
12.内核提供的读写寄存器接口

驱动框架入门之LED

1.何谓驱动框架
2.内核驱动框架中LED的基本情况
3.初步分析led驱动框架源码
4.在内核中添加或去除某个驱动
5.基于驱动框架写led驱动1
6.linux内核的gpiolib学习1
7.使用gpiolib完成led驱动
8.将驱动添加到内核中

linux设备驱动模型

1.linux设备驱动模型简介
2.设备驱动模型的底层架构
3.总线式设备驱动组织方式
4.platform平台总线简介

misc类设备与蜂鸣器驱动

1.板载蜂鸣器驱动测试
2.misc类设备介绍
3.misc驱动框架源码分析1
4.misc驱动框架源码分析2
5.蜂鸣器驱动源码分析1
6.蜂鸣器驱动源码分析2

framebuffer驱动详解

1.framebuffer介绍
2.framebuffer应用编程实践1
3.framebuffer应用编程实践2
4.framebuffer应用编程实践3
5.framebuffer驱动框架总览
6.framebuffer驱动框架分析1
7.framebuffer驱动框架分析2
8.framebuffer驱动框架分析3
9.framebuffer驱动分析1
10.framebuffer驱动分析2
11.framebuffer驱动分析3
12.framebuffer驱动分析4
13.framebuffer驱动分析5
14.应用层为何不能设置分辨率
15.折腾内核的启动logo

input子系统基础之按键

1.什么是input子系统
2.input设备应用层编程实践1
3.input设备应用层编程实践2
4.input子系统架构总览1
5.input子系统架构总览2
6.输入核心层源码分析1
7.输入核心层源码分析2
8.输入事件驱动层源码分析
9.输入设备驱动层源码分析1
10.输入设备驱动层源码分析2
11.中断方式按键驱动实战1
12.中断方式按键驱动实战2

触摸屏驱动移植实战

1.触摸屏驱动概览
2.内核中的竞争状态和互斥1
3.内核中的竞争状态和互斥2
4.中断的上下半部1
5.中断的上下半部2
6.linux内核的I2C子系统详解1
7.linux内核的I2C子系统详解2
8.linux内核的I2C子系统详解3
9.linux内核的I2C子系统详解4
10.linux内核的I2C子系统详解5
11.linux内核的I2C子系统详解6
12.linux内核的I2C子系统详解7
13.gslX680驱动的移植实践
14.gslX680驱动源码分析2
15.gslX680驱动源码分析2
16.老版本触摸屏的驱动

5.10.块设备驱动介绍

1.正确理解块设备驱动的概念
2.块设备驱动框架简介
3.块设备驱动案例分析1
4块设备驱动案例分析2
5.块设备驱动案例分析3

网络设备驱动介绍

1.网络设备驱动概述
2.虚拟网卡驱动分析1
3.虚拟网卡驱动分析2
4.DM9000驱动源码分析1
5.DM9000驱动源码分析2

结束语

  以上就是我在从朱老师物联网大讲堂整理到的嵌入式软件学习的全部大纲,往后的分享,我会按照大纲的顺序,以我自己的个人理解为主进行分享。在这里非常感谢朱有鹏老师搭建的这个庞大的嵌入式学习体系和平台如此繁杂的内容,如果自学谁都不敢保证要耗时多长时间,朱老师的课总时长共800个小时,按照我自己的学习速度每天7-8小时嵌入式学习时间(3-4小时视频播放时间),完全学完需要6-7个月的时间,可见嵌入式学习的路线之长。
  好了最后,再好的老师也带不出懒惰的学生,学习还是要依靠自己的个人努力去寻找更加美好的明天。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章