⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 task.lst

📁 嵌入式系统内核模拟器
💻 LST
📖 第 1 页 / 共 3 页
字号:
                      old_prio = _current_prio;
                  }
                  if (!(_tasks[old_prio].state & STATE_READY)) {
                      _tasks[new_prio].state &= ~STATE_ZOMBIE;
                      CRITICAL_EXIT;
                      return ENOTEXIST;
                  }
                  
                  __memcpy(&_tasks[new_prio], &_tasks[old_prio], sizeof(task_t));
                  __tcb_free(old_prio);
              #if CFG_IPC_EN > 0
                  if (_tasks[new_prio].pend_q != NULL) {
                      __queue_remove_f(_tasks[new_prio].pend_q, old_prio);
                      __queue_add_f(_tasks[new_prio].pend_q, new_prio);
                  } else
              #endif
                  { __ready_que_move(old_prio, new_prio); }
              
                  if (_current_prio == old_prio) {
                      _current_prio = new_prio;
                  }
                  CRITICAL_EXIT;
                  
                  __schedule();
                  return EOK;
              }
              #endif
 290          
 291          
 292          #if CFG_PRIO_MODE == 2
              err_t task_change_prio(u8 old_prio, u8 new_prio)
              {
                  register u8 cprio;
                  
              #if CFG_ARG_CHK > 1
                  if ((old_prio >= TASK_IDLE_PRIO && old_prio != SELF_PRIO) ||
                          new_prio >= TASK_IDLE_PRIO) {
                      return EOUTRANGE;
                  }
              #else
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 6   

                  __ASSERT((old_prio < TASK_IDLE_PRIO || old_prio == SELF_PRIO) &&
                          new_prio < TASK_IDLE_PRIO);
              #endif
              
                  CRITICAL_ENTER;
                  if (_tasks[new_prio].state != STATE_NONE) {
                      CRITICAL_EXIT;
                      return EEXIST;
                  }
                  
                  if (old_prio == SELF_PRIO) {
                      cprio    = _current_prio;
                      old_prio = _tasks[cprio].prio.normal;
                  } else if (!__prio_if_normal(old_prio)) {
                      CRITICAL_EXIT;
                      return ENOTEXIST;
                  } else {
                      cprio = _tasks[old_prio].prio.current;
                  }
                  
                  if (_tasks[cprio].lock > 0) {
                      CRITICAL_EXIT;
                      return ELOCK;
                  }
                  __nprio_lock(cprio);
                  _tasks[new_prio].state = STATE_ZOMBIE;
                  CRITICAL_EXIT;
              
                  __dummy();
                  CRITICAL_ENTER;
                  cprio = _tasks[old_prio].prio.current;    
                  __nprio_unlock(cprio);
                  _tasks[cprio].prio.normal = new_prio;
                  
                  __memcpy(&_tasks[new_prio], &_tasks[old_prio], sizeof(task_t));
                  __tcb_free(old_prio);
                  if (cprio == old_prio) {
              #if CFG_IPC_EN > 0
                      if (_tasks[new_prio].pend_q != NULL) {
                          __queue_remove_f(_tasks[new_prio].pend_q, cprio);
                          __queue_add_f(_tasks[new_prio].pend_q, new_prio);
                      } else
              #endif
                      { __ready_que_move(cprio, new_prio); }
                  }
                  
                  if (_current_prio == old_prio) {
                      _current_prio = new_prio;
                  }
                  CRITICAL_EXIT;
                  
                  __schedule();
                  return EOK;
              }
              
              
              err_t task_change_cprio(u8 prio, u8 new_cprio)
              {
                  register u8 old_cprio;
              
              #if CFG_ARG_CHK > 1
                  if ((prio >= TASK_IDLE_PRIO && prio != SELF_PRIO) ||
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 7   

                          new_cprio >= TASK_IDLE_PRIO) {
                      return EOUTRANGE;
                  }
              #else
                  __ASSERT((prio < TASK_IDLE_PRIO || prio == SELF_PRIO) &&
                          new_cprio < TASK_IDLE_PRIO);
              #endif
              
                  /*see if prio is available*/
                  CRITICAL_ENTER;
                  if (prio == SELF_PRIO) {
                      old_cprio = _current_prio;
                      prio      = _tasks[old_cprio].prio.normal;
                  } else if (!__prio_if_normal(prio)) {
                      CRITICAL_EXIT;
                      return ENOTEXIST;
                  } else {
                      old_cprio = _tasks[prio].prio.current;
                  }
                  __nprio_lock(old_cprio);
                  CRITICAL_EXIT;
              
                  __dummy();
                  CRITICAL_ENTER;
                  if (_tasks[new_cprio].state == STATE_NONE ||
                          (_tasks[new_cprio].state == STATE_RESERVED &&
                          prio == new_cprio)) {
                      _tasks[new_cprio].state |= STATE_ZOMBIE;
                  } else {
                      old_cprio = _tasks[prio].prio.current;
                      __nprio_unlock(old_cprio);
                      CRITICAL_EXIT;
                      return EINVAL;
                  }
                  CRITICAL_EXIT;
              
                  __dummy();
                  CRITICAL_ENTER;
                  old_cprio = _tasks[prio].prio.current; /**/
                  if (!(_tasks[prio].state & STATE_ZOMBIE) ||
                          prio == new_cprio) {
                      __nprio_unlock(old_cprio);
              
                      __memcpy(&_tasks[new_cprio], &_tasks[old_cprio], sizeof(task_t));
                      /*free the old current tcb*/
                      __tcb_free(old_cprio);
                      if (prio != new_cprio) {
                          _tasks[prio].delay  = 0;
                          _tasks[prio].state  = STATE_RESERVED;
                          _tasks[prio].prio.current = new_cprio;
                      }
              #if CFG_IPC_EN > 0
                      if (_tasks[new_cprio].pend_q != NULL) {
                          __queue_remove_f(_tasks[new_cprio].pend_q, old_cprio);
                          __queue_add_f(_tasks[new_cprio].pend_q, new_cprio);
                      } else
              #endif
                      { __ready_que_move(old_cprio, new_cprio); }
              
                      if (_current_prio == old_cprio) {
                          _current_prio = new_cprio;
                      }
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 8   

                      CRITICAL_EXIT;
              
                      __schedule();
                      return EOK;
                  } else {
                      __nprio_unlock(old_cprio);
                      _tasks[new_cprio].state &= ~STATE_ZOMBIE;
                      CRITICAL_EXIT;
                      return ENAVAIL;
                  }
              }
              #endif
 439          
 440          
 441          void task_sleep(tick_t ticks)
 442          {
 443   1          register u8 current;
 444   1          
 445   1          if (ticks > 0) {
 446   2              CRITICAL_ENTER;
 447   2              current = _current_prio;
 448   2              _tasks[current].delay = ticks;
 449   2              __ready_que_remove(current);
 450   2              CRITICAL_EXIT;
 451   2              
 452   2              __schedule();
 453   2          }
 454   1      }
 455          
 456          
 457          #if CFG_PRIO_MODE < 2
 458          err_t task_wake(u8 prio)
 459          {
 460   1      #if CFG_ARG_CHK > 1
 461   1          if (prio >= TASK_IDLE_PRIO) {
 462   2              return EOUTRANGE;
 463   2          }
 464   1      #else
                  __ASSERT(prio < TASK_IDLE_PRIO);
              #endif
 467   1      
 468   1          CRITICAL_ENTER;
 469   1          if (_tasks[prio].delay != 0 &&
 470   1                  !(_tasks[prio].state & STATE_SUSPEND)) {
 471   2              _tasks[prio].delay = 0;
 472   2              __ready_que_add(prio);
 473   2              CRITICAL_EXIT;
 474   2      
 475   2              __schedule();
 476   2              return EOK;
 477   2          } else {
 478   2              CRITICAL_EXIT;
 479   2              return EUNKNOW;
 480   2          }
 481   1      }
 482          
 483          #else
              err_t task_wake(u8 prio)
              {
                  register u8 cprio;
              
              #if CFG_ARG_CHK > 1
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 9   

                  if (prio >= TASK_IDLE_PRIO) {
                      return EOUTRANGE;
                  }
              #else
                  __ASSERT(prio < TASK_IDLE_PRIO);
              #endif
              
                  CRITICAL_ENTER;
                  if (!__prio_if_normal(prio)) {
                      CRITICAL_EXIT;
                      return ENOTEXIST;
                  }
                  cprio = _tasks[prio].prio.current;
                  
                  if (_tasks[cprio].delay != 0 &&
                          !(_tasks[cprio].state & STATE_SUSPEND)) {
                      _tasks[cprio].delay = 0;
                      __ready_que_add(cprio);
                      CRITICAL_EXIT;
              
                      __schedule();
                      return EOK;
                  } else {
                      CRITICAL_EXIT;
                      return EUNKNOW;
                  }
              }
              #endif
 517          
 518          
 519          #if CFG_TASK_SUS_EN > 0 && CFG_PRIO_MODE < 2
              err_t task_suspend(u8 prio)
              {
              #if CFG_ARG_CHK > 1
                  if (prio >= TASK_IDLE_PRIO && prio != SELF_PRIO) {
                      return EOUTRANGE;
                  }
              #else
                  __ASSERT(prio < TASK_IDLE_PRIO || prio == SELF_PRIO);
              #endif
                  
                  CRITICAL_ENTER;
                  if (prio == SELF_PRIO) {
                      prio = _current_prio;
                  }
              

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -