<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          c語言實(shí)現(xiàn)任務(wù)調(diào)度器

          共 4141字,需瀏覽 9分鐘

           ·

          2022-12-22 06:08

              關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          素材來源:網(wǎng)絡(luò)素材

          整理:技術(shù)讓夢(mèng)想更偉大 | 李肖遙


          一、介紹

          調(diào)度器是常用的一種編程框架,也是操作系統(tǒng)的拆分多任務(wù)的核心,比如單片機(jī)的裸機(jī)程序框架,網(wǎng)絡(luò)協(xié)議棧的框架如can網(wǎng)關(guān)、485網(wǎng)關(guān)等等,使用場(chǎng)合比較多,是做穩(wěn)定產(chǎn)品比較常用的編程技術(shù)

          二、原理

          1、超級(jí)循環(huán)

          void main()
          {
           while(1)
           {
            task1();
            task2();
            ...
           }
          }
          123456789

          2、時(shí)間片與時(shí)標(biāo)

          1)我們把cpu執(zhí)行時(shí)間分成一段一段的,每一段時(shí)間稱為時(shí)間片 2)時(shí)間片的時(shí)間計(jì)時(shí)由定時(shí)器完成,把定時(shí)器定的時(shí)間成為時(shí)標(biāo)

          3、調(diào)度算法介紹

          1)時(shí)間片輪轉(zhuǎn)調(diào)度 2)強(qiáng)占試調(diào)度

          4、注意事項(xiàng)

          1)所有任務(wù)的執(zhí)行時(shí)間不能超過時(shí)標(biāo)的時(shí)間 2)任務(wù)中不能有任何阻塞,比如使用延時(shí)函數(shù) 3)任務(wù)中的延時(shí)或者長(zhǎng)時(shí)間任務(wù)利用狀態(tài)機(jī)拆分成多段

          三、任務(wù)調(diào)度代碼實(shí)現(xiàn)

          這里拿linux來測(cè)試 schduler.c

          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          //        頭文件區(qū)
          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          #include <stdio.h>
          #include "scheduler.h"

          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          //        接口定義區(qū)
          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          #define MAX_TASKS 10
          static volatile unsigned char cur_task_num = 0;

          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          //        變量定義區(qū)
          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          static running_queue_def running_queue[MAX_TASKS] = {0};

          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          //        函數(shù)定義區(qū)
          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          int create_task(const void (*fun)(), unsigned short period)
          {
              unsigned char i;

           if(cur_task_num >= MAX_TASKS)
           {
            printf("over limit max_tasks\n");
            return -1;
           }
              running_queue[i].fun = fun;
              running_queue[i].period = period;
              running_queue[i].cnt = 0;
              
              cur_task_num++;
              return 0;
          }

          int scheduler_run()
          {
              unsigned char i;
              for(i = 0; i < cur_task_num; i++)
              {
                  if(running_queue[i].cnt > 0)
                  {
                      running_queue[i].cnt--;
                  }
                  else
                  {
                      running_queue[i].cnt = running_queue[i].period;
                      running_queue[i].fun();
                  }
              }

              return 0;
          }

          schduler.h

          #ifndef __SCHEDULER_H
          #define __SCHEDULER_H

          typedef struct {
               void (*fun)();        //運(yùn)行函數(shù)
               unsigned short period;//周期
                  unsigned short cnt;
          }running_queue_def;

          int create_task(const void (*fun)(), unsigned short period);
          int scheduler_run();

          #endif

          main.c

          #include "scheduler.h"
          #include <unistd.h>
          #include <stdio.h>

          void task1()
          {
              printf("task1 run\n");
          }

          void task2()
          {
              printf("task2 run\n");
          }

          int main()
          {
              create_task(task1, 1000);
              create_task(task2, 2000);
              while(1)
              {
                  scheduler_run();
                  usleep(1000);
              }

              return 0;
          }

          編譯腳本

          build.sh

          echo "delet main"
          rm -rf main
          sleep 1

          gcc main.c scheduler.c -o main  -w

          echo "build ok "
          ./main

          版權(quán)聲明:本文來源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)聯(lián)系我進(jìn)行刪除。

          ????????????????  END  ???????????????

          關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区AV | 国产精品无码午夜福利 | 久久99精品蜜桃无码 | 中文字幕+乱码+中文ktv | 亚洲视频99 |