姓名:李声源 学号:19020100177 学院:电子工程学院
转自https://www.zhihu.com/question/332475450/answer/736953643
【嵌牛导读】在IT领域,嵌入式系统占有着举足轻重的地位,本文主要介绍自学嵌入式系统的基本方法。
【嵌牛鼻子】自学嵌入式
【嵌牛提问】你知道如何自学嵌入式系统吗?
【嵌牛正文】
没有实际项目开发经历,就去零散的去学习UART,SPI,I2C这些模块,或者RTOS知识,当然也包括嵌入式Linux时,完全不知道学习他们的意义,看视频一段时间就很迷茫,这是正常的,也是普遍存在的,当你在工作实际参与1-2个项目后,就可以很容易解决这些问题,不过这大概对你的现状意义不大,下面是我花了些时间精简的局域网管理方案(单片机方案),如果能对这个框图有着清晰的认知,那么如何学习嵌入式你自然能够理解。
下面先列出方案框架图:
先大致介绍下这张图,这是比较常见的局域网工控方案,下位机负责现场的采集和处理,上位机通过RS485/RS232/CAN/RF等通讯通道使用modbus协议进行数据交互,LCD应用负责界面显示和触摸操作控制,将内部数据在本地呈现处理。Web/MQTT应用将数据转化成网络数据包,通过TCP/IP协议栈,完成PC端通过软件(C/S架构)或者浏览器(B/S)架构访问。这属于在单片机端比较复杂的应用了,其实用嵌入式Linux实现起来会更简单,不过我觉得从单片机角度分析的更清晰。
1.驱动层
SPI-FLASH用于数据/网页/图像存储或者在线升级实现时对于扩展容量时是需要的,就就需要SPI接口的移植和调试,考虑到管理方便,一般还会移植fatfs文件系统。
LCD 主要应用于图形界面显示和触摸/按键的逻辑操作,这部分除了底层驱动,还要了解Emwin图形界面,中断输入的知识,
RTC 不一定需要,但某些芯片不自带RTC,或者RTC精度不高,需要外挂,这就需要I2C接口的调试
USART/CAN 主从机多机通讯,则就需要实现硬件接口驱动,根据选择的不同自己处理,当然还有很多其它未提到的外设如AD,GPIO,DMA等,这些在实际应用中都是独立的需要用到的模块。
2.系统层
RTOS的移植,任务创建,管理,删除,消息队列,信号量,互斥量,如果用到了网络复杂应用,RTOS一般是需要的,不然管理图形+网络在主循环中十分困难
3.协议层
处理网络相关的LWIP,处理多机通讯相关的Modbus,这些网上资料很多,甚至拿来用的可以,但符合自己应用,且调试稳定,不能够完全理清楚内部流程机制是很难做到的
4.应用层
支持前端网页访问的web服务器,支持客户端访问的MQTT服务器,管理数据的图形界面,支持多机通讯的数据整体管理,这些都是应用端的实现
上面基本就构成了一个相当复杂的单片机项目,这看似讲的是项目开发的事,其实也是如何学习单片机的流程和重点,就是对驱动,RTOS,协议和应用,就是至少有1-2个有自己的"闪光点",这些东西其实是应该系统学习的,也就是从实际应用项目为目的,拆分成各小模块来逐步掌握,不过这种方法需要很多的前置知识和资料收集,问题解决能力。如果按照大部分开发板视频来学习的话,就会发现往往驱动外设是几十个视频,RTOS又是几十个视频,协议部分和应用部分同样,按照分类的方法顺序学习,前后知识基本关联不大,最后往往学了前面忘了后面,而且不理解学习的意义,最后大部分时间都半途而废,但是如果上来就去看提供的综合项目的应用代码,又过于复杂,找不到头绪,这也是我刚入门时的真实写照,这里我以上面提到的项目为例,先抛砖引玉下我总结的学习方法,当然这并不一定适合大多数人。
1.进行简单驱动的开发,调试和整合,如RTC,RS232,调试接口实现
2.移植RTOS,将上述驱动整合到系统中实现
3.移植和实现Modbus协议,在和驱动,系统整合,如果没有下位机,可以用PC代替模拟(这是很重要的能力,事实很多时候开发都是分工的,在别人未完成前,自己用其它方法代替模拟对端可以大幅度提高效率)
至于后续可以做图形界面,从LTDC驱动,图形界面实现,操作部分学习,也可以从ETH驱动,lwip/web实现,mqtt实现,这样穿插学习,在学习中肯定会遇到各种问题,这时候视频,开发板售后,网络论坛,甚至你的老师都可以提供给你帮助,当然你可以上来不做这么复杂的项目,也可以从简单的开始,参考我这篇回答:
https://www.zhihu.com/question/322341076/answer/682578055。
如果你想知道单片机需要什么知识,也可以参考我这篇回答:
https://www.zhihu.com/question/326187420/answer/717982311
当然如果你希望学习的嵌入式Linux开发,虽然技术要求上差别很多,就是网络部分使用socket+web/mqtt,图形方面使用QT或者Android+JAVA, 底层驱动不只是操作寄存器,还要理解platform总线,设备/驱动注册这部分知识,但其实思路是相同的,不过在了解这些知识之前,你要熟悉Linux环境,编译原理基础,bash语法和makefile,menuconfig配置和内核/文件系统的编译下载,还要掌握Linux平台的系统接口函数如fork,exec等。