我在UCOSII中添加了触摸屏程序,但当我按触摸屏后我的程序就会跑到空闲任务中,再也不能回到自己建立的任务。经过我一个上午的查看发现原来是读触摸AD时调用了延时而导致的,因为使用操作系统时已经使用了节拍时钟,而再使用时就会出错。但在使用操作系统中有时我们不想用系统的延时而又要调用延时时就得必须自己写延时,下面我给出我现在用的延时程序,虽然不算得延时很准备但对于毫秒延时是也差不多可以了的。
//包括delay_us,delay_ms
/************************************************************
subs r0,#1; // 使用了16位的Thumb指令,无条件更新标志位。S后
缀的使用要担心,16位的Thunb指令有可能会无条件更新标志位,也有
可能不会。所以,但你需要更新标志位时,一定不要忘了加上S后缀。
bne SysCtlDelay; // 无条件跳转指令有两条,B和BX, BNE中的NE
即NotEqual,对应于标志位Z==0;
表示不等的时候无条件转移到SysCtlDelay处对应的地址;
bx lr; //执行这条指令后,把返回地址存储到LR(R14)中;
*************************************************************/
__asm void
SysCtlDelay(u32 ulCount)
{
subs r0, #1;
bne SysCtlDelay;
bx lr;
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
SysCtlDelay(12000*nms);
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
SysCtlDelay(12*nus);
}
|