随笔分类 - 单片机软件设计
PC平台的软件工程师常批评单片机软件工程师不懂代码,不懂设计,我看未必。。。
摘要:不用怀疑,单片机的万能语言就是状态机。还希望大家不要条件反射式的看到状态机就以为我要讲什么VHDL的东西——状态机是一种思维模式,是计算机理论的立足之本(不相信请参考清华大学出版社的《自动机理论与应用》)——因此状态机的实现与语言本身关系并不是绝对的。本文要讨论的状态机,从实现方式上更类似于Java中常用的那种思维模式,而与VHDL相去甚远。 路要一步一步走,饭要一口一口吃,为了不把后来人吓跑,状态机理论中更多复杂的部分,我会在以后专门写文章讨论,这里我先找一个切入点,从我常用的2种状态机编写方式为大家慢慢展开。 首先,关于几个问题,比如:什么地方用状态机?状态机究竟有几种写法?状态机...
阅读全文
摘要:转载原帖地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=792608------------------------------------------------------------------------------------------------------------------- 许多嵌入式应用领域,软件都是基于输入响应的组织方式,也叫反应式系统。把输入信息进行归类有:离散的事件(如二值开关信号)、可以表示某个外部信号引发的中断或者例如发生了定时器溢出等。而数值信号则用于传递例如一次A/D采样的结果。有限状态机正是利用了.
阅读全文
摘要:对于所有任务,无论在何种情况下,任务的运行时间 t 都应该小于时间间隔。即如果任务不能在规定的时段内完成,就中止该任务,尤其是对于以查询方式运行的中断程序。比如,这样的代码是不可靠的:// 等待, 直到AD转换结束(检查ADCI) while((ADCON & ADCI) == 0); 因为在某些情况下,可能由于如下原因导致系统被挂起:a 如果模数转换器的初始化不正确,不能确定模数转换将被执行b 如果模数转换器的输入电压过高,那么可能根本就不运行c 如果没有正确初始化变量ADCON或ADCI,那么可能不按要求运行如果要求系统很可靠,则必须能够保证没有函数会这样挂起。循环超时提供了一种简
阅读全文
摘要:在一些智能充电器中,单片机要一直监测电池的电压,一旦超过某一数值,就由恒流充电切换到恒压充电。撇开充电器制作相关的各种知识和概念不说我们集中注意力来考察:当电压接近那个设定的临界值时发生的一些事情。 当电压接近临界值的时候,系统还处于恒流充电状态,于是电压开始朝突破临界值的方向上升……在某一时刻,电压突破了临界值,程序检测到了这一数值变化,立即将充电状态由恒流切换为恒压。然而,由于恒流状态时加载在电池上的电压要远远高于恒压时所保持的电压,所以几乎在同一瞬间,单片机监测到的电池电压又跳回了临界值以下——于是,系统又头脑简单地将工作模式切换回了恒流状态……如此反复,在电池电压处于该临界值附近的时.
阅读全文
摘要:调度器: 一方面,调度器可以看作是一个简单的操作系统,允许以周期性或(更少见)单次方式来调用任务 从底层的角度看,调度器可以看作是一个由许多不同任务共享的定时器中断服务程序,因此,只需要初始化一个定时器,而且改变定时的时候通常只需要改变一个函数。此外,无论需要运行1个、10个还是100个不同的任务,通常都可以使用同一个调度器完成。注意,这种“共用中断服务程序”与桌面操作系统提供的共用打印功能非常类似。合作式调度器: 合作式调度器不但可靠而且可预测的主要原因是在任一时刻只有一个任务是活动的。抢占式调度器:混合式调度器:这里面一个关键性问题就是如何解决不可重入函数: a、修改或读取变量(尤其是用于
阅读全文