嵌入式系统里你需要知道的东西
需要掌握的及学习资料
STM32单片机 |
1.库函数编程以及寄存器操作 |
书+开发板 正点原子,资料齐全,视频配套 博客+自己做笔记 |
cortex M3内部结构 | STM32的内部结构和cortex M3内核结构 | 《cortex M3/M4权威指南》 |
C语言进阶 | C指针、数据结构 |
《C和指针》 《C primer》 《数据结构与算法分析》 |
实时操作系统 |
freertos 或者 ucos操作系统 下载源码,学会移植,学习操作系统基本结构,深入掌握操作系统调度和内存管理 |
源码+手册+大佬博客 |
应用层 | 学习一点C++或者C#,常识写上位机程序,Windows的应用程序 |
一般嵌入式的大厂大都要求有Linux开发经验,
按照顺序:先学会使用Linux,再学习Linux内核。Linux十分庞大,弄懂一个组件或者一项就能找个不错的工作。
Linux应用层编程、Linux系统编程、ARM体系结构(嵌入式一般先学ARM架构,其他架构工作中再学)
Linux驱动、Linux内核基本模块:内存管理,任务调度,文件系统。弄懂一个需要很多时间。
书籍
《Unix环境高级编程》【】
《Linux内核设计与实现》【】
《Linux系统编程》【】
《深入理解Linux内核》【】
《Linux设备驱动开发详解》【】
《Linux设备驱动程序内核机制》【】
《Linux内核情景分析》【】
《ARM体系结构与编程》【】
《ARM嵌入式系统开发:软件设计与优化》【】
______________________________________________________________
来源:https://www.zhihu.com/question/322341076/answer/1068611110
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
______________________________________________________________
嵌入式学习建议
1.多参加比赛,配合软硬件开发调试的经历对今后发展很有帮助
2.开发板购买资料齐全的
3.进阶时最好不要按某模块顺序学习,而是先定需求再学模块(从目标到学习,效果更好)
需求的例子:
①用串口完成PC和设备通讯
②串口使用自定义协议,包含起始位、地址、数据、结束位、CRC校验
③通过串口管理外部设备如复位、蜂鸣器、设置DA输出、获取AD值,并在界面显示
④支持串口在线升级,存储使用外部FLASH,下载支持断点重传,版本检验和完整性检验
⑤上位机开发支持自定义串口协议软件,用常用的可以实现图像界面的语言和框架,如c#,c++,python
⑥支持自定义协议替换为FreeModbus协议,使用宏切换
……
用Web端,通过浏览器实现上述功能
【分解为小模块进行实现】
4.总结!写文档或写博客发表,完成比完美更好。调试成功了AD、串口通讯协议等等都可以发,分享开发心得和解决问题的思考过程与步骤。能写出来讲给别人听一定是经过思考的。
5.早点定位行业,积累工作经验!
来源:玩嵌入式,一般怎么入门? - 听心跳的声音的回答 - 知乎
嵌入式Linux
C语言基础
汇编基础有没有无所谓。
C语言学习程度:越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。
学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。
1 bootloader
稍微复杂的裸板程序。但要把裸板程序看懂、写好,不容易。(Windows下好用的工具弱化了我们的编程能力)
1. 一上电,CPU从哪里取指令执行?
答:一般从Flash上指令。
2. 但是Flash一般是只能读不能直接写的,如果我用到全局变量,这些全局变量在哪里?
答:全局变量应该在内存里
3. 那么谁把全局变量放到内存里去?
答:长期用ADS、KEIL的朋友,你能回答吗?这需要"重定位"。在ADS或KEIL里,重定位的代码是制作这些工具的公司帮你写好了。
4. 内存那么大,我怎么知道把"原来存在Flash上的内容"读到内存的"哪个地址去"?
答:这个地址用"链接脚本"决定,在ADS里有scatter文件,KEIL里也有类似的文件。
5. 你说重定位是把程序从Flash复制到内存,那么这个程序可以读Flash啊?
答:是的,要能操作Flash。当然不仅仅是这些,还有设置时钟让系统运行得更快等等。
bootloader裸板程序的3部分要点:
1. 对硬件的操作
需要看原理图、芯片手册。这需要一定的硬件知识,不求你能设计硬件,但是至少能看懂; 不求能看懂模拟电路,但是要能看懂数字电路。(require: 微机原理、数字电路)
芯片手册是肯定要读的,别去找中文的,就看英文的。开始是非常痛苦,以后就会发现那些语法、词汇一旦熟悉后,读任何芯片手册都很容易。
2. 对ARM体系处理器的了解
看杜春蕾的<arm体系架构与编程>吧,里面讲有汇编指令,有异常模式、MMU等。
网上找的电子书链接 https://pan.baidu.com/s/1AYpTxklTRXCpqGV6hD3UzQ 提取码:j7ku
3. 程序的基本概念:重定位、栈、代码段数据段BSS段
去看编译原理。
2 内核
想成为高手,内核必须深刻了解。注意,我说的是了解,我没奢望去写出一个内核。
要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。
3 驱动
驱动包含两部分:硬件本身的操作、驱动程序的框架。
又是硬件,还是要看得懂原理图、读得懂芯片手册,多练吧。
把你手上的开发板所涉及的硬件,都去尝试写一个驱动。
有问题就先"痛苦地思考",思考的过程中你会把很多不相关的知识串联起来,最终贯通。
4 根文件系统
1. 对于Linux做出来的产品,有些用作监控、有些做手机、有些做平板。那么内核启动后,挂载根文件系统后,应该启动哪一个应用程序呢?
答:内核不知道也不管应该启动哪一个用户程序。它只启动init这一个应用程序,它对应/sbin/init。
显然,这个应用程序就要读取配置文件,根据配置文件去启动用户程序(监控、手册界面、平板界面等等)。
这个问题提示我们,文件系统的内容是有一些约定的,比如要有/sbin/init,要有配置文件。
2. 你写的hello,world程序,有没有想过里面用到的printf是谁实现的?
答:这个函数不是你实现的,是库函数实现的。它运行时,得找到库。
这个问题提示我们,文件系统里还要有库。
来源:嵌入式系统,你知道怎么学吗?就是这么简单 - 嵌入式系统 - 电子工程世界-论坛 (eeworld.com.cn)