Dingo (18.10.2019 05:59 - 06:44, просмотров: 774) ответил fk0 на Выскажу ещё раз: FreeRTOS сырая недоделка, смысла особого, без реализации ряда перечисленного (см. ниже) не имеет и, хуже того, наоборот вносит существенные ограничения для программиста. Если бы стояла задача выбрать ОС для МК, то я бы скорей
Спасибо! Основательно. Есть ли наброски или может планируете? По приоритетам из своего (недокооперативка): static tsk_desc_t tasklist[NUM_TASK];
static int n_task = 0;
void pts_run_chain(void)
{
for ( n_task=0; n_task<=NUM_TASK; n_task++) {
if( tasklist[n_task].state != 0 && tasklist[n_task].pfunc != 0) {
tasklist[n_task].pfunc(); // Call current task
tasklist[n_task].state = 0; // Clear current state
n_task = 0;
}
}
}
void pts_set_to( int num_tsk, char state)
{
tasklist[num_tsk].state = state;
}
При большом количестве задач долгий обход, но всегда с самого высокого приоритета. tasklist[n_task].state меняется на бит, который может быть только в двух состояниях (в приведённом фрагменте я ещё передавал информацию в задачу), и сама задача уже разбирает сообщение.
pts_run_chain() не зациклен, что дало возможность вставить WFI() после него.
По синхронизации и условной переменной почитаю. Чем, кроме расхода памяти плохо так&
extern int i;
int i = 0;
// в задаче
if ( ++i > 1 ) {
wait_until_its_free(); // можно зациклить на "ожидание 0, попытка захвата"
} else {
do_what_we_want();
i = 0;
}