保存桌面快捷方式 - - 设为首页 - 手机版
凹丫丫旗下网站:四字成语大全 - 故事大全 - 范文大全
您现在的位置: 范文大全 >> 理工论文 >> 电子通信论文 >> 正文

ucos+lwip应用心得[社区]


ut;
  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页)》
本文链接地址:http://www.oyaya.net/fanwen/view/148424.html

★温馨提示:你可以返回到 电子通信论文 也可以利用本站页顶的站内搜索功能查找你想要的文章。