第一篇的随笔中我写到:「带来更多的体会和收获,就不会是毫无意义的普通文字了。」
所以就当作重新梳理自己来写这个随笔了。
嵌入式的开始接触
大约是大一的时候,比较疯狂的「迷恋」C++(实际也是优雅又写起来很语义清晰的语言),我还是觉得自己有些笨笨的,学习的速度比较慢,总之花了挺多的时间学习完了 《C Primer Plus》 这本入门级别的 C 语言教程,这花的时间不能算作是什么证明,可能只是浪费了这么多时间的痕迹罢了。
接着就是读约一千页左右的 《C++ Primer Plus》 了,也不知道自己是如何读完的,总之也是读了很久的时间,牺牲了很多的时间,但还是觉得速度很慢了,也可能是自己的动力本来就不足,懒懒的。
由于国内普遍的都是 C 语言的入门学习,这也让我在另一方面有了更多的时间,可以从一些课堂课程中抽出其他的时间来学习,但我还是懒懒的,还是一样玩过去了,好在整体而言的进度没有丢,也算还行了。
过完 C 语言之后就是让我个人觉得冗长又繁琐,又笨重的 Java 了,实际一点也提不起兴趣,当然在某些过渡期还是感觉到了迷茫,就想的是 “学完了,学什么呢?”
之后就开始找一些基础课程看,也只不过是看完了一点数据结构,之后又补了一些计算机组成原理,计算机网络的视频,大部分也只是囫囵吞枣了,实际还是没有一些想法和思维的养成。
人和人最根本的差别是什么呢? —— 由我一位老师提问,但我深深共鸣的问题,我随即脱口而出答案,我很欣赏他,实在是不可多得的好老师。
在某个阶段的时候,由于运气比较好,通过了学校某竞赛的挑选,进入了另外的环境学习(熟悉我的朋友肯定知道的),之后就是几乎每天的跑学习场地了,和几个小伙伴一起,几乎算的上是无忧无虑的时光了,不仅是精进了自己,也是没有什么烦恼了,不可多得的好时候。
每天就是白天进房子,黑天回宿舍,实际最后直接睡在那了,宿舍也懒得回了。(贴上以前还发的 pyq 动态)

我必须再贴一个令人非常佩服的室友,我是真的觉得他非常的努力,超过我太多了。这里的某位可惜的是现在交流会比较少了,但我觉得情谊不少,至少他亲口说过还是很感谢我的,我也非常庆幸他能够越来越好。

当时有一个初选的题目是使用多线程交替输出一些字符,记不太清了应该是这样,由于运气比较好,刚好看了 生产者-消费者模型 也算是还可以的通过了,当然我还是觉得其他人一样有这个实力,因为其他人一样通过了,说不定是比我更好(实际这些伙伴们是真的很不错!!每个都非常的认真!努力!有干劲!)。
所以这时候也是遇到了一位特别负责和认真的老师,我觉得和我特别的契合,因为他也说: “别人会的,我肯定也能学会,不就是多学了几年,多花了点时间,我也一定能学会。” 。
此和翁凯老师在 MOOC 的 C 语言课程说的:“学计算机一定要有一个非常强大的心理状态,计算机的所有东西都是人做出来的,别人能想的出来,我也一定能想得出来,在计算机的世界里没有任何的黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西全搞明白的。“
(但实际可能会非常难,经常放弃了)
我也正是在这个时候第一次接触了一个叫做 STM32F407 的芯片,只不过我当时 完全,完全,完全不懂 这是什么东西,代码也只是之前使用的代码,我将它摸熟悉了而已,连一些什么基础的什么叫 高电平 , 低电平 都搞不明白,
什么是 时钟, 定时器, GPIO, IIC 统统都不知道,更别提什么烧录芯片等基本操作了,完全不懂,只是闷头学了,但是也完全不懂,但因为整体的团的要求也只能是这样了,后面结束之后有机会才是开始了自己的学习。

