ucos+lwip应用心得[社区]
ut;
sys_timeout_handler h;
void *arg;
again:
timeouts = sys_arch_timeouts();////返回当前任务定时事件链表起始指针
if (!timeouts || !timeouts->next) {//如果定时事件链表为空
&n
} else {
if (timeouts->next->time > 0) {
//如果超时事件链表不为空,而且第一个超时事件的time !=0
//带超时等待消息队列,超时时间等于超时事件链表中第一个超时事件的time,
time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
//在后面分析中可以看到sys_arch_mbox_fetch调用了ucos中的OSQPend系统调
//用从消息队列中读取消息.
//如果”mbox”消息队列不为空,任务立刻返回,否则任务进入阻塞态.
//需要重点说明的是sys_arch_mbox_fetch的返回值time:如果sys_arch_mbox_fetch
//因为超时返回,time=SYS_ARCH_TIMEOUT,
//如果sys_arch_mbox_fetch因为收到消息而返回,
//time = 收到消息时刻的时间-执行sys_arch_mbox_fetch时刻的时间,单位是毫秒
//由于在ucos中任务调用OSQPend系统调用进入阻塞态,到收到消息重新开始执行
//这段时间没有记录下来,所以我们要简单修改ucos的源代码.(后面我们会看到).
} else {
//如果定时事件链表不为空,而且第一个定时事件的time ==0,表示该事件的定时
//时间到
time = SYS_ARCH_TIMEOUT;
}
if (time == SYS_ARCH_TIMEOUT) {
//一个定时事件的定时时间到
tmptimeout = timeouts->next;
timeouts->next = tmptimeout->next;
h = tmptimeout->h;
arg = tmptimeout->arg;
memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
//从内存中释放该定时事件,并执行该定时事件中的函数
if (h != NULL) {
h(arg);
}
//因为定时事件中的定时时间到或者是因为sys_arch_mbo_fetch超时到而执行到
//这里,返回本函数开头重新等待mbox的消息
goto again;
} else {
//如果sys_arch_mbox_fetch无超时收到消息返回
//则刷新定时事件链表中定时事件的time值.
if (time <= timeouts->next->time) {
timeouts->next->time -= time;
} else {
timeouts->next->time = 0;
& 《ucos+lwip应用心得[社区](第7页)》
本文链接地址:http://www.oyaya.net/fanwen/view/148424.html
sys_timeout_handler h;
void *arg;
again:
timeouts = sys_arch_timeouts();////返回当前任务定时事件链表起始指针
if (!timeouts || !timeouts->next) {//如果定时事件链表为空
&n
bsp; sys_arch_mbox_fetch(mbox, msg, 0);//无超时等待消息
} else {
if (timeouts->next->time > 0) {
//如果超时事件链表不为空,而且第一个超时事件的time !=0
//带超时等待消息队列,超时时间等于超时事件链表中第一个超时事件的time,
time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
//在后面分析中可以看到sys_arch_mbox_fetch调用了ucos中的OSQPend系统调
//用从消息队列中读取消息.
//如果”mbox”消息队列不为空,任务立刻返回,否则任务进入阻塞态.
//需要重点说明的是sys_arch_mbox_fetch的返回值time:如果sys_arch_mbox_fetch
//因为超时返回,time=SYS_ARCH_TIMEOUT,
//如果sys_arch_mbox_fetch因为收到消息而返回,
//time = 收到消息时刻的时间-执行sys_arch_mbox_fetch时刻的时间,单位是毫秒
//由于在ucos中任务调用OSQPend系统调用进入阻塞态,到收到消息重新开始执行
//这段时间没有记录下来,所以我们要简单修改ucos的源代码.(后面我们会看到).
} else {
//如果定时事件链表不为空,而且第一个定时事件的time ==0,表示该事件的定时
//时间到
time = SYS_ARCH_TIMEOUT;
}
if (time == SYS_ARCH_TIMEOUT) {
//一个定时事件的定时时间到
tmptimeout = timeouts->next;
timeouts->next = tmptimeout->next;
h = tmptimeout->h;
arg = tmptimeout->arg;
memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
//从内存中释放该定时事件,并执行该定时事件中的函数
if (h != NULL) {
h(arg);
}
//因为定时事件中的定时时间到或者是因为sys_arch_mbo_fetch超时到而执行到
//这里,返回本函数开头重新等待mbox的消息
goto again;
} else {
//如果sys_arch_mbox_fetch无超时收到消息返回
//则刷新定时事件链表中定时事件的time值.
if (time <= timeouts->next->time) {
timeouts->next->time -= time;
} else {
timeouts->next->time = 0;
& 《ucos+lwip应用心得[社区](第7页)》