单片机轮询模式多任务并行处理

发布者:科技狂人最新更新时间:2018-10-06 来源: eefocus关键字:单片机  轮询模式  多任务  并行处理 手机看文章 扫描二维码
随时随地手机看文章

时间片轮询思路介绍:

时间片轮询法,在很多书籍中有提到,而且有很多时候都是与操作系统一起出现,也就是说很多时候是操作系统中使用了这一方法。不过我们这里要说的这个时间片轮询法并不是挂在操作系统下,而是在前后台程序中使用此法。也是本贴要详细说明和介绍的方法。

      对于时间片轮询法,虽然有不少书籍都有介绍,但大多说得并不系统,只是提提概念而已。下面本人将详细介绍本人模式,并参考别人的代码建立的一个时间片轮询架构程序的方法,我想将给初学者有一定的借鉴性。

    使用1个定时器,可以是任意的定时器,这里不做特殊说明,下面假设有3个任务,那么我们应该做如下工作:

 1. 初始化定时器,这里假设定时器的定时中断为1ms(当然你可以改成10ms,这个和操作系统一样,中断过于频繁效率就低,中断太长,实时性差)。

 2. 定义一个数值:

 #define TASK_NUM   (3)                  //  这里定义的任务数为3,表示有三个任务会使用此定时器定时。

 uint16 TaskCount[TASK_NUM] ;           //  这里为三个任务定义三个变量来存放定时值

uint8  TaskMark[TASK_NUM];             //  同样对应三个标志位,为0表示时间没到,为1表示定时时间到。

 3. 在定时器中断服务函数中添加:

 
