📄 os_cpu_c.c
字号:
*
* 描述 : 执行任务切换时调用。这允许你在上下文切换期间执行其它操作。
*
* 参数 : 无
*
* 注意 : 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 + -