单片机裸编思考之消除软件延时

发布者:dandan666最新更新时间:2017-11-25 来源: eefocus关键字:单片机  软件延时 手机看文章 扫描二维码
随时随地手机看文章

听了一次培训课-高质量C编程,受益匪浅。听过那次培训,我就在想,怎么形成一种自己的编程风格,怎么有一个自己的裸编架构?

通过自己查阅书籍、资料、相关帖子,有一些收获,现记录如下,以便查阅。

单片机的编程风格,我不想做过多的谈论,只要代码清晰,便于阅读,适合自己即可。推荐一本书-----编程匠艺之编写卓越的代码,很不错。

单片机裸编架构,这个是新手往往最容易忽略的问题。因为新手刚开始只是注重C语法,单片机模块使用,等等。无可厚非,这些都是大厦的基石,没有这些,也无从讨论架构。

所有的新手都是从如下架构开始,其中的函数都是阻塞式方式:

main()

{

/****初始化函数*****/

................................

while(1)

{

task1();

task2();

......

}
}

当然这种架构是最简单,也是最容易理解的。因为对于入门的学员来说,无非是点亮一个LED,闪烁,点亮数码管,等简单的任务,任务不多,实时要求又很低,所以这种架构基本都能应付。

假如我有三个任务,task1(),task2(),task3(),task3()是对于上位机的回应,对于时间上有要求。task1()是LED灯的闪烁,task2()是按键检测。我们一般都是利用软件延时函数delay_ms来做灯闪烁的延时和按键消抖,这中就是阻塞式方式。由于task3()是对于上位机的应答,什么时候上位机来数据,不能确定,还要及时作出回应,最坏的情况是开开始执行task1(),上位机数据就来了,作出回应的时间为灯闪烁延时+按键消抖延时,都是ms级(代码执行时间可忽略),我们不能忍受。怎么办呢?我认为最好的办法就是在执行一些无用的延时指令的时候把控制权释放掉,让其他任务执行。下面是我思考的方法:

对于按键:

方案1:把按键采集函数放到定时器中断里,这样就不需要延时了。

方案2:先做一个软件定时器或者叫软件延时器,当然是基于硬件定期实现的,按键函数在延时的时候不断查询标志位。如果这样做,按键函数必须经过改造,它要具有如下功能:能够主动退出,并在下次调用时间能够从上次的退出点执行。有人说这不就是操作系统才能时间的功能吗,时间任务调度?我们可用协程的方法来模拟操作系统的任务调度。具体实现方法用C语言的switch语法或者GNU的&&语法。伪代码历程如下:



unsigend char state=0;

unsigend chari=0;



unsigend charkey_value_read_last=常态;//上次值,常态及无动作值

unsigend charkey_value_read_current=常态;//当前值



unsigend charkey_value_user_last=常态;//上次值

unsigend charkey_value_user_current=常态;//当前值



void  KEY(void)

{

#deifne KEY_READ_TIMES10

switch(state)

{

case 0:

key_value_read_current=KEY_IO;

i++;

state++;

启动软件定时器;


if(key_value_read_last != key_value_read_current)//消抖

{

key_value_read_last = key_value_read_current;

i=0;

break;

}


if(i>=KEY_READ_TIMES)//获取按键值

{

i=0;

if(key_value_read_current != key_value_user_last)

{

key_value_user_last=key_value_read_current;//防止用户未松开按键,按键一直有效(无须做按键松开检测)


if(key_value_user_current !=常态)key_value_user_current=key_value_read_current;//需用户清除标志位

}

}

break;

case 1:

if(软件定时器有效)

{

软件定时器标志清零;

state=0;
}

break;

}

}

void  KEY_USER(void)

{

if(key_value_user_current != 常态)

{

key_value_user_current= 常态;//清除标志位

//用户代码

}

}

上面的例子,就是一个按键函数改后的例子,由于没有用户栈的概念,所以函数不能保存局部变量,要么定义为static,要么用全局的,根据面向对象的思路,把按键函数的数据封装为一个struct。

LDE函数也一样。通过上面的例子我们发现,在裸编的时候,我们主要任务是消除任务里的延时等待,或者一个任务分解为几个小的任务,每当完成一小步,就主动释放控制权,等待下载调用,直到完成这个任务。


关键字:单片机  软件延时 引用地址:单片机裸编思考之消除软件延时

上一篇:单片机资源:时间和空间的思考
下一篇:LCD12864液晶使用-ST7920

推荐阅读最新更新时间:2024-03-16 15:46

