当前位置:首页 > 单片机 > 单片机
[导读] 昨天在回家的火车上,带了一本《匠人手记》,看了几篇,受益匪浅。其中一篇讲到编程思路,也就是如何入手构建一个程序。我用C语言在原文的基础上稍微展开一下,以备日后查看。简单的程序只要用简单的方

 

昨天在回家的火车上,带了一本《匠人手记》,看了几篇,受益匪浅。其中一篇讲到编程思路,也就是如何入手构建一个程序。我用C语言在原文的基础上稍微展开一下,以备日后查看。

简单的程序只要用简单的方式就可以了,我在此之前也只会这一种方式。也就是:

void main()

{

init();//初始化

while (1)

{

module01();//模块1,或若干语句

}

}

 

匠人在书中讲到事件驱动机制,例如:

void main()

{

init();

while (1)

{

if (事件1条件)

shijian1();//执行事件1

if (事件2条件)

shijian2();//执行事件2

if (事件3条件)

shijian1();//执行事件3

......

}

}

以前编的一些多事件程序中,我也用过类似的思想,但是用了很多条件的嵌套,编出的程序远没有这种清晰。

 

上面的方式也叫顺序调度机制,在每次循环中每个事件都可能被执行到,另有一种优先调度机制:

void main()

{

init();

while (1)

{

if (事件1条件)

{

shijian1();//执行事件1

continue;

}

if (事件2条件)

{

shijian2();//执行事件2

continue;

}

if (事件3条件)

{

shijian3();//执行事件3

continue;

}

......

}

}

将优先级最高的事件放在前面,被执行到的概率最大。但是假如前面的事件频率太高,后面的就有可能执行不到了。

 

最精彩的部分要数多任务并行运行。简单的多进程程序还是很容易的,比方同时控制流水灯和数码管(动态),单独的流水灯是赋值后延时,再赋值,再延时。如果要同时控制数码管,只要把之前用作延时的那段时间用来扫描数码管就行了。简单说来,就是把以前浪费掉的时间充分利用起来。

稍微复杂一点的多任务运行就要稍微动些脑筋了,可以把每个任务看做一个进程,每个进程可以被分为多个阶段,每个阶段执行时间较短。多个进程的每个阶段交替进行:进程1阶段1,进程2阶段1,进程1阶段2,进程2阶段2,……

我想到两种方式实现各阶段的分配,第一种是人为设定好每个阶段结束的条件,等待着某个阶段“主动”结束然后进入另一个进程的某个阶段。这种方式每个阶段所用的时间是不确定的,但是每个阶段所做的事情是确定的。第二种方式是每进入一个阶段,就开启一个定时器,等到定时器计到设定的时间就强制结束这个阶段,开始另一个进程的某个阶段。这样每个阶段运行的时间都是固定的,但是一般不能明确地知道在这个阶段将任务执行到哪里(有点像量子力学的测不准原理了)。

 

用定时器实现进程的分配:

 

#include

#include

 

unsigned char fond = 0;

 

#pragma interrupt_handler tc0:10

void tc0()//定时器0溢出中断,假设共有3个进程

{

fond++;

if(fond == 3) fond = 0;

}

void shijian1()

{

char a1;

.....//读取上次数据

a1 = fond;

while (fond == a1)

{

....//继续运行

}

 

.....//保存本次数据

}

void shijian2()

{......}

void shijian3()

{......}

 

void main()

{

TCCR0 = 0x05;//设8M晶振,1024分频,每秒平均产生30.5次中断,应用中可视情况而定

TIMSK |= BIT(0);

SREG |= BIT(7);

 

while (1)

{

switch (fond)

{

case 0:

if (事件1条件)

shijian1();

else

fond++;//假如此事件发生的条件不满足,就让fond加1以便执行下一个事件

break;

case 1:

if (事件2条件)

shijian2();

else

fond++;

break;

case 2:

if (事件3条件)

shijian3();

else

fond=0;

break;

}

}

}

 

除此之外,还可以设计一段专门用于分配CPU时间的程序,可以更系统地处理多进程的问题,这就很有些操作系统的感觉了。

在应用中不限于这几种方法,根据实际情况的复杂程度能灵活使用各种方法编出最合适的程序才是最重要的。另外,匠人同志还说过这么句话:简单的,才是最有效的。

 

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

8位单片机在嵌入式设计领域已经成为半个多世纪以来的主流选择。尽管嵌入式系统市场日益复杂,8位单片机依然不断发展,积极应对新的挑战和系统需求。如今,Microchip推出的8位PIC®和AVR®单片机系列,配备了先进的独立...

关键字: 单片机 嵌入式 CPU

在嵌入式系统开发中,程序烧录是连接软件设计与硬件实现的关键环节。当前主流的单片机烧录技术已形成ICP(在电路编程)、ISP(在系统编程)、IAP(在应用编程)三大技术体系,分别对应开发调试、量产烧录、远程升级等不同场景。...

关键字: 单片机 ISP ICP IAP 嵌入式系统开发

在嵌入式系统开发中,看门狗(Watchdog Timer, WDT)是保障系统可靠性的核心组件,其初始化时机的选择直接影响系统抗干扰能力和稳定性。本文从硬件架构、软件流程、安全规范三个维度,系统分析看门狗初始化的最佳实践...

关键字: 单片机 看门狗 嵌入式系统

本文中,小编将对单片机予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 单片机 开发板 Keil

随着单片机系统越来越广泛地应用于消费类电子、医疗、工业自动化、智能化仪器仪表、航空航天等各领域,单片机系统面临着电磁干扰(EMI)日益严重的威胁。电磁兼容性(EMC)包含系统的发射和敏感度两方面的问题。

关键字: 单片机 电磁兼容

以下内容中,小编将对单片机的相关内容进行着重介绍和阐述,希望本文能帮您增进对单片机的了解,和小编一起来看看吧。

关键字: 单片机 复位电路

在这篇文章中,小编将为大家带来单片机的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 单片机 异常复位

今天,小编将在这篇文章中为大家带来单片机的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 仿真器

单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对它的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 中断 boot

一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。

关键字: 单片机 数字信号 模拟信号
关闭