72 lines
1.3 KiB
C
72 lines
1.3 KiB
C
/*
|
|
* Implementation of automatic protothreads initialization and scheduling
|
|
*/
|
|
|
|
#include "pt_task.h"
|
|
#include "stdio.h"
|
|
|
|
static int task_start_sch_entry(pt_t *p)
|
|
{
|
|
PT_BEGIN(p);
|
|
|
|
PT_END(p);
|
|
}
|
|
PT_TASK_START(task_start_sch_entry);
|
|
|
|
|
|
static int task_end_sch_entry(pt_t *p)
|
|
{
|
|
PT_BEGIN(p);
|
|
|
|
|
|
|
|
PT_END(p);
|
|
}
|
|
PT_TASK_END(task_end_sch_entry);
|
|
|
|
bool pt_task_is_active(pt_task_t *task)
|
|
{
|
|
if( ( task->status < PT_WAITING ) &&
|
|
(task->status< PT_EXITED) ){
|
|
|
|
return 1;
|
|
|
|
}else{
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Schedule all registered task functions
|
|
*/
|
|
void pt_task_schedule(void)
|
|
{
|
|
pt_task_t* start = (pt_task_t*) PT_TASK_OBJ_START;
|
|
pt_task_t* end = (pt_task_t*) PT_TASK_OBJ_END;
|
|
|
|
for (pt_task_t* task = start; task < end; task++)
|
|
{
|
|
if (task->fn_entry && task->pt && task->status < PT_ENDED)
|
|
{
|
|
task->status = task->fn_entry(task->pt);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
bool pt_task_all_idle(void)
|
|
{
|
|
bool is_idle = true;
|
|
pt_task_t* start = (pt_task_t*)PT_TASK_OBJ_START;
|
|
pt_task_t* end = (pt_task_t*)PT_TASK_OBJ_END;
|
|
for (pt_task_t* task = start; task < end; task++) {
|
|
if (task->pt && pt_task_is_active(task)) {
|
|
is_idle = false;
|
|
break;
|
|
}
|
|
}
|
|
return is_idle;
|
|
}
|
|
|