Не подскажите, как по проще организовать обработку очереди.
Есть массив указателей (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);
while (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);
}
}