嵌入式系统里你需要知道的东西

需要掌握的及学习资料

STM32单片机

1.库函数编程以及寄存器操作
2.复杂外设:DMA、ADC、DAC、PWM、IIc、SPI、jtag调试、中断、时钟系统
3.高级模块:蓝牙、WiFi、摄像头、键盘鼠标、USB

书+开发板

正点原子,资料齐全,视频配套

博客+自己做笔记

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  内核

想成为高手,内核必须深刻了解。注意,我说的是了解,我没奢望去写出一个内核。
要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。

内核调度机制、内存管理机制和文件管理机制是操作系统的三大核心组件,每个部分都充满了智慧和魔法。如果你是一位极客,那么理解这三大机制就像是探索一个充满未知和挑战的魔法世界。

内核调度机制:时间的魔法师

想象一下,你是一个强大的时间魔法师,有能力控制时间的流动和分配。在你的魔法世界里,有无数个任务(进程)在争夺你的注意力,希望得到更多的时间片来完成自己的任务。你的任务是通过你的魔法(调度算法),决定哪些任务应该优先得到时间,哪些应该稍后再说。

你可能会用先来先服务(FCFS)这种简单直接的魔法,让最先请求你注意的任务先执行;或者使用更复杂的时间片轮转(Round Robin)魔法,公平地将时间片分配给每个任务;亦或是动用优先级调度(Priority Scheduling)的法术,优先考虑那些最重要的任务。

内核调度机制负责决定哪个进程或线程应当在处理器上运行。这个决策基于调度算法,旨在最大化CPU利用率、保证系统响应时间最小、并提供公平的资源分配给所有进程。

  • 先来先服务(FCFS): 一个简单的调度算法,按照进程到达的顺序执行。
  • 短作业优先(SJF): 选择预计执行时间最短的进程执行,以减少平均等待时间。
  • 时间片轮转(Round Robin, RR): 每个进程被分配一个时间片,以轮流的方式运行,实现公平调度。
  • 优先级调度: 进程根据优先级被调度,优先级高的先执行。
  • 多级队列: 将进程分入不同的队列,每个队列有自己的调度算法。

内存管理机制:空间的巫师

内存管理机制就像你是一个掌握空间魔法的巫师,管理着一个巨大的魔法图书馆。每本魔法书(程序)都需要在图书馆中找到自己的位置(内存空间),以便被读取和使用。你的任务是确保每本书都能找到合适的位置,同时还要确保图书馆的空间被高效利用,没有浪费。

你可能会使用分页(Paging)这个技巧,将图书馆划分成许多小空间,让不同的书占据不同的空间;或者利用分段(Segmentation),根据书的类型和大小来分配空间;在更高级的情况下,你可能还会使用虚拟内存(Virtual Memory)的魔法,通过魔法创造出看似无限的空间,即使实际上的图书馆并没有那么大。

内存管理是操作系统中用于管理主存(RAM)的一系列功能。它负责进程的分配和释放内存空间,确保每个进程都有足够的内存来执行,同时保护进程之间的内存不被相互干扰。

  • 分页(Paging): 将物理内存和虚拟内存分割成固定大小的页。每个进程有自己的页表,用于映射虚拟地址到物理地址。
  • 分段(Segmentation): 内存分割为逻辑上的段,每个段有不同的长度,反映了程序的逻辑结构。
  • 虚拟内存(Virtual Memory): 允许程序使用比物理内存更大的地址空间,通过将数据在磁盘和RAM之间交换来实现。

文件管理机制:信息的守护者

作为信息的守护者,你负责管理和保护世界上所有的知识和信息。在你的魔法图书馆里,每个文件和目录都是一个知识的容器,你需要确保它们组织有序,同时还要保护它们不受外界的威胁。

你可能会使用文件系统(File System)的结构魔法,来组织这些文件和目录,确保每个人都能快速找到他们需要的知识。你也可能会施加权限控制(Permissions)的保护咒语,限制只有特定的人才能访问某些特别的知识。在处理大量数据时,你还会使用到索引(Indexing)这种高级技能,以便于快速检索信息。

文件管理系统是操作系统用于存储、检索和更新数据文件的一部分。它提供了一个方法来组织、访问和存储在存储设备上的数据。

  • 文件系统(File System): 定义了存储、组织和访问文件的方法。常见的文件系统包括FAT32、NTFS、EXT4等。
    负责管理和存储文件及目录在存储设备上的方式,包括如何组织数据、提供对数据的访问以及管理空间的分配和使用。

    FAT32【广泛兼容性->可移动存储设备的首选文件系统】

    • 全称: File Allocation Table 32

    • 推出年代: 1996年

    • 主要特点:

      • 广泛的兼容性,几乎所有的操作系统和设备都支持读写FAT32文件系统。
      • 文件大小限制为4GB,分区大小限制为2TB(在某些操作系统中可以扩展到16TB)。
      • 不支持文件权限管理和其他高级功能,如日志或加密。
      • 适合用于USB闪存驱动器、SD卡等可移动存储设备。

    NTFS【丰富的功能和强大的数据安全性->广泛应用于Windows环境】

    • 全称: New Technology File System

    • 推出年代: 1993年,随Windows NT 3.1一起发布

    • 主要特点:

      • 支持大文件和大存储容量,理论上的最大文件大小和卷大小都达到了16EB(1EB = 1亿GB)。
      • 提供文件权限管理、加密、磁盘配额、硬链接、日志记录等高级功能。
      • 支持文件系统压缩和自动修复。
      • 主要用于Windows操作系统。

    EXT4【高效性和可靠性->Linux系统的标准文件系统】

    • 全称: Fourth Extended Filesystem

    • 推出年代: 2008年

    • 主要特点:

      • 是Linux操作系统默认的文件系统。

      • 支持最大1EB的文件系统大小和16TB的单个文件大小。

      • 提供了日志功能,增加了数据的安全性。

      • 支持延迟分配(delayed allocation)、块分配(block allocation)等高级特性,提高存储效率和性能。

      • 支持透明压缩、加密和快照功能。

  • 权限控制: 文件和目录被分配有不同的访问权限,包括读(r)、写(w)和执行(x),以保护数据安全。
  • 索引结构: 为了快速访问文件,文件系统可能使用索引结构(如B树或哈希表)来快速定位文件。

3  驱动

驱动包含两部分:硬件本身的操作、驱动程序的框架。
又是硬件,还是要看得懂原理图、读得懂芯片手册,多练吧。
把你手上的开发板所涉及的硬件,都去尝试写一个驱动。
有问题就先"痛苦地思考",思考的过程中你会把很多不相关的知识串联起来,最终贯通。

4  根文件系统

1. 对于Linux做出来的产品,有些用作监控、有些做手机、有些做平板。那么内核启动后,挂载根文件系统后,应该启动哪一个应用程序呢?
答:内核不知道也不管应该启动哪一个用户程序。它只启动init这一个应用程序,它对应/sbin/init。
显然,这个应用程序就要读取配置文件,根据配置文件去启动用户程序(监控、手册界面、平板界面等等)。
这个问题提示我们,文件系统的内容是有一些约定的,比如要有/sbin/init,要有配置文件。
2. 你写的hello,world程序,有没有想过里面用到的printf是谁实现的?
答:这个函数不是你实现的,是库函数实现的。它运行时,得找到库。
这个问题提示我们,文件系统里还要有库。

来源:嵌入式系统,你知道怎么学吗?就是这么简单 - 嵌入式系统 - 电子工程世界-论坛 (eeworld.com.cn) 

 

posted @ 2023-08-25 21:38  asandstar  阅读(66)  评论(0编辑  收藏  举报