很多单片机的初学者容易掉入阻塞式编程的陷阱.因为阻塞式编程符合我们对现实世界的理解,一个人在一段时间内,只能做一件事情.例如要是实现1Hz的闪灯程序,那么先让单片机端口拉高500ms,然后再拉低500ms,然后循环.因为等待时间太长了,没有打开看门狗.

下面是阻塞式编程的例子:

#include    "extern.h"

/*端口定义*/

BIT     LED            :        PA.3;

BIT     LED1           :        PA.4;

/*相应于main函数*/

void    FPPA0 (void)

{

/*单片机内部RC震动时钟为 IHRC默认为16M,因此,IHRC/2=8M,系统时钟为8M*/

.ADJUST_IC    SYSCLK=IHRC/2

/*端口设置为输出 低*/

$ LED  out ,low;

$ LED1  out ,low;

/*主循环*/

while (1)

{

/*端口置高*/

LED=1;

/*延时单位1T(1个时钟周期),延时8000=1ms,一共延时500ms*/

.delay 8000*500;

/*端口置低*/

LED=0;

/*延时500ms*/

.delay 8000*500;

}

}

OK 完美运行.

但是,当要你再加上一个指示灯,要2Hz闪烁,也就是250ms关,250ms开,然后循环,那要怎么办了.

OK继续,刚刚辛辛苦苦写好的程序得重新写了.

/*相应于main函数*/

void    FPPA0 (void)

{

/*单片机内部RC震动时钟为 IHRC默认为16M,因此,IHRC/2=8M,系统时钟为8M*/

.ADJUST_IC    SYSCLK=IHRC/2

/*端口设置为输出 低*/

$ LED  out ,low;

$ LED1  out ,low;

/*主循环*/

while (1)

{

/*端口置高*/

LED=1;

LED1=1;

/*延时单位1T(1个时钟周期),延时8000=1ms,一共延时250ms*/

.delay 8000*250;

LED=1;

LED1=0;

/*延时单位1T(1个时钟周期),延时8000=1ms,一共延时250ms*/

.delay 8000*250;

LED=0;

LED1=1;

/*延时单位1T(1个时钟周期),延时8000=1ms,一共延时250ms*/

.delay 8000*250;

LED=0;

LED1=0;

/*延时单位1T(1个时钟周期),延时8000=1ms,一共延时250ms*/

.delay 8000*250;

}

}

OK,完美运行,要加上按键呢?怎么办,感觉越来越麻烦了.

其实,单片机干起事情来比我们想象得要快得多.例如8M的主频,1T的单片机,在1S钟之内就可以执行8,000,000条指令.在很多时候,我们几乎可以忽略单片机在执行两条指令的时间差,也就是说虽然单片机程序是顺序执行的,在人看来效果和并行执行没有任何差别.不能让单片机在等待.LED开/关其实就是一条指令的事.做好定时就OK了.

下面来个非阻塞式程序的案例.

#include "extern.h"

#define  HIGH 1

#define  LOW    0

#define DISABLE 0

#define ENABLE 1

#define EMPTY 0

#define FULL 1

#define ON 1

#define OFF 0

/*灯*/

BIT     LED        :        PA.3;

/*按键*/

BIT     LED1     :     PA.4;

word   usLedTmrCnt;

word   usLedTmrCnt1;

/*定时时间是否到了cinit*/

bit     FLAG_NMS;

/*计数值cinit*/

byte count;

/*定时器初始化cinit*/

word T16COUNTER;

/***************************************/

void    TIME16_Init(void)

{

/*计数值清零*/

T16COUNTER =488;

/*ms标记reset*/

FLAG_NMS =0;

/*使能定时器*/

$ INTEN T16;

/*关中断*/

INTRQ = 0;

/*停止定时器*/

T16M.5 =0;

STT16 T16COUNTER;

/*计算方法16M/*/

$ T16M IHRC,/1,BIT11;

}

void FPPA0 (void)

{

.ADJUST_IC SYSCLK=IHRC/2, IHRC=16MHz, VDD=3.5V,init_ram;

$ CLKMD IHRC/2,En_IHRC,En_ILRC,En_WatchDog;

$  LED     OUT,LOW;

$  LED1    OUT,LOW;

TIME16_Init();

engint;

while (1)

{

wdreset;

/*1ms定时时间到*/

if ( FLAG_NMS )

{

usLedTmrCnt++;

if(usLedTmrCnt>500)

{

usLedTmrCnt=0;

/*类似Led=~Led*/

if(LED)

{

LED=0;

}

else

{

LED=1;

}

}

#if 1

usLedTmrCnt1++;

if(usLedTmrCnt1>250)

{

usLedTmrCnt1=0;

/*类似Led1=~1Led*/

if(LED1)

{

LED1=0;

}

else

{

LED1=1;

}

}

#endif

/*清除标记*/

FLAG_NMS=0;

}

}

}

