Go最新朋友圈那位隐藏大佬的单片机学习心得_钟威 单片机开发(5),2024年最新我阿里P7了解到的Golang面试的一些小内幕

12 篇文章 0 订阅
11 篇文章 0 订阅

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

以前使用51、AVR单片机都是逐个寄存器编写,大多用到位运算等等,但是到了STM32 STM8单片机的时候厂家提供了标准库。

只需要知道配置哪个功能即可,非必要不会去配置具体的底层寄存器,尤其是32位的单片机再逐位配置会相当繁琐(暂且抛开效率问题)。

对于开发者只需要把更多的精力放在功能实现上,ST公司更是推出了STM32cubeMX方便的配置初始化。

当然有类似功能的软件也很多,如果不是专门写驱动的工程师现在也越来越少的和底层打交道了。ST的标准标准外设库可以看我写的这篇文章

https://www.docin.com/p-762096420.html

还有就是看开发环境,比如现在用的比较多的就是针对51和stm32等的Keil环境、当然还有针对AVR开发用的WinGCC、AVRStudio等等,还有针对arduino等芯片的图形化编程引擎如mixly等,现在还有针对51单片机的图形化编程引擎。

图形化编程引擎的使用降低了编写代码的成本,人们只需拖动几个积木样的图形即可完成程序编写,arduino的广泛应用也归功于此,这为许多有想法的开发者提供了快捷的原型制作渠道。

还有就是选择编程语言,大部分的开发语言还是使用c语言。因为c语言有着良好的底层操作能力和较高的效率,学习c语言还是主要的课程。

现在较新的芯片如ESP8266、ESP32也支持基于python的编程,python编程更多的也是调用现成的库来实现功能。

用ESP8266时,也接触到可以使用LUA语言编程的固件,将LUA脚本发送到ESP8266即可运行,这对于需要实现简单功能又不想编写大量代码的人来说不失为一种好的渠道。

3.关于编程

当你第一次点亮开发板上的LED后,就开始了编程之旅。

几行代码可以顺利通过编译并上传,我们就可以认为这是成功的。

但是通过我的实践我觉得单片机编程有这么几个阶段:

3.1 功能实现

这里所谓的功能实现就是指跑通各类接口、调通各类外设,能够对外设有一个客观的认识。

这里主要涉及GPIO、中断、定时器、看门口、I2C、串口、SPI、CAN、AD、DA等常用功能或总线。

能够通过这些接口实现对常用外设的操作,如按键、LCD、LED、时钟芯片、看门狗芯片、AD芯片、存储芯片等等常用外设芯片。

这是学习单片机的基本操作,如果这些功能学会了,可以说是基本入门了。

在这一阶段务必学会:

①自主阅读芯片手册

这里的芯片手册包含单片机的芯片还有外设芯片,能够通过阅读手册查询功能实现的寄存器、实现芯片功能的寄存器,接口协议,这样即使以后遇到一个没有见过的芯片也能编写驱动程序将芯片使能。

②学会debug

能够使用示波器、万用表、stlink、jlink、协议分析仪等外设仪器查看芯片工作状态,能够使用IDE提供的debug功能设置断点调试程序。

③积累常用电路

单片机是软硬结合的一个技能,作为工程师不仅要能通过软件实现功能,更要积累硬件电路的实现,如5v、3.3v电源,各类芯片的外围电路等等。

在这一阶段一定要对寄存器这个客观对象建立认识,正如本文第一大点所述,所有的功能实现都是针对寄存器的读写。所有的外设都是操作寄存器。

3.2.功能整合

通过上一阶段的学习已经掌握了程序编写和单个功能实现,比如可以实现串口和PC的简单收发通信、能够读取到外设传感器送来的物理量信息、能够在各类显示屏上显示想要的字符图形。

在第二阶段就要实现上述功能的整合,例如通过按键点亮LED、通过串口点亮LED并在液晶屏显示、读取DS18B20或者SHT11传感器并把想要的数据显示到液晶屏上,通过定时器等制作一个简单的闹钟。

在这一阶段,基本脱离了对底层寄存器的操作,工程师的注意力更多的要放在功能实现上。