至此算是第一次的接触,后来才知道 STM32F407 算是一个性能不错的芯片了。
漫长的学习
由于并不是从一开始就是学习嵌入式,也并非电子科技等专业,所以对于一些电子特性完全不熟悉,甚至还想着是否要将模电,数电两门课程学习,后来也是因为时间不允许加上特别的懒就没有学。
期间也是搜索了特别多的资源,在 STM32 不是特别火的时候,大部分帖子还是比较旧,学习的还是 C51 的 8bit
的单片机,由于有了前面的 C 语言的基础,学习起来并不算困难,但也不算轻松。
之前在学习的伙伴买了一块板子,我根本不懂,只觉得这比我牛逼多了,他给我展示了什么不太清楚了,好像是一个点灯,但是也是让我震惊不已,
可惜他现在似乎并没有坚持学习嵌入式了,还是在 Java 中了。(很可惜现在也看不到他这个 pyq 动态了
实际上我的 C51 的学习也是在此后几年(升本后)的事情了,期间是再次补全了一下基础的课程,有了更多的一点印象。(说的好听,实际是浪费时间了,纯玩)
对于 C51 也是大量的在找视频观看,试图去理解和揣摩那些晦涩难懂的名词概念,好歹是让我慢慢清楚了之前 接触的但是不懂的 东西了,这个时候其实已经花费了特别多的时间,
包括做其他的事情,也贴上来一个图片吧,实际这个图片是让我非常伤心的一个时间拍摄的。

此时还是学习这个叫啥来着我已经忘记了,然后又浪费时间,费了一番力气弄出来个时间,又拍照记录了下来。
至此大部分基础的嵌入式的概念算是基本弄清楚了,但这个时候还是没有开启 STM32 的学习。
继续的学习
在用完 C51 学习后随即就应该也是进入 STM32 的学习,但是我那是还是不懂这是个什么东西,也不知道买什么好,所以看到其他的同学购买了一个 野火 的 STM32F1 系列的产品,
我也是跟着购买了,但发现也没有什么好学的,可能也是过了那一段激情的时刻了,总结来说算是看了一些新的函数,新的使用方式,打开了新的窍门,知道了 居然 可以用 结构体 来封装这些参数使用,
确实很无知,也确实有点笨,感叹还是不太懂 OOP 的使用和思想。
这继续学习的 STM32 也只是重新走了一遍原来的学习路线,哦我连最基础的方式 寄存器编程 我也搞不懂是什么东西,还觉得这他妈是为啥,这样就能输出了吗?这样为什么它就亮了呢?
很长一段时间我也搞懂寄存器到底是个什么东西,但大概理解了我也就算了,这重走一遍只是换了新的编程方式,用了 STM32标准库、HAL 库 这样别人封装好的函数,
更多的也是在了解如何使用,至于原理部分已经没太大需要了,所以这算是一个性价比较低的一次购入,花费的时间金钱挺多的。(因为一块板子还他妈几百块又没啥用
又玩了一段时间后(我是说我有点懒懒的),开始自己捣鼓一些,试着不看教学视频,不看文字教程,只从一些器件手册以及现阶段掌握的知识来动手做点什么,
点亮了一个 LCD 的屏幕,和实际又是很长一段时间后(期间又偷懒了)捣鼓的 0.96 inc OLED(IIC) 屏幕。

Do u remember me?

回顾学习
也跳过了 RTOS 的内容没有讲,由于这个和单片机开发的关联性较大,使用 Linux 的部分完全不会用到直接略过
目前的一些异构双核,或是 ARM + FPGA 的实现可以支持 Linux + RTOS (Xilinx提出的 Linux + zephyr)同时运行,但专业的东西由专业的人干,所以直接略过,反正我也不是特别清楚
至于为什么没有提到 Linux
的内容,因为我几乎所有的操作下都是在 Linux 中进行的,所以所有的 Linux 算是比较的得心应手,没有什么难度了,但这并不代表着它不重要,
不过基础的日常使用也够了,除非需要否则不必太多的深入和研究,因为很多的基础编译命令的操作(gcc, make)都是在 Linux 中使用的,特别是对其的如 交叉编译工具链,Make file 等,
同时还有其他的日常使用的工具(grep, find, vim)等,现代有更好的性能更好的不再指出,如果你会用,自然就会找到它们。 (ripgrep, fd, neovim...) 所以这部分的内容也令我有了一定的基础,后续对于 Linux 内的调试手段不至于那么的吃力。
接下来的是内核的学习,这部分实际是非常,非常,非常繁琐和系统的,庞大的东西,如果是没有人教,可能会像无头苍蝇的到处找资料,但又好像不知道从哪里入手,至少我是这样的,而且找到了也都看不懂。
进入这部分的内容一定是需要更多的信心,耐心和勇气了,有一次想看的 MTD子系统 甚至都找不到资料,只找到一些年代久远的视频,和一些质量不高的文章。
上句提到的子系统我刚接触时也是十分的懵,根本搞不清楚这是什么东西,后来才慢慢知道,原来内核除了关键的部分组件,其他实现的功能可以叫做 子系统。
所以 Linux 内核中的子系统非常的多,且函数调用十分的多,十分的深,系统架构十分的好,学习一个可能就要花费非常多的时间,并且可能都有些难度。(至少对我目前来说)
有些时候比如 BSP 的工程师,更多可能是专注在这些子系统的工作中,为新生产的芯片添加对应的驱动,或维护原有的代码,或给新的芯片适配原有的设备使其能正常运行,
或给新的设备适配原有的芯片使其能正常运行,并提供出一套简单易用的 API 函数,这时候可能做的就是一个芯片,一块评估板的 bring-up 的工作。
对于内核大概可以分成两大部分,核心 及 组件 ,核心可以说是内核具有的,操作系统的特性:内存管理,进程管理等等,组件可以说是各种子系统了,因为没有子系统内核也是能运行。(注意这部分的内核可意指操作系统,因为 Linux 本来就是一个操作系统)
所以大致可以从两方面开始入手,一是基础的操作系统核心的部分,这部分其实在编写驱动程序的时候也是十分必要的,不可以小看,要编写一个可用的好的程序,有很多东西需要考虑,
可以是时序,互斥和锁的时机,睡眠调度的问题等等;二就是必要的一些子系统了,这部分在编写驱动也是十分必要的,但是没有的话也是能写驱动,
只是没法用罢了,诸如 IIC 子系统, SPI 子系统, 时钟子系统, GPIO 子系统, Flash 子系统, DMA 子系统(我到现在也有挺多没有掌握的
没有这些子系统也没法和外部的设备(外设 peripherals)通信。
至于其他的如何编译内核?如何裁剪内核?等等诸如此类的问题,太简单了,其是基础的东西应该非常容易可以查到,只要想找,以及信息检索能力在线,不可能找不到,
不赘述也不一定是忽略的内容,很多时候存在知识的壁垒(还是叫知识的陷阱忘了)的,如果有幸被看到此篇,再可能有引发一些思考和帮助就更好了。
写下来其实要花挺多时间的,也可能后面就乱发一些碎碎念了
其实我到现在连 DMA 驱动都不会写.. 甚至之前连 MMU 是什么都不知道,也没有内存管理的概念..
所以说来我确实是有些笨笨的。(还有其他方面
