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},//显示工作状态

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

};

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

    关注

    6078

    文章

    45573

    浏览量

    673451
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    工控一体机常见结构类型介绍|外嵌入式、内嵌入式、壁挂一体机

    工控一体机提供多种结构类型以适应不同工业场景需求:嵌入式(最主流)、壁挂、悬臂、桌面、开放
    的头像 发表于 04-16 16:30 77次阅读
    工控<b class='flag-5'>一体机</b>常见<b class='flag-5'>结构</b>类型介绍|外<b class='flag-5'>嵌入式</b>、内<b class='flag-5'>嵌入式</b>、壁挂<b class='flag-5'>式</b><b class='flag-5'>一体机</b>

    嵌入式单片机开发学习路径

    嵌入式系统是现代科技的重要组成部分,广泛应用于智能家居、汽车电子、工业控制、医疗设备等领域。学习嵌入式单片机开发不仅能提升个人技能,还能开拓职业发展路径。本文将为你提供条详细的
    发表于 02-09 15:42

    如何入门单片机/嵌入式

    学的单片机,本科玩了几年嵌入式,做过智能家居,智能小车,示波器,开关电源等等,后来工作(本人芯片行业)以后就没搞了,但是这段时间积累的经验,可以让整个职业生涯受益。 单片机相对来
    发表于 02-02 06:57

    arm嵌入式主板优缺点

    。   二、强大的扩展功能和网络传输功能:随着更多的行业开始使用到嵌入式主板,导致市场对主板功能的要求的差异化越来越大。嵌入式主板ARM的出现,恰恰满足了这个个性化的需求。从扩展性上来讲,8位单片机的扩展
    发表于 01-08 07:08

    个面向单片机、事件驱动的嵌入式开发平台介绍

    EventOS,是个面向单片机、事件驱动的嵌入式开发平台。它主要有两大技术特色:是事件驱动,二是超轻量。EventOS以及其母项目EventOS,目标是开发
    发表于 12-05 06:26

    分享嵌入式开发学习路线

    法,这些语法在嵌入式开发中至关重要。 2. 技能进阶期(2-3个月) 从51单片机过渡到主流的ARM Cortex-M系列(嵌入式就业核心平台),学会使用STM32单片机,掌握
    发表于 12-04 11:01

    嵌入式单片机定义及区别

    ,我们将深入探讨这些不同类型的嵌入式处理器的定义、特性及其在各种应用领域中的作用。 我们的单片机,即嵌入式微控制器MCU,是种高度集成的电子器件。它内部融合了ROM/RAM、总线逻
    发表于 11-17 08:11

    单片机嵌入式,到底是什么关系?

    很多人初次接触嵌入式开发时,都会听到句话:“嵌入式其实就是单片机。”可当你真正开始学习时,会发现嵌入式
    的头像 发表于 11-14 10:28 2067次阅读
    <b class='flag-5'>单片机</b>和<b class='flag-5'>嵌入式</b>,到底是什么关系?

    嵌入式达到什么水平才能就业?

    搭建开发环境并解决依赖包冲突熟悉计算机组成原理核心知识点:能说清 CPU 架构、内存寻址、IO 映射的基本原理,能看懂简单的硬件电路图 (二)实操要求能独立完成 51/STM32 单片机项目开发
    发表于 09-15 10:20

    嵌入式从入门到进阶,怎么学?

    、位操作(直接决定代码效率),通过 串口通信程序 练手(如单片机与 PC 数据互传)。 硬件基础懂数电模电(逻辑门、放大电路)、常用元件(电阻 / 电容 / 三极管),能看懂 51 单片机
    发表于 09-02 09:44

    飞凌嵌入式RK3576多模态大模型图像理解助手,让嵌入式设备“看懂”世界

    (LLM)+视觉语言模型(VLM)多模态架构,推出多模态大模型图像理解助手,为嵌入式设备打造 “智能视觉中枢”,让终端设备能够真正 “看懂” 复杂的世界 。
    的头像 发表于 07-25 11:09 1809次阅读
    飞凌<b class='flag-5'>嵌入式</b>RK3576多模态大模型图像理解助手,让<b class='flag-5'>嵌入式</b>设备“<b class='flag-5'>看懂</b>”世界

    嵌入式单片机,是同个东西吗?

    程序控制各种外部设备,完成特定的操作。 总结来说,单片机嵌入式系统中的种重要硬件组件,而嵌入式系统则是
    发表于 07-09 10:20

    Linux嵌入式单片机嵌入式的区别?

    :使用Linux操作系统,可以运行各种复杂的应用程序和驱动程序。 4. 资源需求 : 单片机嵌入式 :对硬件资源的需求较低,通常只需要
    发表于 06-20 09:46

    嵌入式单片机在电机控制系统中的应用

    有效提升电机控制系统的性能,这也是建立高速实时电机控制系统的前提。 纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:嵌入式单片机在电机控制系统中的应用.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第
    发表于 06-11 15:07

    看懂嵌入式与壁挂工控安装方式的关键差异

    技术人员根据实际需求,制定出科学合理的安装方案。 、安装前期规划差异 (嵌入式工控 嵌入式工控
    的头像 发表于 05-14 14:40 1187次阅读