意法半导体 STM8L 系列超低功耗微控制器量产
微控制器供应商意法半导体(纽约证券交易所代码:STM)宣布STM8L系列超低功耗微控制器正式投产。新系列产品于2009年底发布,以EnergyLite™ 技术为亮点,最大限度降低各种模式的功耗。 超低功耗微控制器符合当前高速增长的能效需求,有助于设计人员延长电池供电产品的寿命,降低智能电表、家用电器等电动设备的能耗。通常的省电技术包括睡眠模式和关断片上闲置模块,意法半导体的EnergyLite技术还可以在工作模式下节省电能,从而帮助设计人员达到“能源之星80 Plus”等能效目标,符合国际高能效电源推广计划以及待机功耗限制,如IEA的“1W节能计划”。 即日起上市的STM8L EnergyLite微控制
[单片机]
意法半导体 STM8L 系列超低功耗<font color='red'>微控制器</font>量产
51单片机C语言调用汇编子程序的简便方法
1、在汇编文件中,程序前边加上如下三句话就可以: PUBLIC _delay, _binrlc ;定义公用子程序名,这里定义了两个子程序(有下划线) LUOYUAN SEGMENT CODE ;程序段命名,LUOYUAN,叫啥名都可以 RSEG LUOYUAN 下边放子程序(程序名要下划线,其它标号不要下划线) ;汇编语言文件 PUBLIC _delay, _binrlc;定义子程序名 LUOYUAN SEGMENT CODE ;命名LUOYUAN的程序段 RSEG LUOYUAN _delay: MOV P1,#55H MOV R2,#30H DJNZ R2,$ RET
[单片机]
SL11R单片机外部存储器扩展
SL11R是Scanlogic公司生产的一种带有USB接口的16位RISC单片机,内核处理速度达到48MIPS,有丰富的硬件资源及32位可编程I/O口,可以灵活扩展外围芯片。本文主要讨论其外部存储器的扩展。 screen.width-460)this.width=screen.width-460" vspace=10 border=0> 1 SL11R存储器空间 SL11R内部有3K字节的SRAM,可以用作指令存储器和数据存储器,但有些应用场合需要扩展存储器。SL11R可扩展I2C串行E2PROM、通用并行EPROM及RAM,还能够直接扩展大容量的EDO DRAM。 SL11R采用统一地址编码方式对外寻址,程序代码、数据区、I
[单片机]
SL11R<font color='red'>单片机</font>外部存储器扩展
物联网催生大商机 MCU如何满足需求?
   MCU 的身影已广泛出现在手机、PC外围、汽车、工业等领域,但 物联网 众多的应用将会催生 MCU 更大的商机。不过,为了满足 物联网 智能家居、智能汽车、智能制造以及可穿戴设备、人工智能等众多应用的需求, MCU 的连网性能、丰富的接口、更多的集成必不可少,性能、功耗、安全性的提升同样不容忽视。 物联网 到底需要什么样的MCU?下面就随嵌入式小编一起来了解一下相关内容吧。    物联网催生大商机 MCU可塑性及通用性发挥重要作用   IHS早前预估针对连网汽车、可穿戴设备、建筑物自动化以及其他有关物联网应用的MCU市场预计将以11%的CAGR成长,2019年时达到28亿美元的市场规模。IHS Technology资深分
[嵌入式]
STM32F0单片机 PWM + ADC 控制有刷电机
1.有刷电机驱动电路 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,
[单片机]
MCU这么久,你知道MCU在电脑和手机上有哪些应用吗?
MCU 在当前手机与平板电脑应用中主要用作诸如电容式触摸感应接口、触摸屏接口、摄像头接口、不同模拟传感器输入检测、USB接口以及电池充电与监控等众多功能的协处理器。此外,负责互连上述功能的所有逻辑和接口都可以采用像用于模拟输入的ADC、用于蜂鸣器应用的PWM、段式LCD、字符型LCD、图形化LCD、用于音量控制的DAC、USB接口以及电容式触摸屏接口等各种可用组件模块设计而成。 本文将探讨MCU和可编程片上系统( PSoC )在手机与平板电脑应用中的作用,并对此类应用存在的系统限制和设计挑战进行评估。采用可编程器件既可以通过降低BOM成本、缩短设计周期时间来降低整体产品成本,还可以通过加快开发进程节约项目成本。 图1手
[单片机]
学<font color='red'>MCU</font>这么久,你知道<font color='red'>MCU</font>在电脑和手机上有哪些应用吗?
EH78系列单片机的编程技巧
笔者在某智能水表开发中使用了EM78P447芯片,对EM78系列芯片有了较深认识,在实践中总结了一些开发此类芯片应注意的问题,同时给出了应用中的编程技巧。 市面上常见的介绍EM78系列的参考书中,都给出了一些应用实例,但这些实例一般程序代码量较小,功能单一。虽然这些实例对于新手确实起到了很好的作用,但一个产品可能功能很复杂,程序可能达到几千行,这就会出现一些短程序中没有遇见的问题。以笔者的开发为例,程序总共5千多行,有效的汇编语句代码有3千多行。由于义隆没有提供C的编译环境,只能以汇编进行编码,而汇编的结构、条理性与C语言比较不是很清晰,再加上EM78单片机结构的独特性,所以当程序代码量较大的时候总会出现一些新的问题。下面将实
[工业控制]
EH78系列<font color='red'>单片机</font>的编程技巧
基于8051单片机和SC1128芯片实现病房呼叫系统的设计
传统的病房呼叫系统普遍采用有线式,不仅布线安装繁琐、维护不便、利用率低,而且实时性差。虽然无线式呼叫系统没有布线问题,但它的可靠性差,而且无线电波会干扰其它医疗仪器设备,目前大多数医院不采用无线呼叫系统。 随着电力载波技术的发展,应用低压电力线作为传输媒质,采用扩频、数字编码、单片机控制等技术实现病房呼叫已成为可能。本文运用电力载波技术设计了一种病房呼叫系统。 1 病房呼叫系统的基本要求 临床求助呼叫是传送临床信息的重要手段,病房呼叫系统是病人请求值班医生或护士进行诊断或护理的紧急呼叫工具,可将病人的请求快速传送给值班医生或护士, 并在值班室的监控中心电脑上留下准确完整的记录,是提高医院和病室护理水平的必备设备之一。呼叫系
[单片机]
基于8051<font color='red'>单片机</font>和SC1128芯片实现病房呼叫系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved