0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文看懂嵌入式单片机程序架构之顺序结构

电子工程师 2018-04-15 11:39 次阅读

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

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

记得在前不久本人发帖《1个定时器多处复用的问题》,由于时间的问题,并没有详细说明怎样实现1个定时器多处复用。在这里我们先介绍一下定时器的复用功能。。。

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

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

2. 定义一个数值:

复制内容到剪贴板

代码:

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

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

uint8TaskMark[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.设计一个结构体:

代码:

//任务结构

typedefstruct_TASK_COMPONENTS

{

uint8Run;//程序运行标记:0-不运行,1运行

uint8Timer;//计时器

uint8ItvTime;//任务运行间隔时间

void(*TaskHook)(void);//要运行的任务函数

}TASK_COMPONENTS;//任务定义

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

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

代码:

voidTaskRemarks(void)

{

uint8i;

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. 任务处理

代码:

voidTaskProcess(void)

{

uint8i;

for(i=0;i//逐个任务时间处理

{

if(TaskComps[i].Run)//时间不为0

{

TaskComps[i].TaskHook();//运行任务

TaskComps[i].Run=0;//标志清0

}

}

}

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

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

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

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

代码:

staticTASK_COMPONENTSTaskComps[]=

{

{0,60,60,TaskDisplayClock},//显示时钟

{0,20,20,TaskKeySan},//按键扫描

{0,30,30,TaskDispStatus},//显示工作状态

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

};

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632841
收藏 人收藏

    评论

    相关推荐

    单片机嵌入式系统的区别

    在现代电子技术领域,单片机嵌入式系统是两个经常被提及的术语。它们在许多应用中发挥着关键作用,如智能家居、工业自动化、汽车电子等。尽管这两个概念经常被交替使用,但它们之间存在些基本的区别。
    的头像 发表于 11-01 14:09 404次阅读

    单片机怎么写入程序

    单片机(Microcontroller Unit,MCU)是种集成电路芯片,它将计算机的CPU、存储器、输入/输出接口等功能集成在个芯片上。单片机广泛应用于
    的头像 发表于 10-21 11:21 268次阅读

    【「嵌入式Hypervisor:架构、原理与应用」阅读体验】+ 了解Hypervisor

    正值举国欢度国庆佳节之际,我收到了《嵌入式Hypervisor:架构、原理与应用》书,在此感谢电子发烧友论坛!当初申请评测此书之时,我根本就不知道这个Hypervisor是什么,只是看到有
    发表于 10-13 16:47

    目前深圳嵌入式单片机就业环境如何?

    深圳作为中国的科技创新中心之,在嵌入式单片机领域的就业环境相对较好,以下是对该就业环境的详细分析:
    的头像 发表于 10-09 11:51 432次阅读
    目前深圳<b class='flag-5'>嵌入式</b><b class='flag-5'>单片机</b>就业环境如何?

    8位单片机为何不会被高端单片机取代?

    、功耗小、易于使用和编程、适用于小型系统和嵌入式应用等。 8位单片机广泛应用于各种领域,如家用电器、汽车电子、医疗设备、工业自动化、通信设备等。在嵌入式系统和物联网领域,8位单片机
    发表于 09-24 16:51

    嵌入式系统的体系结构包括哪些

    嵌入式系统的体系结构通常是个复杂而精细的架构,旨在满足特定应用需求,同时兼顾系统的可靠性、效率、成本和体积等多方面因素。以下是对嵌入式系统
    的头像 发表于 09-02 15:25 735次阅读

    读懂什么单片机:组成结构与应用

    欢迎来到单片机的世界,这是种微小(但功能强大)的设备,改变了嵌入式系统的面貌。在本文中,您将了解单片机些基本知识、
    的头像 发表于 08-09 11:49 1610次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>读懂什么<b class='flag-5'>单片机</b>:组成<b class='flag-5'>结构</b>与应用

    讲解单片机、ARM、MCU、DSP、FPGA、嵌入式错综复杂的关系!

    不需要的部分裁去。所以嵌入式系统般都具有便携、低功耗、性能单等特性。 然后,MCU、DSP、FPGA这些都属于嵌入式系统的范畴,是为了实现某
    发表于 08-06 17:33

    从菜鸟到大牛!嵌入式完整学习路线:STM32单片机-RTOS-Linux

    嵌入式linux”的顺序帮助您从入门到进阶,掌握嵌入式开发的精髓。第阶段单片机单片机
    的头像 发表于 07-23 16:11 3575次阅读
    从菜鸟到大牛!<b class='flag-5'>嵌入式</b>完整学习路线:STM32<b class='flag-5'>单片机</b>-RTOS-Linux

    嵌入式微处理器和单片机的区别在哪 嵌入式微处理器技术的优缺点有哪些

    嵌入式微处理器和单片机是两种常见的嵌入式系统应用技术。虽然它们在某些方面有些相似之处,但它们在体系结构、功能、应用领域和使用方式等方面存在
    的头像 发表于 04-21 09:43 970次阅读

    嵌入式微处理器是单片机

    嵌入式微处理器不是单片机。虽然两者都是嵌入式系统中的核心组成部分,但它们在某些方面存在明显的区别。
    的头像 发表于 03-29 11:40 709次阅读

    嵌入式自学好书推荐

    单片机能为嵌入式系统的开发奠定良好基础。推荐书籍:《新型单片机开关电源的设计与应用》。 4.Linux基础:熟悉Linux源码和架构嵌入式
    发表于 01-11 15:13

    单片机嵌入式入门实验报告相关代码仿真介绍

    电子发烧友网站提供《单片机嵌入式入门实验报告相关代码仿真介绍.zip》资料免费下载
    发表于 12-22 10:52 11次下载

    你用过哪些编程语言开发单片机

    C语言是最常用的种用于单片机的开发语言,也是种高级编程语言,具有较好的可移植性和可读性。对于单片机,通常使用嵌入式C来进行开发。 举
    发表于 12-04 10:18 1276次阅读

    嵌入式C语言的结构特点

    过程中,不论是基于寄存器开发还是基于库开发,深入理解和掌握嵌入式C语言的函数、指针、结构体是学习STM32的关键。嵌入式C语言的结构特点如下。 (1)
    的头像 发表于 11-24 16:16 640次阅读
    <b class='flag-5'>嵌入式</b>C语言的<b class='flag-5'>结构</b>特点