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

📄 os_cpu_c.lst

📁 1. UC/OS 8051中完全应用。 2. 显示各个任务的执行时间, 执行时间占总时间百分比, tick计数器 3.任务中信号量,消息以及消息队列的使用。 我自己仔细测试过了
💻 LST
📖 第 1 页 / 共 2 页
字号:
 193          * 参数       : 无
 194          *
 195          * 注意       : 1) 调用期间中断被禁止
 196          *              2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
 197          *                 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
 198          *********************************************************************************************************
 199          */
 200          void OSTaskSwHook (void) reentrant
 201          {
 202   1          INT16U           time;
 203   1          TASK_USER_DATA  *puser;
 204   1      
 205   1      
 206   1         time  = C51_ElapsedStop();                    /* This task is done      */
 207   1          C51_ElapsedStart();                           /* Start for next task    */
 208   1      
 209   1          puser = (TASK_USER_DATA*)OSTCBCur->OSTCBExtPtr;               /* Point to used data     */
 210   1      
 211   1          if (puser != (TASK_USER_DATA *)0) {
 212   2              puser->TaskCtr++;                        /* Increment task counter    */
 213   2              puser->TaskExecTime     = time;          /* Update the task's execution time    */
 214   2              puser->TaskTotExecTime += time;          /* Update the task's total execution time  */
 215   2          }
 216   1      }
 217          
 218          /*
 219          *********************************************************************************************************
 220          *                                          统计任务钩挂函数
 221          *
 222          * 描述       : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
 223          *
 224          * 注意       : 无
 225          *********************************************************************************************************
 226          */
 227          #if OS_TASK_STAT_EN > 0
 228          extern TASK_USER_DATA  TaskUserData[7];
 229          void OSTaskStatHook (void) reentrant
 230          {
 231   1          INT8U   i;
 232   1          INT32U  total;
 233   1          INT32U   pct;
 234   1         OSSchedLock();
 235   1      
 236   1          total = 0;                                          /* Totalize TOT. EXEC. TIME for each task */
 237   1          for (i = 0; i < 7; i++) {
 238   2              total += (INT32U)TaskUserData[i].TaskTotExecTime;
 239   2              
C51 COMPILER V8.08   OS_CPU_C                                                              08/19/2008 10:59:08 PAGE 5   

 240   2                LCD_Print(0,i+4,0,"%5s",TaskUserData[i].TaskName);
 241   2                        LCD_Print(7,i+4,0,"%5d",TaskUserData[i].TaskCtr);
 242   2                        LCD_Print(13,i+4,0,"%5d",TaskUserData[i].TaskExecTime);
 243   2                        LCD_Print(19,i+4,0,"%5d",TaskUserData[i].TaskTotExecTime);
 244   2          }
 245   1        //  if (total > 0) {
 246   1              for (i = 0; i < 7; i++) {                        /* Derive percentage of each task         */
 247   2                  pct = 100 * (INT32U)TaskUserData[i].TaskTotExecTime; 
 248   2                              pct      = pct/total;
 249   2                  LCD_Print(25,i+4,0,"%3d%%",(INT16U)pct);
 250   2              }
 251   1      //    }
 252   1          if (total >65535) {                           /* Reset total time counters at 1 billion */
 253   2              for (i = 0; i < 7; i++) {
 254   3                 TaskUserData[i].TaskTotExecTime = 0L;
 255   3              }
 256   2          }
 257   1              OSSchedUnlock();
 258   1      }
 259          #endif
 260          
 261          /*
 262          *********************************************************************************************************
 263          *                                           OSTCBInit() HOOK
 264          *
 265          * Description: This function is called by OSTCBInit() after setting up most of the TCB.
 266          *
 267          * Arguments  : ptcb    is a pointer to the TCB of the task being created.
 268          *
 269          * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
 270          *********************************************************************************************************
 271          */
 272          #if OS_VERSION > 203
 273          void OSTCBInitHook (OS_TCB *ptcb) reentrant
 274          {
 275   1          ptcb = ptcb;                                           /* Prevent Compiler warning                 */
 276   1      }
 277          #endif
 278          
 279          /*
 280          *********************************************************************************************************
 281          *                                          定时钩挂函数
 282          *
 283          * 描述       : 本函数每一滴答被调用一次。
 284          *
 285          * 参数       : 无
 286          *
 287          * 注意       : 1) 在本调用期间中断可以或不可以使能。
 288          *********************************************************************************************************
 289          */
 290          void OSTimeTickHook (void) reentrant
 291          {
 292   1      }
 293          
 294          /*
 295          *********************************************************************************************************
 296          *                                             IDLE TASK HOOK
 297          *
 298          * Description: This function is called by the idle task.  This hook has been added to allow you to do  
 299          *              such things as STOP the CPU to conserve power.
 300          *
 301          * Arguments  : none
C51 COMPILER V8.08   OS_CPU_C                                                              08/19/2008 10:59:08 PAGE 6   

 302          *
 303          * Note(s)    : 1) Interrupts are enabled during this call.
 304          *********************************************************************************************************
 305          */
 306          #if OS_VERSION >= 251
 307          void OSTaskIdleHook (void) reentrant
 308          {
 309   1      }
 310          #endif
 311          
 312          #endif
 313          
 314          /*
 315             使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
 316             在外部任务中实现大量的处理。
 317             中断处理例程都放在下面。
 318          */
 319          
 320          void UserTickTimer(void)
 321          {
 322   1          TH0=0x70;                   //普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
 323   1          TL0=0;              //Tick=50次/秒(即0.02秒/次),晶振22.1184M
 324   1          TR0=1;
 325   1      }
 326          
 327          /* 
 328            ucOS-II系统时钟中断处理程序
 329          */
 330          extern xdata  int    TickCount;
 331          
 332          void OSTickISR(void) interrupt 1
 333          {
 334   1          OSIntEnter();                                       // Must be called first at every hardware interrupt entry point
 335   1              UserTickTimer();                                // User functions can be called here.
 336   1              OSTimeTick();                                   // Must be called during tick isr 
 337   1              OSIntExit();                                    // Must be called finally at every hardware interupt exit point 
 338   1      }
 339          
 340           void T1_ISR(void) interrupt 3
 341          {
 342   1          
 343   1          OSIntEnter();                                       // Must be called first at every hardware interrupt entry point
 344   1              TickCount++;
 345   1              TH1  = 0xfd;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
 346   1          TL1  = 0xe0;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
 347   1              TR1  = 1;
 348   1              OSIntExit();                                    // Must be called finally at every hardware interupt exit point 
 349   1      }
 350          
 351          
 352          /*
 353            设置硬件寄存器的初始值。
 354            初始化定时器0,作为ucOS-II的系统时钟。
 355            还有其他的与硬件相关的初始化也可以放在这里。
 356          */
 357          
 358          
 359          //串口初始化  0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
 360          void InitHardware(void) reentrant
 361          {   
 362   1          TMOD = 0x11;   //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
 363   1          TH0  = 0x70;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
C51 COMPILER V8.08   OS_CPU_C                                                              08/19/2008 10:59:08 PAGE 7   

 364   1          TL0  = 0x00;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
 365   1          //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
 366   1          TR0  = 0;
 367   1              ET0=0;  //开时钟节拍中断
 368   1              EA=0;  
 369   1              TH1  = 0xfd;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
 370   1          TL1  = 0xe0;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
 371   1          //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
 372   1          TR1  = 0;
 373   1              ET1=0;  //开时钟节拍中断
 374   1      }
 375          
 376          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1759    ----
   CONSTANT SIZE    =     14    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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