在一些朋友的留言和大神的文章中多次提到了 uC/OS,相信很多朋友看到之后都是蒙B的 “这是个什么鬼?”。uC/OS (Micro Control Operation System)翻译过来就是微控制器操作系统,最初版本是在1992年发布,现在已经发展到uC/OS III 了。
接触过单片机或编程的朋友一定知道 main() 函数,mian() 又叫主函数或者入口函数,顾名思义就是程序开始执行的地方(其实这是不严谨的,但是为了照顾小白可以这样简单的理解),而一般的裸机程序只有一个main(),从程序的开头到结尾跑一次就完了,而为了让程序能不停的跑往往会在main() 中加一个while(true) 让其不断的循环。uC/OS因为其处理方式理论上可以模拟无数个 "main() 函数"(任务),让这些任务并发运行,就像在一个单片机中有多个main() 函数一样,让原本单线程的单片机能有多线程的效果。
那 uC/OS 是变出无限个main函数呢,答案就是时钟节拍,时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的事件,推动所有任务向前运行。简单的来说就是高频率的切换任务来实现类似多线程的效果,这个时钟节拍是可调的,频率越快越浪费cpu,相应的在多个任务间切换的速度也就越快。
从本质上来讲,中断是一种电信号的变化,当设备有某种事件发生时(产生电平变化),它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。(就好比小明现在正在看我写的这篇文章,突然有快递来敲门他就会先放下手机去取快递然后回来接着看,既拿了快递又读了文章)如上图所示电信号从低电平跳转高电平的中断称之为上升沿中断,反之称之为下降沿中断。
因为篇幅的限制以上只是简单的介绍了一下uC/OS,当然它还有很多其它的优点,例如内存分配,任务消息队列,等等。这些都是这个系统多年迭代累积下来的“车轮”,如果感兴趣的朋友可以深入的了解一下。
uC/OS固然是好,但是真的有必要什么都用 uC/OS么?我看未必,杀鸡何用宰牛刀。以下引用一位知友的留言:
“2以前没学过操作系统,用单片机裸机写程序。有一次做一个功能特别复杂的东西,发现中断都快用完了,并且用中断有些地方实现的特别勉强,冗余,复杂。当时根本就不知道有多任务,也以那时的知识根本想不到如何优化。如果当时学过操作系统,用过ucos,这个问题就很好解决了。不信,你看能不能用裸机实现一个简单的平板电脑。
6以后想去大公司,做平板,做手机,不会嵌入式linux估计不行吧,这个依旧包括了上述所有知识。”(这位朋友表达的意思我懂,在此只是引用这一段话,只是引用!)
(此段纯吐槽)可能是现在中国手机行业很赚钱。是个大一点的公司就要做平板,做手机,大公司都需要这样的人才,一窝蜂的往里钻。虽然arm理论上也算是单片机的一种,但是我更喜欢将其归入微处理器的行列,做手机做平板要是我肯定不会选stm32上uC/OS来做。如果是为了好找工作,为了做手机那还是学嵌入式linux比较靠谱。我是学自动化的,在我的感觉里单片机(stm32,avr,飞思卡尔,51等等)这类是属于微控器,最适合的就是用来做控制的,不是为了做手机而生的。
和做人一样首先要清楚自己的定位,清楚自己能干什么,不能干什么。汽车芯片,3d打印机,数控机床,手环,液晶显示器,四轴,录像机,洗衣机,玩具,飞机仪表板等等等等,都有单片机的用武之地,我给它的定位就是简单重复高效的控制器。有朋友留言说 “一句话想赚钱不要学这个。” 我只能引用这样一句话 “中国不是实体经济不行了,而是你的实体经济不行了。”
运算放大器 MIT的 Anant Agarwal 教授讲的很好建议你去看看(其实网易公开课上有很多资源,都没人看)
运算放大器是一种带有特殊耦合电路及反馈的放大器,其输出信号可以是输入信号加、减或微分、积分等数学运算的结果。(简单的理解就是通过这个原件能实现输入信号的数学运算)
正好我用一个实际的例子来讲,下图是我之前用来驱动激光的一个原理图,看似很复杂不用怕,一步一步来。首先要知道这个电路是干什么用的,我上学的时候就是老师自己陶醉的在台上讲,也不告诉你学了知识能干啥,最后学的都是一头雾水,一脸茫然(又吐槽了)。为了保持激光稳定的工作,通过激光二极管的电流必须是恒定的,这个时候就需要横流驱动。
LASER1+和LASER-之间接的就是要求横流1A工作的激光二极管。如果电路看起来复杂图中所有电容均可以理解为滤波作用。为了理解虚短,虚段我们将其都去掉,是不是看起来简单了一些
LASER-下方是一个mos管,简单的理解成一个特殊开关,它的1端口可以控制2->3的是否导通,并分去多余的电压。R8是0.03欧姆的采样电阻,为了实现1A横流R8a上方电压要为0.03v(I=U/R),那么运放端口6为0.03v。ok 这里我们先学习一下
虚短(虚短指在分析运算放大器处于线性状态时,可把两输入端视为等电位【这里2,3,5,6都是输入端】,就好像两个输入端短接在一起,但事实上并没有短接,称为“虚短”。由于运放的电压放大倍数很大,而运放的输出电压是有限的。因此运放的差模输入电压不足1 mV,两输入端近似等电位,相当于 “短路”。)
虚断(由于运放的差模输入电阻很大。因此流入运放输入端的电流往往不足1uA,远小于输入端外电路的电流。故通常可把运放的两输入端视为开路。“虚断”是指在分析运放处于线性状态时,可以把两输入端视为等效开路,这一特性 称为虚假开路,简称虚断。)
因为虚断(5,6)为开路,没有电流由6经过R8a到GND。
因为虚短所以(5,6)端口电压相等均为0.03v,由于R7a,R7b串联可得到端口1的电压
(V1-V5)/R7a=V5/R7b --------> V1=(V5/R7b)*R7a+V5=0.33v
因为虚短所以(1,2,3)端口电压相等,所以只要用单片机控制3端口的电压为0.33v,激光器就能稳定在1A工作。
注意以上所有推导能成立均建立在运放是线性工作的状态,至于运放什么时候是线性,如何在非线性条件下让运放线性工作,Anant Agarwal 教授都讲的很清楚了。
-END-
| 整理文章为传播相关技术,版权归原作者所有 |
| 如有侵权,请联系删除 |
【1】嵌入式研发10多年,工程师悟出这些道理
【2】当谈起嵌入式工程师,究竟在谈些什么
【3】嵌入式工程师出路之我见:就业,技术,行业...
【4】为什么嵌入式工程师会对8位MCU有误解?
【5】嵌入式工程师结合经历聊硬件工程师和软件工程师哪个更有前途?
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!