цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Реализация простого планировщика задач

Реализация простого планировщика задач

Автор: Mike(admin) от 19-08-2014, 06:55

При создании операционной системы или реализации ее отдельных элементов во встраиваемом приложении важны знания о планировщике задач. Этот сервис позволяет запускать другие программы или задачи в зависимости от конкретных событий. К ним можно отнести, например, наступление определённого времени, переход операционной системы в определенное состояние, поступление запроса через пользовательский интерфейс.


планировщик задач

Приведенный код планировщика задач полезен для знакомства с данным механизмом. Он представляет собой планировщик по методу round-robin, написан на языке C и удобен при отладке на ПК, поскольку содержит приличное количество команд вывода данных на экран printf.



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define MAX_PROCESSES 32 /* максимальное количество процессов в системе */
#define MAX_NAME_LEN 32
/* Блок управления процессами -
* хранит всю необходимую информацию о процессах
*/
struct pcb{
        int pid; /* ID процесса */
        int prio; /* приоритет процесса */
        int attached; /* 1 если в списке процессов, иначе 0 */
        int *function; /* указатель на функцию процесса */
        char name[MAX_NAME_LEN]; /* Наименование процесса */
};
static struct pcb processlist[MAX_PROCESSES];
int process0();
int process1();
 
int process_attach(char *name, int prio, void *function)
{
        int i = 0;
        int ret = -1;
        printf("[dbg] process_attach\n");
        while(i < MAX_PROCESSES) {
                if(strlen(name) > MAX_NAME_LEN) {
                        printf("[err] wrong stringlen\n");
                        return ret;
                }
                if(processlist[i].attached != 1) {
                        printf("attach process at %d\n", i);
                        processlist[i].pid = i;
                        strcpy(processlist[i].name, name);
                        processlist[i].prio = prio;
                        processlist[i].function = function;
                        processlist[i].attached = 1;
                        ret = 0;
                        break;
                }
                printf("\n");
                i++;
        }
        return ret;
 
}
 
int process_detach(int pid)
{
        processlist[pid].attached = 0;
        return 0;
}
/*
* реализация простого планировщика по алгоритму round robin
*/
int scheduler()
{
        int i = 0;
        void (*p)(void);
        while(1) {
                for(i = 0; i < MAX_PROCESSES; i++) {
                        if(processlist[i].attached == 1) {
                        p = (void *)processlist[i].function;
                        (*p)();
                        }
                }
        }
        return 0;
}
/*** Блок тестирования ***/
int process0()
{
        printf("0\n");
        return 0;
}
 
int process1()
{
        printf("1\n");
        return 0;
}
 
int main()
{
        /*
        * запускаем тест здесь
        * */
        printf("basic_scheduler Demo\n");
        process_attach("process0", 100, process0);
        process_attach("process1", 50, process1);
        scheduler();
        return 0;
}



Теги: язык C



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий