野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4542|回复: 1

UCOSII延时时间问题

[复制链接]
发表于 2015-7-2 11:19:32 | 显示全部楼层 |阅读模式
本人在看UCOSII延时程序的时候注意到系统的延时一定要将另一个任务挂起才能够进行,我现在想实现单纯的延时而不再将任务挂起,是否只能调用定时器再建一个新的延时函数?
int main(void)
{
          BSP_Init();
        OSInit();
        OSTaskCreate(Task_Start,        //创建任务Task_LED
                                (void *)0,         //给任务传递参数
                            &startup_task_stk[STARTUP_TASK_STK_SIZE-1],         //设置任务堆栈栈顶指针
                            STARTUP_TASK_PRIO);                                                          //  该任务优先级别为4

        OSStart();                                                                                                  //启动多任务管理
    return 0;
}



void BSP_Init(void)
{
    SystemInit();                /* 配置系统时钟为72M */       
        SysTick_init();                /* 初始化并使能SysTick定时器 */
    LED_GPIO_Config();  /* LED 端口初始化 */
}

/*
* 函数名:SysTick_init
* 描述  :配置SysTick定时器
* 输入  :无
* 输出  :无
*/
void SysTick_init(void)
{
    SysTick_Config(72000000/OS_TICKS_PER_SEC);//初始化并使能SysTick定时器
}


void SysTick_Handler(void)
{
    OSIntEnter();
    OSTimeTick();
    OSIntExit();

}

回复

使用道具 举报

发表于 2015-7-2 18:34:06 | 显示全部楼层
/*
*********************************************************************************************************
*        函 数 名: bsp_DelayUS
*        功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
*                     OSSchedLock(&err);
*                                bsp_DelayUS(5);
*                                OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
*        形    参:n : 延迟长度,单位1 us
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t _ulDelayTime)
{
    uint32_t ticks;
    uint32_t told,tnow,tcnt=0;
    uint32_t reload = SysTick->LOAD; /* LOAD的值 */
         
    ticks = _ulDelayTime * 72;      /* 需要的节拍数 */              
    tcnt = 0;
    told = SysTick->VAL;             /* 刚进入时的计数器值 */

    while(1)
    {
        tnow = SysTick->VAL;   
        if(tnow != told)
        {   
            /* 这里注意一下SYSTICK是一个递减的计数器 */   
            if(tnow < told)
            {
                tcnt += told - tnow;   
            }
            /* 重新装载递减 */
            else
            {
                tcnt += reload - tnow + told;   
            }        
            told = tnow;

            /*时间超过/等于要延迟的时间,则退出 */
            if(tcnt >= ticks)break;
        }  
    }
}
是要自己另外写,利用滴答定时器来实现
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-4 16:47 , Processed in 0.045216 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表