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

📄 task.lst

📁 嵌入式系统内核模拟器
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE TASK
OBJECT MODULE PLACED IN .\task.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\..\kernel\task.c INCDIR(d:\rs1.12b\) DEBUG OBJECTEXTEND PRINT(.\task.
                    -lst) OBJECT(.\task.obj) 

stmt level    source

   1          /*
   2          ===============================================================================
   3          | Copyright (C) 2004 RuanHaiShen, All rights reserved.
   4          | SUMMARY: 
   5          |   Task implementation.
   6          |
   7          | DESCRIPTION:
   8          |   See http://www.01s.org for documentation, latest information, license 
   9          |   and contact details.
  10          |   email:ruanhaishen@01s.org
  11          =============================================================================*/
  12          /*===========================================================================*/
  13          #include "arch/arch.h"
  14          #include "inc/queue.h"
  15          #include "inc/kernel.h"
  16          #include "inc/memory.h"
  17          #include "inc/ipc.h"
  18          #include "inc/kapi.h"
  19          
  20          
  21          task_t                      _tasks[CFG_MAX_TASKS];
  22          static byte                 _idle_task_stack[CFG_IDLE_STACKSZ];
  23          
  24          #if ARCH_STACK_GROW == UPWARDS
  25          # define IDLE_STK_TOP       &_idle_task_stack[0]
  26          #else
              # define IDLE_STK_TOP       &_idle_task_stack[CFG_IDLE_STACKSZ - 1]
              #endif
  29          
  30          #if CFG_TASK_INFO_EN > 0
              static u32                  _idle_counter;
              static info_t               _task_info;
              static byte                 _info_task_stack[CFG_INFO_STACKSZ];
              
              #if ARCH_STACK_GROW == UPWARDS
              # define STATUS_STK_TOP     &_info_task_stack[0]
              #else
              # define STATUS_STK_TOP     &_info_task_stack[CFG_INFO_STACKSZ - 1]
              #endif
              #endif
  41          
  42          #if CFG_PRIO_MODE > 1
              # define __nprio_init(prio) \
              do { \
                  _tasks[prio].prio.normal = prio; \
                  _tasks[prio].lock = 0; \
              } while (0)
              #else
  49          # define __nprio_init(prio)    __MPT
  50          #endif
  51          
  52          #if CFG_IPC_EN > 0
              # define __pend_q_init(prio)   _tasks[prio].pend_q = NULL
              #else
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 2   

  55          # define __pend_q_init(prio)   __MPT
  56          #endif
  57          
  58          #define __tcb_init(prio, stack_base) \
  59          do { \
  60              _tasks[prio].stack       = stack_base; \
  61              _tasks[prio].delay       = 0; \
  62              __nprio_init(prio); \
  63              __pend_q_init(prio); \
  64          } while(0)
  65          
  66          #define __tcb_free(prio) \
  67          do { \
  68              _tasks[prio].delay  = 0; \
  69              _tasks[prio].state  = STATE_NONE; \
  70          } while(0)
  71          
  72          
  73          void task_lock(void)
  74          {
  75   1          CRITICAL_ENTER;
  76   1          if (_sched_lock < 0xff) {
  77   2              _sched_lock++;
  78   2          }
  79   1          CRITICAL_EXIT;
  80   1      }
  81          
  82          void task_unlock(void)
  83          {
  84   1          CRITICAL_ENTER;
  85   1          if (_sched_lock > 0x00) {
  86   2              _sched_lock--;
  87   2          }
  88   1          CRITICAL_EXIT;
  89   1      
  90   1          __schedule();
  91   1      }
  92          
  93          
  94          err_t __task_create(
  95              u8          prio,                   /* task priority                */
  96              entry_t     entry,                  /* entry point function         */
  97              arg_t       entry_arg,              /* entry data                   */
  98              sp_t        stack_base              /* stack base                   */
  99          )
 100          {
 101   1          sp_t pstack;
 102   1      
 103   1          __ASSERT(entry != NULL);
 104   1          __ASSERT(stack_base != NULL);
 105   1      
 106   1      #if TASK_IDLE_PRIO < 0xff && CFG_ARG_CHK > 1
 107   1          if (prio > TASK_IDLE_PRIO) {
 108   2              return EOUTRANGE;
 109   2          }
 110   1      #elif TASK_IDLE_PRIO < 0xff
                  __ASSERT(prio <= TASK_IDLE_PRIO);
              #endif
 113   1      
 114   1          CRITICAL_ENTER;
 115   1          if (_tasks[prio].state != STATE_NONE) {
 116   2              CRITICAL_EXIT;
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 3   

 117   2              return EEXIST;
 118   2          }
 119   1          _tasks[prio].state = STATE_ZOMBIE;
 120   1          CRITICAL_EXIT;
 121   1      
 122   1          hook_task_create(prio);
 123   1          pstack = __stack_init(entry, entry_arg, stack_base);
 124   1          __tcb_init(prio, pstack);
 125   1      
 126   1          CRITICAL_ENTER;
 127   1          _tasks[prio].state = STATE_READY;
 128   1          __ready_que_add(prio);
 129   1          CRITICAL_EXIT;
 130   1      
 131   1          __schedule();
 132   1      
 133   1          return EOK;
 134   1      }
 135          
 136          #if CFG_TASK_DEL_EN > 0 && CFG_PRIO_MODE < 2
              err_t task_delete(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;
                  }
                  if (!(_tasks[prio].state & STATE_READY)) {
                      CRITICAL_EXIT;
                      return ENOTEXIST;
                  }
              
              #if CFG_IPC_EN > 0
                  if (_tasks[prio].pend_q != NULL) {
                      __queue_remove_f(_tasks[prio].pend_q, prio);
                  } else 
              #endif
                  { __ready_que_remove(prio); }
                  
                  _sched_lock++;
                  CRITICAL_EXIT;
              
                  __tcb_free(prio);
                  hook_task_delete(prio);
                  
                  CRITICAL_ENTER;
                  if (prio == _current_prio) {
                      _sched_lock = 0;
                  } else {
                      _sched_lock--;
                  }
                  CRITICAL_EXIT;
              
                  __schedule();
              
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 4   

                  return EOK;
              }
              
              #elif CFG_TASK_DEL_EN > 0
              err_t task_delete(u8 prio)
              {
                  register u8 cprio;
                  
              #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 = _tasks[_current_prio].prio.normal;
                  } else if (!__prio_if_normal(prio)) {
                      CRITICAL_EXIT;
                      return ENOTEXIST;
                  }
              
                  cprio = _tasks[prio].prio.current;
                  __nprio_lock(cprio); /*prevent normal-prio being changed*/
                  CRITICAL_EXIT;
              
                  __dummy();
                  CRITICAL_ENTER;
                  cprio = _tasks[prio].prio.current;
              
              #if CFG_IPC_EN > 0
                  if (_tasks[cprio].pend_q != NULL) {
                      __queue_remove_f(_tasks[cprio].pend_q, cprio);
                  } else 
              #endif
                  { __ready_que_remove(cprio); }
              
                  _sched_lock++;
                  CRITICAL_EXIT;
              
                  __tcb_free(cprio);
                  hook_task_delete(prio);
              
                  CRITICAL_ENTER;
                  if (cprio == _current_prio) {
                      _sched_lock = 0;
                  } else {
                      _sched_lock--;
                  }
                  CRITICAL_EXIT;
              
                  __schedule();
              
                  return EOK;
              }
              #endif
 237          
 238          
 239          #if CFG_PRIO_MODE == 1
              err_t task_change_prio(u8 old_prio, u8 new_prio)
C51 COMPILER V6.12  TASK                                                                   12/07/2004 17:58:47 PAGE 5   

              {    
              #if CFG_ARG_CHK > 1
                  if ((old_prio >= TASK_IDLE_PRIO && old_prio != SELF_PRIO) ||
                          new_prio >= TASK_IDLE_PRIO) {
                      return EOUTRANGE;
                  }
              #else
                  __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;
                  }
                  _tasks[new_prio].state = STATE_ZOMBIE;
                  CRITICAL_EXIT;
              
                  __dummy();
                  CRITICAL_ENTER;
                  if (old_prio == SELF_PRIO) {

⌨️ 快捷键说明

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