浅谈架构方法之时间片轮询

这篇具有很好参考价值的文章主要介绍了浅谈架构方法之时间片轮询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PS:最近在逛CSDN的时候偶然发现了一篇文章讲到了这个架构,发现之前做过一个项目就用了这个东西,于是我搜了一下,感觉挺多文章都不好理解,由于我也是最近才接触到这个东西,所以我决定自己也写一篇,加深印象。

架构的类型

        首先,在嵌入式中有三种架构,除了我们熟知的裸机系统和操作系统,第三种就是这个时间片轮询。我认为这种架构是介于二者之间的过渡。

        裸机系统能够处理一些相对简单的任务,但是功能单一,只会一直按顺序执行死循环里的任务,CPU只会全力做完一件事才会进行下一项任务,延时的时候也只会等待,浪费资源。

        操作系统的实时性和可靠性高还能同时执行多个任务,但是操作系统较为复杂,需要额外的学习成本,而且其对内存空间的要求需要我们注意内存的大小。

        而时间片轮询不仅能够实现多任务,保证实时性,而且结构简单,占用内存小,在实际开发中也节省时间和精力。

        对于简单且实时性强的简单任务可以使用时间片轮询,但是当任务数较多的时候还是老实用操作系统更好。

代码实现

        这里我只叙述原理,不设定具体的任务,将整个代码拆分来看,防止看的太乱,整体代码放在最后。

        我设置了三个任务,分别是5ms任务、10ms任务和20ms任务。

        在开始之前,我们需要在主函数里进行一个延时。这个延时一般是最大的时间片时间,像这个例子里,我可以延时20ms。

        首先,我们定义一个最大任务数为3的宏:

#define TASKS_MAX   (3)

         接下来定义一个结构体,其内成员含义如下:

                程序运行标志位。

                倒计时时间。

                重装载倒计时。

                任务指针。

        它们的含义会在后面讲。

typedef struct _TASK_COMPONENTS
{
    uint8_t Run;            
    uint16_t Timer;            
    uint16_t ItvTime;              
    void (*TaskHook)(void);   
} TASK_COMPONENTS; 

        接下来我们创建一个结构体数组用来存放我们定义的结构体成员变量。

        数组中每个元素都对应着我们定义的结构体成员。

/* 任务数组 */
static TASK_COMPONENTS TaskComps[] = 
{
    {0, 5, 5, task_5ms},            // 5ms任务
    {0, 10, 10, task_10ms},         // 10ms任务
    {0, 20, 20, task_20ms},         // 20ms任务
};

        接下来是重点了。

        这个函数需要放到系统定时器中断中执行,同时对所有任务进行计时。

        当有任务的值为0时,将其代入for()循环执行。

        当每个任务的Timer不为0时,进行减减操作,即倒计时。当其减到0的时候,将ItvTime的值赋给Timer,以方便下次计时。同时将程序运行标志位Run置1.

/* 任务启动倒计时 */
void TaskRemarks(void)
{
    uint8_t i;

    for (i=0; i<TASKS_MAX; i++)          
    {
         if (TaskComps[i].Timer)        
        {
           TaskComps[i].Timer--;         
           if (TaskComps[i].Timer == 0)       
           {
             TaskComps[i].Timer = TaskComps[i].ItvTime; 
             TaskComps[i].Run = 1;           
           }
        }
   }
}

        下面这个函数依然是从0开始遍历每个任务,判断它们的Run是否为1,如果是1则执行对应的任务,然后将标志位置0。

void TaskProcess(void)
{
    uint8_t i;

    for (i=0; i<TASKS_MAX; i++)           
    {
         if (TaskComps[i].Run)           
        {
             TaskComps[i].TaskHook();         
             TaskComps[i].Run = 0;          
        }
    }   
}

         至于任务里面实现什么功能,就任由我们按实际需求了。

        当20ms任务执行过一次之后,一个周期就结束了。如果我们把TaskRemarks()放到SysTick的中断服务函数中,那么当这个中断执行的时候,滴答计时器的计数就会重置,同时TaskRemarks()函数也会重新执行,从而达到时间片轮询的效果。文章来源地址https://www.toymoban.com/news/detail-858838.html

完整代码

#define TASKS_MAX   (3)

typedef struct _TASK_COMPONENTS
{
    uint8_t Run;            
    uint16_t Timer;            
    uint16_t ItvTime;              
    void (*TaskHook)(void);   
} TASK_COMPONENTS; 

/* 任务数组 */
static TASK_COMPONENTS TaskComps[] = 
{
    {0, 5, 5, task_5ms},            // 5ms任务
    {0, 10, 10, task_10ms},         // 10ms任务
    {0, 20, 20, task_20ms},         // 20ms任务
};

/* 任务启动倒计时 */
void TaskRemarks(void)
{
    uint8_t i;

    for (i=0; i<TASKS_MAX; i++)          
    {
         if (TaskComps[i].Timer)        
        {
           TaskComps[i].Timer--;         
           if (TaskComps[i].Timer == 0)       
           {
             TaskComps[i].Timer = TaskComps[i].ItvTime; 
             TaskComps[i].Run = 1;           
           }
        }
   }
}

