Не подскажите, как по проще организовать обработку очереди.

17 views
Skip to first unread message

cham...@mail.ru

unread,
Mar 25, 2016, 2:03:48 PM3/25/16
to uOS embedded
Не подскажите, как по проще организовать обработку очереди.

Есть массив указателей (Buf), который нужно постепенно обрабатывать. Заполнение массива указателей происходит из прерывания (sys_handler).
Есть задача обработчик (task_obrabotka) и задача (task_razbor), которая разбирает массив указателей и посылает в задачу обработчик.

Приблизительно так:

ARRAY(stack_test1, 1000);
ARRAY(stack_test2, 1000);
ARRAY(stack_test3, 1000);

mutex_t lock1;
mutex_t lock2;
mutex_t lock3;
unsigned int *Buf[100]; //Массив указателей
int n = 0; //Размер массива указателей


void uos_init()
{

    //Задача: Обработчик очереди
    task_create(task_obrabotka, 0, "", 2, stack_test1, sizeof(stack_test1));
    //Задача: Передача указателей в обработчик очереди
    task_create(task_razbor, 0, "", 1, stack_test2, sizeof(stack_test2));
    //Задача: Обработчик прерываний
    task_create(task_irq, 0, "", 3, stack_test3, sizeof(stack_test3));   
}


//Задача: Обработчик очереди
void task_obrabotka(void* arg)
{   
    while (1)
    {
        mutex_lock(&lock1);
        mutex_wait(&lock1);
        debug_printf("Что-то делаем...");
        mutex_unlock(&lock1);
    }
}

//Задача: Передача указателей в обработчик очереди
void task_razbor(void* arg)
{   
    while (1)
    {
        mutex_lock(&lock2);
        mutex_wait(&lock2);

        if (n > 0) {
            mutex_signal (&lock1, (void *)Buf[n]);

            n--;

            //Ожидаем завершения задачи обработчика
            mutex_lock(&lock1);
            mutex_unlock(&lock1);
               }


        mutex_unlock(&lock2);
    }
}




static bool_t sys_handler(void *arg)
{

    //Например добавим три указателя
    Buf[1] = ...;
    Buf[2] = ...;
    Buf[3] = ...;
    n = 3;

    //Постановка задачи в очередь
    mutex_activate (&lock2, 0);

    return 0; //Прерывание не полностью обработано, чтобы произошло переключение задач.
}


//Задача: Обработчик прерываний
void task_irq(void* arg)
{   
    mutex_attach_irq(&lock3, 15, sys_handler, 0);
    while (1)
    {
        mutex_wait(&lock3);

    }
}

Reply all
Reply to author
Forward
0 new messages