嵌入式驱动学习路线
Posted 一口Linux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式驱动学习路线相关的知识,希望对你有一定的参考价值。
网上看了很多的嵌入式学习路线,有的比较片面,有的为了博人眼球东拼西凑,几乎把整个行业用得着用不着的技术都写上去了,没有侧重点,简直是劝退指南,还有的纯粹是打广告卖板子招生。
一口君曾经是某见的教学总监,带过的学生也有大几千了,基本都从事linux相关开发工作。
现在在各行各业也基本都是翘楚,有的都成公司技术主管,带领几十人上百人团队。
一口君凭借多年的研发和开发经验,整理了嵌入式学习的最经典路线
下面就为大家介绍学习路线:
一、基础
1. linux基本操作:
个人建议只要会一些基本的操作就行了,不需要太深入的学习每一个命令,用到的时候会去搜索就行了。
《Linux入门的基础知识点汇总,有这篇就够了》
《linux驱动、ARM学习环境搭建》
《一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解》
需要掌握的知识如下:
- 环境的搭建:ubuntu、vmware安装
- Linux目录结构;
- 文件类型;
- 基本目录操作,文件操作,vim,ifconfig,ping,cd,cp,mv,mkdir等,最关键是gcc命令要会用;
- 一些简单的shell脚本;
- Makefile的编写。
2. c语言:
所谓编程不学C语言,便称码农也枉然。
学Linux,不学编程,建议就不要学了,否则职业后期全是瓶颈。
那些和你说学Linux不需要懂编程的都是再耍LM。
学习C语言一定要学习Linux下C编程,C语言网上视频也很多,知识点不一一介绍了。
但是有一点,就是一定要记住,一般的程序员从入门到绝对的精通大概需要2年时间,要想随心所欲写出超高质量的代码,时间因人而异,还要看个人造化。
实际上并不需要每个人都成为大师,能成为一个快快乐乐的小码农,不也是见开心的事吗?
3. 数据结构:
数据结构很重要,但是在这个上面花太多时间,也是没必要的。想进大厂的除外,自己拼命去刷题吧。
对于嵌入式方向来说,个人建议只要掌握几个基本的排序和查找算法即可,没必要把所有算法都研究一遍。
《玩转内核链表list_head,如何管理不同类型节点的实现(万字文)可以收藏》
《十大经典排序算法(代码实现),建议收藏》
《20张图揭开「队列」的迷雾》
《二叉树详解,非常全,还包含C代码》
- 能掌握常见的算法比如:冒泡排序、直接插入排序、快速排序、二叉树等。
- 链表:双向链表,增删改查。
4. 基础阶段项目
基础阶段,个人强烈建议一定要做一个综合性项目,一定要从0开始写。
建议项目
《电话本管理软件》
该项目包含的知识点、功能点:
- 包含简单的菜单功能
- 链表:包括增、删、改、查、排序等操作的双向链表。
- 结构体、数组、指针、二级指针,字符串操作
- 排序
- 用户登录
- 用户电话号码信息的添加、删除、修改
二、进阶
进阶阶段知识点很重要,即使以后你不做linux c开发,有了这些基础,你再去学java、c++你的视野一定会不一样。
Linux中常见同步和互斥机制设计原理
Linux信号量(1)-SYSTEM V
Linux信号量(2)-POSIX 信号量
Linux互斥锁(1)-线程互斥锁
嵌入式数据库sqlite3【基础篇】-基本命令操作,小白一看就懂必看
嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门必看
如何用C语言操作sqlite3,一文搞懂必看
搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?必看
一个多线程的简单例子让你看清线程调度的随机性粉丝提问
Linux库概念,动态库和静态库的制作,如何移植第三方库必看
两个线程,两个互斥锁,怎么形成一个死循环? 粉丝提问
用了这么多年Linux,你清楚控制台、终端与shell及它们的关系吗?
多线程详解,一篇文章彻底搞懂多线程中各个难点
[粉丝问答6]子进程进程的父进程关系必看
22张图详解浏览器请求数据包如何到达web服务器(搞懂网络可以毕业了)
一个端口号可以同时被两个进程绑定吗? 粉丝提问
【粉丝问答7】局域网内终端是如何访问外网?答案在最后 粉丝提问
一文包你学会网络数据抓包 粉丝提问
【视频】教你如何抓取网络中的数据包!黑客必备技能
网络/命令行抓包工具tcpdump详解 粉丝提问
【粉丝问答11】如何在内网搭建TCP服务器并能被外网直接访问粉丝提问
从0实现基于Linux socket聊天室-多线程服务器模型-1
从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2
从0实现基于Linux socket聊天室-实现聊天室的登录、注册功能-3
从0实现基于Linux socket聊天室-增加公聊、私聊-4 必看
1. 文件IO
- 掌握Linux文件IO的一套系统调用API:open、read、write、lseek,close等。
- 熟练写出文件拷贝等功能模块。
- 理解I/O、缓冲的概念。
在Linux下,一切皆文件,我们操作操作许许多多的外设(字符设备、套接字、文件等等)就像操作文件一样。
要想知道如何操作文件和外设,我们就必须熟练掌握文件IO,这是我们学习Linux下面编程最基本的知识点。
2. 进程线程
- 进程与线程的概念
- 掌握常用的函数fork、exec族函数等api;
- 进程创建、回收,一个.c源文件变成可执行程序的过程;
- 常用的进程相关命令:ps、top、crontab、at;
- 进程间通信:信号量、消息队列、共享内存、管道、信号;
- 守护进程;
- 线程创建、同步互斥,互斥锁;
- 库的概念,什么是动态库和静态库,如何自己制作动态库和静态库。
进程、线程是我们学习Linux下系统编程非常重要的一个知识点,必须掌握。
3. 网络编程
- TCP/IP协议分层以及每一层的功能;不要看OSI,只要知道即可;
- socket api的使用,
- tcp、udp;C/S架构如何创建;
- 套接字属性的设置;
- C/S架构;
- 多进程、多线程网络服务器模型;
- 任意一款抓包工具使用;
- 常见的网络协议分析:ping、 tftp、 ftp 等。
网络的重要性不言而喻,应用实在太广了,网络的知识也非常的复杂:网络编程、TCP/IP协议栈、网络拓扑、网卡驱动、各种无线通信协议。
可以收每一大块知识的学习,都需要很长一段时间来入门,并需要一定难度的项目做支撑,才能真正了解和掌握网络。
对于嵌入式方向初学者,我们最好先了解一些基础的网络协议知识,然后学习套接字的使用。
4. 进阶项目
该阶段可以选择综合项目《多线程聊天室》,实现公聊、私聊、注册登录,互相发送文件等功能。
《从0实现基于Linux socket聊天室》
三、高阶
该阶段学习需要开发板配合,建议新手先把之前内容打扎实,再进入这个阶段学习。
开发板的选择,最重要的是资料!资料!资料!资料!资料!资料!资料!资料!
没有资料的板子不要买!
大家也可以参考我写的《ARM系列文章》
1. ARM
- arm架构、arm的模式、arm指令,寻址,异常,中断,异常向量表,
- 伪指令、C语言和汇编代码的互相调用、内联汇编;
- 学会查看常见电路图,了解数据线、信号线、地址线、中断线,常见外设电路图
- 学会查看各种芯片的用户手册
- *常见的外设的裸机驱动开发,led、key、adc、pwm、rtc、看门狗、i2c、spi、网卡、flash、USB等
这个阶段的内容,对于了解整个计算机软件的工作原理非常重要,Linux内核的很多机制都要依赖汇编指令,尤其ARM工作模式、寻址、异常,中断,异常向量表这些概念。
可以说,掌握了这个阶段的内容,那么单片机、STM32真的就是手到擒来了!
2. 系统移植
- uboot移植、rootfs制作、内核剪裁移植,
- usb、网卡驱动移植,
- uboot、linux启动流程,
- 自己添加uboot命令
这一阶段的内容对于嵌入式工程师来说,在做实际项目的时候,会经常用到,各个厂家的移植步骤会有所差异,但原理基本相同,熟练掌握这些操作,非常必要。
3. Linux驱动
- 字符设备架构、inode、cdev、file_operations、file之间关系;
- platform总线、设备树;
- 内存概念
- 同步互斥机制,自旋锁、信号量、互斥体,原子操作;
- 中断、中断底半部;
- 等待队列,poll的实现;
- 常见设备的驱动的编写和代码分析;
- 网络设备:网卡驱动分析、netfilter使用;
- USB、TTY、SPI、IIC、PCIE等架构。
能够学到这个阶段,那么恭喜你,你可以称为一名真正合格的嵌入式工程师了。
Linux驱动我们学习Linux内核最好的一个入口,
在这庞大、浩瀚、错综复杂的内核代码中找到一个突破口,
从而真正走向大神之路!
驱动的学习,主要在于多捋架构,多阅读大牛的代码!
代码读百遍,其义自见!
代码中自由颜如玉,代码中自由黄金屋!
每天抱着内核看,像泡女人一样泡她,迟早你会成为大师。
四、终极
我想如果能学到这个份上,后面如何发展,已经不需要一口君再多费唇舌了,可以继续学习安卓、QT,也可以深挖物联网、算法,AI、VR、大数据或者钻研Linux内核优化内核等,每个领域独当一面,收入都不会低。
最后给打大家一个建议,学习编程没有任何捷径可以走,告诉你可以速成的,最好留个心眼。
以上是关于嵌入式驱动学习路线的主要内容,如果未能解决你的问题,请参考以下文章