在这一阶段需要如下内容:

①功能耦合

简单来说就是将一个外设获取到的信息可靠及时的传递到另一个功能模块,例如:按键中断获取到了一个按键按下的信号,那么该通过何种方式将这一信号传递到另一个功能,如:点亮LED,这里可能会有直接调用LED函数、全局变量、回调函数等方式。

②简单模式

在这一阶段大部分的程序结构(暂时提不上架构)是顺序执行的,如

while(1)

{

func1();

func2();

funcn();

}

程序按照简单的条件判断顺序的向下执行即可。

此类程序常为:读取输入->判断条件->信息处理->信息输出->信息再读取的循环结构。

在此还可以学习基于状态机的模式实现功能,状态机也是一种非常强大的编程模式。

(https://blog.csdn.net/huohongpeng/article/details/51489049)

③C语言高级操作

对使用c语言开发的工程师,在这一阶段要掌握并熟练使用头文件、宏定义、结构体、联合体、指针(包括变量指针、函数指针和指向指针的指针等)、数组(一维多维和高维)、链表、malloc等C语言中相对高阶的操作。

3.3 架构设计

当功能需求越来越复杂,通过第二阶段的方式无法满足需求时,就要考虑程序架构了,嵌入式系统的要求就是实时性,更高效率的响应外部输入。

一个芯片如何得到更高效的利用、而不是充斥着很多的delay这样的软件延时,当程序在delay时实际时在重复完成累加任务,而其他任务还在等待。

这时就需要有一种能够高效利用内核时间、实时响应系统输入的架构来实现。当然前后模式的程序也能实现,但是一个成熟的架构应该是可以移植和泛化。

这里有两种选择:一种是使用各类嵌入式操作系统,如RT-Thread、ucOS、FreeRTOS等。

另一种就是使用无际老师这种使用带有任务调度功能的程序架构。

在这种架构下的程序编写就把重要的工作转向任务的规划及任务的通信。

①****任务(Task)规划

在操作系统中,所谓任务规划,就是把面向过程编程时的每个功能变成相对独立的一个任务(或者线程Thread),在这个任务中只完成一个功能,如:led显示任务、键盘扫描任务、显示任务。

每个任务只管完成自己的功能,比如显示任务只管在led或者lcd上显示,具体显示什么由有别的任务通过通信机制来告诉它。

如果系统是一个基于优先级的操作系统(相对的是基于时间片轮询的)还存在一个优先级的问题。

即每个任务得到cpu权限的高低,比如同时有多个任务需要被执行,那么优先级高的任务首先应该得到运行,这些任务中实时性强的任务应当首先被系统响应,所以应该有较高的优先级。

②任务间通信设计

任务之间通信用来保持任务之间的同步和信息传递,通常有信号量、邮箱、信号等,这里就要考虑用哪种适当的方式同步任务或者将信息传递给另一个任务,比如当按键按下后,使用信号量同步任务还是使用邮箱传递,显示信息是放到邮箱同步到显示任务中还是通过信号量发送过去等等。

上述内容可以参照周立功的ucos教程学习。

对于不使用嵌入式操作系统的前后台模式的调度系统来说,关键在于系统的调度,系统调度的实质就是切换不同线程所使用的各类寄存器和局部变量当A任务向B任务切换时,需要将A任务时的系统状态保存在栈中,将B任务的系统状态从栈中取出继续执行,如是循环。

任务调度还涉及原子锁操作、任务调度效率、优先级判定等都是需要考虑的内容。这里面会设计无际老师的框架就是一个经过实践检验过的架构,如果大家有志于开发自己的调度框架,可以先阅读一下ucOS等优秀成熟的嵌入式系统内核,然后从任务调度这个核心展开。

对于一个成熟的产品或者项目,可靠的电路设计和稳健的程序是必要的保证,当一个程序进入了实际生产阶段那么就必须使用各种手段保证其稳定性。

大家往往说的单片机不单指单片机芯片本身,更多的其背后的嵌入式系统,嵌入式系统博大精深,本文我只从自己的学习经历和对单片机认知谈了一些看法,如要不到之处还请朋友们批评指正。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值