1. uC/OS 是个什么鬼?

在一些朋友的留言和大神的文章中多次提到了 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 打印机,数控机床,手环,液晶显示器,四轴,录像机,洗衣机,玩具,飞机仪表板等等等等,都有单片机的用武之地,我给它的定位就是简单重复高效的控制器。有朋友留言说 “一句话想赚钱不要学这个。” 我只能引用这样一句话 “中国不是实体经济不行了,而是你的实体经济不行了。”

 

2. 那你解释一下运放虚短的原理 简单讲就好

运算放大器 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 教授都讲的很清楚了。