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

📄 os_cpu_c.c

📁 1. UC/OS 8051中完全应用。 2. 显示各个任务的执行时间, 执行时间占总时间百分比, tick计数器 3.任务中信号量,消息以及消息队列的使用。 我自己仔细测试过了
💻 C
📖 第 1 页 / 共 2 页
字号:
*
* 描述       : 执行任务切换时调用。这允许你在上下文切换期间执行其它操作。
*
* 参数       : 无
*
* 注意       : 1) 调用期间中断被禁止
*              2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
*                 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
*********************************************************************************************************
*/
void OSTaskSwHook (void) reentrant
{
    INT16U           time;
    TASK_USER_DATA  *puser;


   time  = C51_ElapsedStop();                    /* This task is done      */
    C51_ElapsedStart();                           /* Start for next task    */

    puser = (TASK_USER_DATA*)OSTCBCur->OSTCBExtPtr;               /* Point to used data     */

    if (puser != (TASK_USER_DATA *)0) {
        puser->TaskCtr++;                        /* Increment task counter    */
        puser->TaskExecTime     = time;          /* Update the task's execution time    */
        puser->TaskTotExecTime += time;          /* Update the task's total execution time  */
    }
}

/*
*********************************************************************************************************
*                                          统计任务钩挂函数
*
* 描述       : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
*
* 注意       : 无
*********************************************************************************************************
*/
#if OS_TASK_STAT_EN > 0
extern TASK_USER_DATA  TaskUserData[7];
void OSTaskStatHook (void) reentrant
{
    INT8U   i;
    INT32U  total;
    INT32U   pct;
   OSSchedLock();

    total = 0;                                          /* Totalize TOT. EXEC. TIME for each task */
    for (i = 0; i < 7; i++) {
        total += (INT32U)TaskUserData[i].TaskTotExecTime;
        
          LCD_Print(0,i+4,0,"%5s",TaskUserData[i].TaskName);
		  LCD_Print(7,i+4,0,"%5d",TaskUserData[i].TaskCtr);
		  LCD_Print(13,i+4,0,"%5d",TaskUserData[i].TaskExecTime);
		  LCD_Print(19,i+4,0,"%5d",TaskUserData[i].TaskTotExecTime);
    }
  //  if (total > 0) {
        for (i = 0; i < 7; i++) {                        /* Derive percentage of each task         */
            pct = 100 * (INT32U)TaskUserData[i].TaskTotExecTime; 
			pct	 = pct/total;
            LCD_Print(25,i+4,0,"%3d%%",(INT16U)pct);
        }
//    }
    if (total >65535) {                           /* Reset total time counters at 1 billion */
        for (i = 0; i < 7; i++) {
           TaskUserData[i].TaskTotExecTime = 0L;
        }
    }
	OSSchedUnlock();
}
#endif

/*
*********************************************************************************************************
*                                           OSTCBInit() HOOK
*
* Description: This function is called by OSTCBInit() after setting up most of the TCB.
*
* Arguments  : ptcb    is a pointer to the TCB of the task being created.
*
* Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if OS_VERSION > 203
void OSTCBInitHook (OS_TCB *ptcb) reentrant
{
    ptcb = ptcb;                                           /* Prevent Compiler warning                 */
}
#endif

/*
*********************************************************************************************************
*                                          定时钩挂函数
*
* 描述       : 本函数每一滴答被调用一次。
*
* 参数       : 无
*
* 注意       : 1) 在本调用期间中断可以或不可以使能。
*********************************************************************************************************
*/
void OSTimeTickHook (void) reentrant
{
}

/*
*********************************************************************************************************
*                                             IDLE TASK HOOK
*
* Description: This function is called by the idle task.  This hook has been added to allow you to do  
*              such things as STOP the CPU to conserve power.
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts are enabled during this call.
*********************************************************************************************************
*/
#if OS_VERSION >= 251
void OSTaskIdleHook (void) reentrant
{
}
#endif

#endif

/*
   使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
   在外部任务中实现大量的处理。
   中断处理例程都放在下面。
*/

void UserTickTimer(void)
{
    TH0=0x70;    		//普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
    TL0=0;            	//Tick=50次/秒(即0.02秒/次),晶振22.1184M
    TR0=1;
}

/* 
  ucOS-II系统时钟中断处理程序
*/
extern xdata  int    TickCount;

void OSTickISR(void) interrupt 1
{
    OSIntEnter();					// Must be called first at every hardware interrupt entry point
	UserTickTimer();				// User functions can be called here.
   	OSTimeTick();					// Must be called during tick isr 
   	OSIntExit();					// Must be called finally at every hardware interupt exit point 
}

 void T1_ISR(void) interrupt 3
{
    
    OSIntEnter();					// Must be called first at every hardware interrupt entry point
	TickCount++;
	TH1  = 0xfd;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
    TL1  = 0xe0;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
	TR1  = 1;
   	OSIntExit();					// Must be called finally at every hardware interupt exit point 
}


/*
  设置硬件寄存器的初始值。
  初始化定时器0,作为ucOS-II的系统时钟。
  还有其他的与硬件相关的初始化也可以放在这里。
*/


//串口初始化  0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
void InitHardware(void) reentrant
{   
    TMOD = 0x11;   //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
    TH0  = 0x70;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
    TL0  = 0x00;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
    //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
    TR0  = 0;
	ET0=0;  //开时钟节拍中断
	EA=0;  
	TH1  = 0xfd;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
    TL1  = 0xe0;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
    //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
    TR1  = 0;
	ET1=0;  //开时钟节拍中断
}


⌨️ 快捷键说明

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