OS_CPU_C.lst
上传用户:tzjinxin1
上传日期:2022-08-08
资源大小:272k
文件大小:20k
开发平台:

Visual C++

  1. C51 COMPILER V8.02   OS_CPU_C                                                              06/22/2006 12:13:15 PAGE 1   
  2. C51 COMPILER V8.02, COMPILATION OF MODULE OS_CPU_C
  3. OBJECT MODULE PLACED IN uCosiiOS_CPU_C.OBJ
  4. COMPILER INVOKED BY: C:KeilC51BINC51.EXE uCosiiOS_CPU_C.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.lstOS_CPU_C.lst)
  5.                     - SRC(.objOS_CPU_C.SRC)
  6. line level    source
  7.    1          /*
  8.    2          *********************************************************************************************************
  9.    3          *                                               uC/OS-II
  10.    4          *                                               实时内核
  11.    5          *
  12.    6          *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
  13.    7          *                                               版权所有
  14.    8          *
  15.    9          *                                            MCU-51 专用代码
  16.   10          *                                           KEIL C51大模式编译
  17.   11          *
  18.   12          * 文件名 : OS_CPU_C.C
  19.   13          * 作者   : Jean J. Labrosse
  20.   14          * 改编   : 杨屹 gdtyy@ri.gdt.com.cn 巨龙公司系统集成开发部 2002.09.27
  21.   15          * 改编   : 钟文青,升级到与ucOS-II 2.51的代码,2003.5
  22.   16          *********************************************************************************************************
  23.   17          */
  24.   18          
  25.   19          #define  OS_CPU_GLOBALS
  26.   20          #include "sourceincludes.h"
  27.   21          
  28.   22          /*
  29.   23          *********************************************************************************************************
  30.   24          *                                        初始化任务堆栈
  31.   25          *
  32.   26          * 描述       : 这个函数被OSTaskCreate()或OSTaskCreateExt()调用,以便初始化新创建任务的堆栈结构。本函数
  33.   27          *              与处理器高度相关。
  34.   28          *
  35.   29          * 参数       : task          指向任务代码的指针
  36.   30          *
  37.   31          *              pdata         当任务第一次执行时将要传入任务的用户数据结构指针
  38.   32          *
  39.   33          *              ptos          栈顶指针。ptos指针被默认为用户堆栈入口指针。如果OS_STK_GROWTH被置1,那么,
  40.   34          *                            ptos指向用户堆栈的最高有效地址。同样地,如果OS_STK_GROWTH清0,ptos将指向
  41.   35          *                            用户堆栈的最低有效地址。
  42.   36          *
  43.   37          *              opt           指定可以改变OSTaskStkInit()行为的选项。(见uCOS_II.H for OS_TASK_OPT_???)。
  44.   38          *
  45.   39          * 返回值     : 我修改了原来的程序,使函数总是返回用户堆栈空间的最低有效地址。这样修改提高了TCB换入换出
  46.   40          *              的效率。
  47.   41          *
  48.   42          * 注意       : 任务堆栈结构:
  49.   43          *
  50.   44          *                                    ---------- -
  51.   45          *                 用户栈最高地址---->|        | |
  52.   46          *                                    ---------- |
  53.   47          *                                    |   ...  | 仿真堆栈空间
  54.   48          *----------                          ---------- | 每任务一个
  55.   49          *|OSTCBCur|               ?C_XBP---->|        | | KEIL自动处理
  56.   50          *----------                          ---------- -
  57.   51          *    |                               |空闲间隔|
  58.   52          *    |     -----------------------   ----------                           ----------
  59.   53          *    ---->|OSTCBCur->OSTCBStkPtr|   |?C_XBP低|                    SP---->|        |
  60.   54          *          -----------------------   ----------                           ----------
  61. C51 COMPILER V8.02   OS_CPU_C                                                              06/22/2006 12:13:15 PAGE 2   
  62.   55          *                     |              |?C_XBP高|                           |        |
  63.   56          *                     |              ---------- -                         ----------
  64.   57          *                     |              |        | |                         |   .    |
  65.   58          *                     |              ---------- |                         |   .    |
  66.   59          *                     |              |        | |                         |   .    |
  67.   60          *                     |              ---------- |                         ----------
  68.   61          *                     |              |   .    |长度                       |        | +1
  69.   62          *                     |              |   .    | |                         ----------
  70.   63          *                     |              |   .    | |             OSStack---->|        | 0
  71.   64          *                     |              ---------- |                         ----------
  72.   65          *                     |              |        | |          OSStkStart---->| 不关心 | -1  低地址
  73.   66          *                     |              ---------- -                         ----------
  74.   67          *                     ------------->|  长度  | 低地址                   系统硬件堆栈
  75.   68          *                                    ----------
  76.   69          *                                     用户堆栈                       长度=SP-OSStkStart
  77.   70          *********************************************************************************************************
  78.   71          */
  79.   72          
  80.   73          OS_STK *OSTaskStkInit (void (*task)(void *pd) reentrant, void *ppdata, OS_STK *ptos, INT16U opt) reentrant
  81.   74          {    
  82.   75   1          OS_STK *stk;
  83.   76   1      
  84.   77   1          ppdata = ppdata;
  85.   78   1          opt    = opt;                               //opt没被用到,保留此语句防止告警产生    
  86.   79   1          stk    = ptos;                              //用户堆栈最低有效地址
  87.   80   1          *stk++ = 15;                                //用户堆栈长度
  88.   81   1          *stk++ = (INT16U)task & 0xFF;               //任务地址低8位
  89.   82   1          *stk++ = (INT16U)task >> 8;                 //任务地址高8位    
  90.   83   1          *stk++ = 0x0A;                              //ACC
  91.   84   1          *stk++ = 0x0B;                              //B
  92.   85   1          *stk++ = 0x00;                              //DPH
  93.   86   1          *stk++ = 0x00;                              //DPL
  94.   87   1          *stk++ = 0x00;                              //PSW
  95.   88   1          *stk++ = 0x00;                              //R0
  96.   89   1          
  97.   90   1              //R3、R2、R1用于传递任务参数ppdata,其中R3代表存储器类型,R2为高字节偏移,R1为低字节位移。
  98.   91   1              //通过分析KEIL汇编,了解到任务的void *ppdata参数恰好是用R3、R2、R1传递,不是通过虚拟堆栈。
  99.   92   1          *stk++ = (INT16U)ppdata & 0xFF;             //R1
  100.   93   1          *stk++ = (INT16U)ppdata >> 8;               //R2
  101.   94   1          *stk++ = 0x01;                              //R3  因为我用的全是XDATA,所以存储器类型固定为1,见C51.PD
  102.              -F第178页说明。
  103.   95   1      
  104.   96   1          *stk++ = 0x04;                              //R4
  105.   97   1          *stk++ = 0x05;                              //R5
  106.   98   1          *stk++ = 0x06;                              //R6
  107.   99   1          *stk++ = 0x07;                              //R7
  108.  100   1                                                      //不用保存SP,任务切换时根据用户堆栈长度计算得出。    
  109.  101   1          *stk++ = (INT16U) (ptos+MaxStkSize) >> 8;   //?C_XBP 仿真堆栈指针高8位
  110.  102   1          *stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
  111.  103   1              
  112.  104   1          return ((void *)ptos);
  113.  105   1      }
  114.  106          
  115.  107          #if OS_CPU_HOOKS_EN
  116.  108          
  117.  109          /*
  118.  110          *********************************************************************************************************
  119.  111          *                                       OS INITIALIZATION HOOK
  120.  112          *                                            (BEGINNING)
  121.  113          *
  122.  114          * Description: This function is called by OSInit() at the beginning of OSInit().
  123.  115          *
  124. C51 COMPILER V8.02   OS_CPU_C                                                              06/22/2006 12:13:15 PAGE 3   
  125.  116          * Arguments  : none
  126.  117          *
  127.  118          * Note(s)    : 1) Interrupts should be disabled during this call.
  128.  119          *********************************************************************************************************
  129.  120          */
  130.  121          #if OS_VERSION > 203
  131.  122          void OSInitHookBegin (void) reentrant
  132.  123          {
  133.  124   1      
  134.  125   1      }
  135.  126          #endif
  136.  127          
  137.  128          /*
  138.  129          *********************************************************************************************************
  139.  130          *                                       OS INITIALIZATION HOOK
  140.  131          *                                               (END)
  141.  132          *
  142.  133          * Description: This function is called by OSInit() at the end of OSInit().
  143.  134          *
  144.  135          * Arguments  : none
  145.  136          *
  146.  137          * Note(s)    : 1) Interrupts should be disabled during this call.
  147.  138          *********************************************************************************************************
  148.  139          */
  149.  140          #if OS_VERSION > 203
  150.  141          void OSInitHookEnd (void) reentrant
  151.  142          {
  152.  143   1      }
  153.  144          #endif
  154.  145          
  155.  146          /*
  156.  147          *********************************************************************************************************
  157.  148          *                                          任务创建钩挂函数
  158.  149          *
  159.  150          * 描述       : 任务创建时调用
  160.  151          *
  161.  152          * 参数       : ptcb是指向将被创建任务的任务控制块的指针。
  162.  153          *
  163.  154          * 注意       : 1) 调用期间中断被禁止
  164.  155          *********************************************************************************************************
  165.  156          */
  166.  157          void OSTaskCreateHook (OS_TCB *ptcb) reentrant
  167.  158          {
  168.  159   1          ptcb = ptcb;                       /* Prevent compiler warning                                     */
  169.  160   1      }
  170.  161          
  171.  162          
  172.  163          /*
  173.  164          *********************************************************************************************************
  174.  165          *                                          任务删除钩挂函数
  175.  166          *
  176.  167          * 描述       : 任务删除时调用
  177.  168          *
  178.  169          * 参数       : ptcb是指向将被删除任务的任务控制块的指针。
  179.  170          *
  180.  171          * 注意       : 1) 调用期间中断被禁止
  181.  172          *********************************************************************************************************
  182.  173          */
  183.  174          #if OS_TASK_DEL_EN > 0
  184.               void OSTaskDelHook (OS_TCB *ptcb) reentrant
  185.               {
  186.                   ptcb = ptcb;                       /* Prevent compiler warning                                     */
  187. C51 COMPILER V8.02   OS_CPU_C                                                              06/22/2006 12:13:15 PAGE 4   
  188.               }
  189.               #endif
  190.  180          
  191.  181          /*
  192.  182          *********************************************************************************************************
  193.  183          *                                          任务切换钩挂函数
  194.  184          *
  195.  185          * 描述       : 执行任务切换时调用。这允许你在上下文切换期间执行其它操作。
  196.  186          *
  197.  187          * 参数       : 无
  198.  188          *
  199.  189          * 注意       : 1) 调用期间中断被禁止
  200.  190          *              2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
  201.  191          *                 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
  202.  192          *********************************************************************************************************
  203.  193          */
  204.  194          void OSTaskSwHook (void) reentrant
  205.  195          {
  206.  196   1      }
  207.  197          
  208.  198          /*
  209.  199          *********************************************************************************************************
  210.  200          *                                          统计任务钩挂函数
  211.  201          *
  212.  202          * 描述       : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
  213.  203          *
  214.  204          * 注意       : 无
  215.  205          *********************************************************************************************************
  216.  206          */
  217.  207          #if OS_TASK_STAT_EN > 0
  218.               void OSTaskStatHook (void) reentrant
  219.               {
  220.               }
  221.               #endif
  222.  212          
  223.  213          /*
  224.  214          *********************************************************************************************************
  225.  215          *                                           OSTCBInit() HOOK
  226.  216          *
  227.  217          * Description: This function is called by OSTCBInit() after setting up most of the TCB.
  228.  218          *
  229.  219          * Arguments  : ptcb    is a pointer to the TCB of the task being created.
  230.  220          *
  231.  221          * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  232.  222          *********************************************************************************************************
  233.  223          */
  234.  224          #if OS_VERSION > 203
  235.  225          void OSTCBInitHook (OS_TCB *ptcb) reentrant
  236.  226          {
  237.  227   1          ptcb = ptcb;                                           /* Prevent Compiler warning                 */
  238.  228   1      }
  239.  229          #endif
  240.  230          
  241.  231          /*
  242.  232          *********************************************************************************************************
  243.  233          *                                          定时钩挂函数
  244.  234          *
  245.  235          * 描述       : 本函数每一滴答被调用一次。
  246.  236          *
  247.  237          * 参数       : 无
  248.  238          *
  249.  239          * 注意       : 1) 在本调用期间中断可以或不可以使能。
  250. C51 COMPILER V8.02   OS_CPU_C                                                              06/22/2006 12:13:15 PAGE 5   
  251.  240          *********************************************************************************************************
  252.  241          */
  253.  242          void OSTimeTickHook (void) reentrant
  254.  243          {
  255.  244   1      }
  256.  245          
  257.  246          /*
  258.  247          *********************************************************************************************************
  259.  248          *                                             IDLE TASK HOOK
  260.  249          *
  261.  250          * Description: This function is called by the idle task.  This hook has been added to allow you to do  
  262.  251          *              such things as STOP the CPU to conserve power.
  263.  252          *
  264.  253          * Arguments  : none
  265.  254          *
  266.  255          * Note(s)    : 1) Interrupts are enabled during this call.
  267.  256          *********************************************************************************************************
  268.  257          */
  269.  258          #if OS_VERSION >= 251
  270.  259          void OSTaskIdleHook (void) reentrant
  271.  260          {
  272.  261   1      }
  273.  262          #endif
  274.  263          
  275.  264          #endif
  276.  265          
  277.  266          /*
  278.  267             使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
  279.  268             在外部任务中实现大量的处理。
  280.  269             中断处理例程都放在下面。
  281.  270          */
  282.  271          
  283.  272          void UserTickTimer(void)
  284.  273          {
  285.  274   1          TH0=0x70;                   //普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
  286.  275   1          TL0=0;              //Tick=50次/秒(即0.02秒/次),晶振22.1184M
  287.  276   1          TR0=1;
  288.  277   1      }
  289.  278          
  290.  279          /* 
  291.  280            ucOS-II系统时钟中断处理程序
  292.  281          */
  293.  282          void OSTickISR(void) interrupt 1
  294.  283          {
  295.  284   1          OSIntEnter();                                       // Must be called first at every hardware interrupt entry point 
  296.  285   1          UserTickTimer();                            // User functions can be called here.
  297.  286   1              OSTimeTick();                                   // Must be called during tick isr 
  298.  287   1              OSIntExit();                                    // Must be called finally at every hardware interupt exit point 
  299.  288   1      }
  300.  289          
  301.  290          /*--------------------------------------------------------------*/
  302.  291          /* ucOS-II的中断服务程序示例                                    */
  303.  292          /*--------------------------------------------------------------*/
  304.  293          #include "sourceserial.h"
  305.  294          
  306.  295          void SerialISR(void) interrupt 4
  307.  296          {
  308.  297   1      #if OS_CRITICAL_METHOD == 3         // Allocate storage for CPU status register 
  309.                   OS_CPU_SR  cpu_sr;
  310.               #endif 
  311.  300   1      
  312.  301   1          OSIntEnter();                                       // Must be called first at every hardware interrupt entry point 
  313. C51 COMPILER V8.02   OS_CPU_C                                                              06/22/2006 12:13:15 PAGE 6   
  314.  302   1          OS_ENTER_CRITICAL();
  315.  303   1          if(TI)
  316.  304   1              {
  317.  305   2                TI=0;
  318.  306   2            pc_send.ptr++;
  319.  307   2            if (pc_send.ptr < pc_send.count)
  320.  308   2              SBUF=pc_send.buffer[pc_send.ptr];
  321.  309   2              }
  322.  310   1              else if(RI)
  323.  311   1              {
  324.  312   2                  RI=0;
  325.  313   2      //处理输入字符
  326.  314   2              }
  327.  315   1          OS_EXIT_CRITICAL();
  328.  316   1      
  329.  317   1              OSIntExit();                    // Must be called finally at every hardware interupt exit point 
  330.  318   1      }
  331.  319          
  332.  320          
  333.  321          /*
  334.  322            设置硬件寄存器的初始值。
  335.  323            初始化定时器0,作为ucOS-II的系统时钟。
  336.  324            还有其他的与硬件相关的初始化也可以放在这里。
  337.  325          */
  338.  326          
  339.  327          //串口初始化  0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
  340.  328          void InitHardware(void) reentrant
  341.  329          {   
  342.  330   1          TMOD = 0x21;   //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
  343.  331   1          TH0  = 0x70;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
  344.  332   1          TL0  = 0x00;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
  345.  333   1          //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
  346.  334   1          TR0  = 1;
  347.  335   1      
  348.  336   1          TH1   = 0xFA;  //晶振22.1084, 波特率 9600
  349.  337   1          ET1   = 0;
  350.  338   1          TR1   = 1;     //start timer1
  351.  339   1          SCON  = 0x50;
  352.  340   1          ES    = 1;
  353.  341   1      
  354.  342   1          //设置串口收发的初始值
  355.  343   1          pc_send.ptr=0;
  356.  344   1          pc_send.count=0;
  357.  345   1              ET0=1;  //开时钟节拍中断
  358.  346   1      }
  359. MODULE INFORMATION:   STATIC OVERLAYABLE
  360.    CODE SIZE        =    963    ----
  361.    CONSTANT SIZE    =   ----    ----
  362.    XDATA SIZE       =      7    ----
  363.    PDATA SIZE       =   ----    ----
  364.    DATA SIZE        =   ----    ----
  365.    IDATA SIZE       =   ----    ----
  366.    BIT SIZE         =   ----    ----
  367. END OF MODULE INFORMATION.
  368. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)