FOS时间管理包括软定时器、延时函数两者管理(目前是这两者对象,后面会补充各种对象的timeout)。通过一条链表连接对象,由style标识特定对象。
/*time manage*/
typedef structTICK_STR{
LIST list;
U8 style; //timer,delay,wait signer
U32 timeout;
TCB *tcb;
FUNC_PTR func; //for software timer user task function
void *func_arg;
BOOL period;
U32 timeout_copy;
}TICK;
成员解释:
list : 连接链表
style: 对象类型
timeout:计时间
tcb:记录使用对象的任务
func:用于软定时器的用户任务
arg :用于软定时器的用户任务的参数
period:软定时器是否周期性使用
timeout_copy:备份超时的初始值
FOS是通过硬定时器来轮询时间链表,查看是否超时,如果有对象超时,做相应的处理,比如软定时器timeout,那么就调用用户定时任务,根据是否周期性定时操作,而选择删除链表上的软定时器,还是赋值timeout_copy,继续等待下一次轮询。如果是延时超时,timeout只要把任务设置成可以运行的状态并且移动到该优先级队列的头部后面,因为一开始延时是把任务设置成不可以运行状态,然后把任务移动到该优先级队列的末尾。
任务延时os_delay,主要把任务设置成不可以运行状态,把延时任务移到相应优先级的末尾,记录timeout时间,插入tickqueue,标识DELAY功能。
void os_delay(U32timeslice)
{
TICK *timer_delay = &timer_delay_entry;
timer_delay->tcb = new_task;
timer_delay->tcb->state = 0;
timer_delay->timeout = timeslice;
timer_delay->timeout_copy = timeslice;
timer_delay->style = DELAY;
prio_ready_queue_delete(timer_delay->tcb);
prio_ready_queue_insert(timer_delay->tcb);
U32 cpu =interrupt_disable();
tick_queue_insert(timer_delay);
schedule();
interrupt_enable(cpu);
}
Source code download : https://github.com/yangshanjin/YSJ_OS
FOS now is based on OpenRISC.