SciFi (29.03.2018 10:04, просмотров: 158) ответил PlainUser на ..."Понятно, что прерывать обмен на середине нельзя"... !!! Приоритеты тут вообще не при делах.Очередь нужна.
Приоритеты есть в ТЗ, уважаемый. А очередь без приоритетов я уже делал, кстати: #include "arbiter.h"
#include "uart.h"
#include "assert_static.h"
#include <assert.h>
#define QUEUE_DEPTH 16
static enum arbiter_id queue[QUEUE_DEPTH];
static unsigned int head, tail;
static bool occupied;
void
arbiter_request(enum arbiter_id id)
{
assert_static(IS_PWR_OF_TWO(QUEUE_DEPTH));
if (head - tail < QUEUE_DEPTH)
{
queue[head++ & (QUEUE_DEPTH - 1)] = id;
}
else
{
assert(0);
}
}
bool
arbiter_status(enum arbiter_id id)
{
if (!occupied && (uart_txfull() == 0))
{
if (queue[tail & (QUEUE_DEPTH - 1)] == id)
{
tail++;
occupied = true;
return true;
}
}
return false;
}
void
arbiter_release(void)
{
occupied = false;
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้