void TaskProcess(void)
{
    uint8_t i;

    for (i=0; i<TASKS_MAX; i++)           
    {
         if (TaskComps[i].Run)           
        {
             TaskComps[i].TaskHook();         
             TaskComps[i].Run = 0;          
        }
    }   
}

void task_5ms(void)
{ }
void task_10ms(void)
{ }
void task_20ms(void)
{ }

到了这里,关于浅谈架构方法之时间片轮询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 按键FIFO实现以及单片机时间片轮循法实现

    目录 本文简介 实验平台 正文 一、主函数实现 二、按键驱动 C文件 H文件 三、SYSTICK定时器实现时间片轮循法方法 C文件 H文件 本文主要介绍一套按键驱动代码以及使用SYSTICK定时器实现延时和嵌入式单片机时间片轮循法实现。 ①单片机型号:STM32F103RCT6 ②编译软件:KEIL5 ③硬

    2024年02月13日
    浏览(34)
  • 用code去探索理解Llama架构的简单又实用的方法

    除了白月光我们也需要朱砂痣       我最近也在反思,可能有时候算法和论文也不是每个读者都爱看,我也会在今后的文章中加点code或者debug模型的内容,也许还有一些好玩的应用demo,会提升这部分在文章类型中的比例       今天带着大家通过代码角度看一下Llama,或者说看

    2024年02月20日
    浏览(51)
  • springboot业务功能实战(四)告别轮询,websocket的集成使用

    org.springframework.boot spring-boot-starter-websocket 加入配置类 @Configuration public class WebSocketConfig { /** 注入ServerEndpointExporter, 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 加入连接发送消

    2024年04月15日
    浏览(46)
  • Secure CRT 自动记录日志和时间戳功能配置的方法

    我是开始工作后才使用SecureCRT,一直没记录过日志不过搜了下,看看这功能不错,可以看看自己做什么,有时甚至可以看看之前是不是犯了什么错,很不错的功能所以我也决定开始记录日志,设置很简单,不过我自己瞎捣鼓发现还可以自动分文件夹,不知道大家是否都知道,因

    2024年02月07日
    浏览(36)
  • 浅谈数据仓库架构设计

    个人认为数据中台本质上是一种新的适配大数据技术发展的新的“数据仓库-决策支持(商业智能)”架构。这个架构是构建在传统的架构基础之上,对传统架构的一种新的发展。 数据中台从企业的视角出发,要求企业在构建数据仓库到决策支持系统的过程中构建一个服务型

    2024年02月15日
    浏览(58)
  • 如何在C/C++中测量一个函数或者功能的运行时间(串行和并行,以及三种方法的实际情况对比)

    本文算是一个比较完整的关于在 C/C++ 中测量一个函数或者功能的总结,最后会演示三种方法的对比。 最常用的测量方法是使用 clock() 来记录两个 CPU 时间点 clock_t ,然后做差。这个方法的好处在于非常简单易写,如下(第一行是为说明需要导入哪个库): 需要注意 3 点:

    2024年04月23日
    浏览(37)
  • javascript中轮询一个接口的方法,setInterval和setTimeout + 递归、requestAnimationFrame

    轮询:就是定时重复请求一个接口,比如,我们想要知道一个订单的状态,就需要轮训订单状态的接口,查询到我们想要的结果 (支付成功或者失败) 就终止轮询。 方法一:setInterval 这个方法我们一般都能想到,用法很简单,但是这种方法,如果我们忘记了清空定时器就会导

    2024年02月16日
    浏览(52)
  • 浅谈Flink架构及拓扑图

    声明 : 本文是博主阅读 云邪(Jark)博客 整理后的笔记,如有侵权,可联系博主删除。 本文参考文章如下: https://wuchong.me/blog/2016/05/03/flink-internals-overview/ https://wuchong.me/blog/2016/05/04/flink-internal-how-to-build-streamgraph/ https://wuchong.me/blog/2016/05/10/flink-internals-how-to-build-jobgraph/ http

    2024年01月25日
    浏览(39)
  • 浅谈复杂业务系统的架构设计

    作者:京东科技 皮亮 我们经常提到复杂系统,那么到底什么是复杂系统。我们看下维基的定义:复杂系统(英语:complex system),又称复合系统,是指由许多可能相互作用的组成成分所组成的系统。强调了两点: 由点组成 点之间有各种关联 两点的规模和复杂性直接决定了

    2024年02月01日
    浏览(78)
  • 车联网TSP的架构浅谈

    随着车联网技术的发展,车联网TSP(Telematics Service Provider)在汽车安全、驾驶行为、智能导航等方面发挥着重要的作用。本文将主要讨论车联网TSP的技术架构方面,包括车联网TSP的组成、通信协议、数据管理等方面的内容。 车联网TSP主要由三个基本组成部分组成:汽车端、通

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包