void Interrupt ( void )

{

pushaf;

if ( Intrq.T16 )

{

Intrq.T16 = 0;

STT16 T16COUNTER;

if ( count>0 )

{

count--;

}

else

{

count   =   9;

/*1ms*/

FLAG_NMS=   1;

}

}

popaf;

}

给LED 和LED1各分配一个计数器,可以设置1-65535ms的翻转时间.LED亮/灭只需要一条指令.其他的时候就查询一下1ms标记有没有,有就计数,当计数值溢出的时候就把LED进行翻转.就这么简单.各自独立,没有长时间的等待,看门狗也打开了.在端口和内存允许的情况下还可以添加N个.在这个框架下,还可以扩展按键,显示.....

这里并不是说阻塞式的程序不好,而是有一定的局限性.在写简单的应用中也很好用.很直观.

php程序阻塞与非阻塞的区别,完美起航相关推荐

  1. 同步与异步,阻塞与非阻塞的区别

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  2. 阻塞、非阻塞与同步、异步的区别

    一.同步和异步 二者关注的是消息通信机制 . 所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该*调用*就不返回,但是一旦调用返回,就得到返回值了. 异步则是相反,&quo ...

  3. 32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系

    问题 1:阻塞.非阻塞 I/O 与同步.异步 I/O 的区别和联系 在文件系统的工作原理篇中,介绍了阻塞.非阻塞 I/O 以及同步.异步 I/O 的含义,这里我们再简单回顾一下. 首先我们来看阻塞和非 ...

  4. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例 ...

  5. java 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别

    同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...

  6. 同步、异步、阻塞和非阻塞之间的区别

    同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...

  7. 异步和同步,阻塞和非阻塞区别

    异步&同步 异步or 同步 关注的是 客户端调用服务器接口后,是否有相应的调用的结果 同步和异步关注的是消息通信机制 所谓同步,就是在发出一个调用时,没得到结果之前,该*调用*就不返回.调用者 ...

  8. socket阻塞和非阻塞的区别

    socket阻塞和非阻塞的区别 简单点说: 阻塞就是干不完不准回来,    非组赛就是你先干,我现看看有其他事没有,完了告诉我一声 我们拿最常用的send和recv两个函数来说吧... 比如你调用se ...

  9. linux下recv 、send阻塞、非阻塞区别和用法

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:        基本概念: 阻塞IO:: socket 的阻塞模 ...

  10. 写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别

    当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. < IO - 同步,异步,阻塞,非阻塞 >是我在开始学习epoll和libevent的时候写的,主要的思路来 ...

最新文章

  1. nullnullHandling the Results 处理结果
  2. python3网络编程中semaphore用法_python3 进程信号量semaphore
  3. [Java入门笔记] Java语言基础(二):常量、变量与数据类型
  4. [转]大数据+HR”不再是忽悠
  5. python清洗数据去除停用词_Python从pandas数据帧中删除停用词
  6. android 文件公有存储,如何将文件写入Android中的外部公共存储,以便从Windows中看到它们?...
  7. 可视化太酷辽!一文了解排序和搜索算法在前端中的应用
  8. 如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)
  9. ABP+AdminLTE+Bootstrap Table权限管理系统第八节--ABP错误机制及AbpSession相关
  10. python学习之数据类型(int,bool,str)
  11. 《论文笔记》Adaptive decentralised_cooperative_vision_based_simultaneous_localization_and_mapping_for_mult
  12. 任务调度-java普通工程通过Timer实现
  13. SVN上传文件注意事项-------------------养成良好的项目文件上传习惯
  14. mysql中like,limit,union及union all查询
  15. Android studio进行文件,代码对比
  16. 二进制方式部署k8s集群1.21版本-域名形式
  17. Python 用Ursina引擎制作一个3D迷宫游戏
  18. 清北学堂2019.7.16
  19. 数字后端物理设计输入文件介绍(.v .sdc .lib/.db .lef .tlef/.tf rc corner .view)
  20. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

热门文章

  1. Android图形之HWC(二十四)
  2. Mac关闭SIP模式 开启root
  3. vs2015编译ffmpeg
  4. SDWebImage获取到UIImage分辨率跟原图不一样
  5. python之__repr__
  6. C#之Bcd码时间转成ToDateTime
  7. 在 Linux 上监控 CPU 和 GPU 温度
  8. base64 能放数组里面么_手把手教你Vue解析pdf(base64)转图片【实践】
  9. c++怎么输入带有空格的字符串_字符串,啥东东?
  10. python3参考手册_Python3 中文手册