嵌入式实时操作系统small RTOS51原理及应用 ----笔记 第十四章 LED扫描程序的实现
Page172 :
任务 划分:
void Show(void)
{
uint8 i;
/* 初始化显示缓冲区 */
ShowCase[0] = ShowTable[0];
ShowCase[1] = ShowTable[0];
ShowCase[2] = ShowTable[0];
ShowCase[3] = ShowTable[0];
ShowCase[4] = ShowTable[10];
while (1)
{
for (i = 0; i < 5; i++)
{
P1 = 0xff; /* 关闭显示第i位 */
KdTxdByte(ShowCase[i]);
P1 = EbitData[i]; /* 显示第i位 */
OSWait(K_SIG,0); /* 等待1/600秒(由定时器中断决定) */
}
OSWait(K_SIG,0); /* 等待1/600秒(由定时器中断决定) */
OSTimeTick(); /* 调用系统节拍处理程序 */
}
}
为啥 需要 调用 : OSTimeTick(); /* 调用系统节拍处理程序 */
如果设置 EN_TIMER_SHARING 为0 ,那么需要在任务中 调用 OSTimeTick
#define EN_TIMER_SHARING 0 /* 禁止(0)或允许(1)定时器中断调用OSTimeTick() */
#if EN_OS_INT_ENTER >0
#pragma disable /* 除非最高优先级中断,否则,必须加上这一句 */
#endif
void OSTickISR(void) interrupt OS_TIME_ISR
{
//while(1);
#if TICK_TIMER_SHARING >1
static uint8 TickSum = 0;
#endif
#if EN_USER_TICK_TIMER > 0
UserTickTimer(); /* 用户函数 */
#endif
#if TICK_TIMER_SHARING >1
TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
if (TickSum != 0)
{
return;
}
#endif
#if EN_OS_INT_ENTER > 0
OS_INT_ENTER(); /* 中断开始处理 */
#endif
#if EN_TIMER_SHARING > 0
OSTimeTick(); /* 调用系统时钟处理函数 */
#else
OSIntSendSignal(TIME_ISR_TASK_ID); /* 唤醒ID为TIME_ISR_TASK_ID的任务 */
#endif
OSIntExit(); /* 中断结束处理 */
}