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

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

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

Автор: 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




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

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

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