void TimerInterrupt(void)
{
    uint8 i;

    for (i=0; i
    {
        if (TaskCount[i]) 
        {
              TaskCount[i]--; 
              if (TaskCount[i] == 0) 
              {
                    TaskMark[i] = 0x01; 
              }
        }
   }
}

 代码解释:定时中断服务函数,在中断中逐个判断,如果定时值为0了,表示没有使用此定时器或此定时器已经完成定时,不着处理。否则定时器减一,知道为零时,相应标志位值1,表示此任务的定时值到了。

 

4. 在我们的应用程序中,在需要的应用定时的地方添加如下代码,下面就以任务1为例:

 TaskCount[0] = 20;       // 延时20ms

TaskMark[0]  = 0x00;     // 启动此任务的定时器

 到此我们只需要在任务中判断TaskMark[0] 是否为0x01即可。其他任务添加相同,至此一个定时器的复用问题就实现了。用需要的朋友可以试试,效果不错哦。。。。。。。。。。。

 

通过上面对1个定时器的复用我们可以看出,在等待一个定时的到来的同时我们可以循环判断标志位,同时也可以去执行其他函数。

 

循环判断标志位:

那么我们可以想想,如果循环判断标志位,是不是就和上面介绍的顺序执行程序是一样的呢?一个大循环,只是这个延时比普通的for循环精确一些,可以实现精确延时。

 

执行其他函数:

那么如果我们在一个函数延时的时候去执行其他函数,充分利用CPU时间,是不是和操作系统有些类似了呢?但是操作系统的任务管理和切换是非常复杂的。下面我们就将利用此方法架构一直新的应用程序。

 -------------------------------------------------------------------------------------------------------------------------------------------------------

以上是时间片轮询法的思路介绍,下面具体介绍其架构和关键的函数:

时间片轮询法的架构:

 1.设计一个结构体:

// 任务结构

typedef struct _TASK_COMPONENTS
{
    uint8 Run;                 // 程序运行标记:0-不运行,1运行
    uint8 Timer;              // 计时器
    uint8 ItvTime;              // 任务运行间隔时间
    void (*TaskHook)(void);    // 要运行的任务函数
} TASK_COMPONENTS;       // 任务定义

 

这个结构体的设计非常重要,一个用4个参数,注释说的非常详细,这里不在描述。

 

 2. 任务运行标志出来,此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数,这里独立出来,并于移植和理解。

 


void TaskRemarks(void)
{
    uint8 i;

    for (i=0; i
    {
         if (TaskComps[i].Timer)          // 时间不为0
        {
            TaskComps[i].Timer--;         // 减去一个节拍
            if (TaskComps[i].Timer == 0)       // 时间减完了
            {
                 TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢复计时器值,从新下一次
                 TaskComps[i].Run = 1;           // 任务可以运行
            }
        }
   }
}

 

大家认真对比一下次函数,和上面定时复用的函数是不是一样的呢?

 

3. 任务处理

 


void TaskProcess(void)
{
    uint8 i;

    for (i=0; i
    {
         if (TaskComps[i].Run)           // 时间不为0
        {
             TaskComps[i].TaskHook();         // 运行任务
             TaskComps[i].Run = 0;          // 标志清0
        }
    }   
}

  

此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。

 

到此,一个时间片轮询应用程序的架构就建好了,大家看看是不是非常简单呢?此架构只需要两个函数,一个结构体,为了应用方面下面将再建立一个枚举型变量。

 

下面我就就说说怎样应用吧,假设我们有三个任务:时钟显示,按键扫描,和工作状态显示。

 

1. 定义一个上面定义的那种结构体变量

 


static TASK_COMPONENTS TaskComps[] = 
{
    {0, 60, 60, TaskDisplayClock},            // 显示时钟
    {0, 20, 20, TaskKeySan},               // 按键扫描
    {0, 30, 30, TaskDispStatus},            // 显示工作状态

     // 这里添加你的任务。。。。

};

  

在定义变量时,我们已经初始化了值,这些值的初始化,非常重要,跟具体的执行时间优先级等都有关系,这个需要自己掌握。

 

大概意思是,我们有三个任务,没1s执行以下时钟显示,因为我们的时钟最小单位是1s,所以在秒变化后才显示一次就够了。

由于按键在按下时会参数抖动,而我们知道一般按键的抖动大概是20ms,那么我们在顺序执行的函数中一般是延伸20ms,而这里我们每20ms扫描一次,是非常不错的出来,即达到了消抖的目的,也不会漏掉按键输入。

为了能够显示按键后的其他提示和工作界面,我们这里设计每30ms显示一次,如果你觉得反应慢了,你可以让这些值小一点。后面的名称是对应的函数名,你必须在应用程序中编写这函数名称和这三个一样的任务。

 

2. 任务列表

// 任务清单

typedef enum _TASK_LIST
{
    TAST_DISP_CLOCK,            // 显示时钟
    TAST_KEY_SAN,             // 按键扫描
    TASK_DISP_WS,             // 工作状态显示
     // 这里添加你的任务。。。。
     TASKS_MAX                                           // 总的可供分配的定时任务数目
} TASK_LIST;

 

 

好好看看,我们这里定义这个任务清单的目的其实就是参数TASKS_MAX的值,其他值是没有具体的意义的,只是为了清晰的表面任务的关系而已。

 

3. 编写任务函数

 


void TaskDisplayClock(void)
{

 

}


void TaskKeySan(void)
{


}


void TaskDispStatus(void)
{


}

 

// 这里添加其他任务。。。。。。。。。

  

现在你就可以根据自己的需要编写任务了。

 

4. 主函数

 


int main(void) 

    InitSys();                  // 初始化

    while (1)
    {
        TaskProcess();             // 任务处理
    }
}

 

 

到此我们的时间片轮询这个应用程序的架构就完成了,你只需要在我们提示的地方添加你自己的任务函数就可以了。是不是很简单啊,有没有点操作系统的感觉在里面?

 本文摘录处:http://blog.163.com/zhaojun_xf/blog/static/300505802011102233952153/

       不防试试把,看看任务之间是不是相互并不干扰?并行运行呢?当然重要的是,还需要,注意任务之间进行数据传递时,需要采用全局变量,除此之外还需要注意划分任务以及任务的执行时间,在编写任务时,尽量让任务尽快执行完成。。。。。。。。。


关键字:单片机  轮询模式  多任务  并行处理 引用地址:单片机轮询模式多任务并行处理

上一篇:MSP430F5438A单片机基于SPI的FatFs移植笔记
下一篇:单片机中Delay延时函数的缺点与改善

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

基于USB移动存储的钢丝绳探伤报警系统设计
  1引言   在钢丝绳探伤检测中,要实现检测传感器到存储器的数据交换。USB移动存储器具有携带方便、操作快捷、成本低廉等优点。随着其技术的发展及广泛应用,如何实现使用单片机控制来完成移动存储这一过程成为了工控领域研究的热点。   2USB功能模块简介   2.1模块概述   USB 是—种查询(Polling)总线,由主控制器启动所有的数据传输。USB上所挂连的外设通过由主机调度的(Host-Scheduled)和基于令牌的(Token-Based)协议来共享USB带宽。目前,绝大多数Host功能角色被集成在各种类型的PC机(或以上层次机器)上。各种各样的基于USB的移动设备,包括USB移动存储器、带USB接口的数码相
[工业控制]
工业级MCU的翘楚:集丰富模拟功能与片上资源于一身
Renesas(瑞萨电子)针对工业领域微控制器应用推出了RL78系列新产品R5F117BCGFP。该微控制器为16位MCU,采用CISC架构,具有三级流水线的,最高运行频率可达24MHz,结合其内部集成的丰富模拟功能和数字功能,以及一流的低功耗表现,在工业控制领域具有广泛的应用。目前,该产品已可通过世强订购。 模拟功能丰富 R5F117BCGFP集成了丰富的模拟功能,包括运算放大器、比较器、模数转换器等。该产品内部集成多达4路运算放大器,在高速运行模式下,其操作稳定等待时间仅为13us,完全满足一般模拟信号处理对速度的要求,外部配合简单的电阻、电容,即可完成对信号的放大、滤波等处理,节约了设计面积。R5F117BCGFP内
[工业控制]
基于凌阳单片机的语音信号实时采集
摘要:语音信号采集是语音信号处理的基础。本文利用凌阳公司16位单片机——SPCE061A所具有的数字信号处理(DSP)功能及其所提供的音频压缩函数库来实现语音信号的实时采样与压缩;通过RS232接口,将采集到的语音信号实时上传到PC机中存储。 关键词:语音信号处理 RS232 串口通信 语音采样 语音压缩 引言 随着单片机集成化程度的不断提高,现代单片机已经具备了数字信号处理功能,使语音信号处理用单片机实现成为可能。台湾凌阳科技公司(SunPlus)推出的一款SPCE061A就是这样的产品。SPCE061A是以μ"nSP TM16位微控制器及信号处理器芯片为内核的16位单片机,采用模块式集成结构,片内集成了2KB RAM、3
[单片机]
单片机与LCD的串行接口设计与实现
0 引言 LCD液晶显示器件作为智能仪表的信息显示界面,具有低压、微功耗、显示清晰等特点,如今广泛应用于低功耗型的智能仪器中,本文采用的JM240128A LCD是一款图形点阵式液晶显示器,它由控制器T6963C、行驱动器/列驱动器及240×128全点阵液晶显示器组成。可完成图形显示,也可以显示15×8个(16×16点阵)汉字。 T6963C的最大特点是具有独特的硬件初始值设置功能,显示驱动所需的参数如占空比系数,驱动传输的字节数/行及字符的字体选择等均由引脚电平设置,这样T6963C的初始化在上电时就已经基本设置完成,软件操作的主要精力就可以全部用于显示画面的设计上了。 美国Microchip Technology 公司推出的8
[单片机]
<font color='red'>单片机</font>与LCD的串行接口设计与实现
MSP430系列单片机的复位电路系统设计
  0 引言   TI公司的混合信号处理器MSP430系列单片机以其处理能力强大、外围器件集成度高、功率消耗低、产品系列全面、全系列工业级等特点,作为目前MCU主流市场的产品之一,在电子应用领域中得到广泛应用,被越来越多的电子设计师所青睐。由于复位电路设计问题而导致的系统出现上电后不工作或状态不正确是很多MSP430单片机电路设计者们在设计、调试和应用中曾遇到过的问题,尽管这种情况发生的几率很低,但对于可靠性要求较高的应用场合,这个现象仍需引起电子设计人员的足够重视。   为此,本文对MSP430全系列单片机的复位系统和复位机制进行了详细深入的分析,并针对性地提出了具体的外围复位电路设计方案和有关电子元器件的详细介绍,以供同行
[单片机]
MSP430系列<font color='red'>单片机</font>的复位电路系统设计
基于单片机空气质量检测系统
0 引言 空气污染是城市面临的共同问题。从伦敦、洛杉矶烟雾事件到近年我国雾霾。PM2.5是大气污染关键污染物,污染物浓度是衡量空气污染程度的重要指标。大气灰霾已成为重大民生问题。PM2.5逐渐进入环境空气质量标准。 颗粒物大小:大于10微米的颗粒物可以被鼻子和咽喉截住,而不会进入肺部。5到10微米的颗粒物可以在咽喉通过物理机制去除。小于5微米的颗粒物会到达支气管。直径小于2.5微米的颗粒物会通过呼吸进入肺部最深处。所以从人类健康讲是最受关注的颗粒物种类。PM是指英文颗粒物,25是指大气中直径小于等于 2.5微米的颗粒物。也称可入肺颗粒物。它是导致空气质量差、能见度低的罪魁祸首。因此,检测PM2.5对于观测、防治大气污染有重要意义。
[单片机]
基于<font color='red'>单片机</font>空气质量检测系统
基于LPC2148 ARM单片机的音频分析仪设计
0 引言 随着微电子和信息技术的快速发展,以单片机为代表的数字技术发展日新月异。单片机由于具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,而广泛应用于各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理。事实上,通过采用单片机来进行控制,可以实现仪器仪表的数字化、智能化和微型化。本文通过对比选择采用了LPC2148芯片解决方案来实现音频分析仪的设计。 1 系统分析与选择 1.1 信号处理原理分析 在对音频信号进行分析的过程中,本文采用了快速傅立叶变换FFT算法,即首先对音频信号进行离散化处理,然后进行FFT运算,求出信号各个离散频率点的功率数值,并得到离散化的功率谱,最后
[单片机]
基于LPC2148 ARM<font color='red'>单片机</font>的音频分析仪设计
基于单片机的现场无电源电子密码锁设计
0 引言 目前,市场上有多种基于IC卡设计的电子锁,广泛应用于宾馆、公寓、仓库、学校等场所。这些场合能够提供很好的直流或交流电源,电子锁的控制部分可以长时间方便地获取稳定的电源。但是,在野外环境中往往不能为控制部分方便地提供电源,需要手持部分为控制部分提供电源,执行开锁和闭锁操作,因此传统由控制部分提供电源的电子锁不能满足野外环境的需要,例如采油井、注水站、电信通讯井等,在这些地方,尤其是偏远的地方,往往对安全性要求较高,提供电源又较为困难。 本文介绍了一种电子锁,电子锁系统分为控制和手持两部分。手持部分的电源采用锂电池,控制部分的工作电源由手持部分提供,数据线和电源线共用一根线,有效解决了上述问题,使用方便。 1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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