硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4502|回复: 6
收起左侧

[FreeRTOS] 任务中有延时如何处理

[复制链接]

4

主题

35

回帖

47

积分

新手上路

积分
47
发表于 2016-6-12 14:00:02 | 显示全部楼层 |阅读模式
开关任务中,解锁开关按下后,电机转动解锁,检测到位置后,延时500mS停止,请问这个500mS怎么处理?

之前裸奔是用的delay_ms(550);现在使用freeRTOS,怎么处理?用vTaskDelayUntil( &xLastWakeTime,550);好像不行诶




               delay_ms(550);           vTaskDelayUntil( &xLastWakeTime,550);
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2016-6-12 14:49:36 | 显示全部楼层
vTaskDelay(550);试试。
回复

使用道具 举报

4

主题

35

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2016-6-12 15:06:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:vTaskDelay(550);试试。 (2016-06-12 14:49) 
void vTaskKey(void * pvParameters)
{
    u8 key=0;
    portTickType xLastWakeTime;
    xLastWakeTime = xTaskGetTickCount();
   
    while(1)
    {
        vTaskDelayUntil( &xLastWakeTime,1);
        key=KEY_Scan();
        
        if(key==1)                         //½aËøOFF
        {
            if(detect==0)            
            {
                MOTO=1;                    //Çy¶ˉμç»ú
                sysLED=0;
                while(1)
                {
                    while(detect==0){};//μè′y¿Õ¿a£¬è»oóÑóê±í£Ö1μç»ú
                    delay_ms(10);
                    //vTaskDelayUntil( &xLastWakeTime,10);
                    if(detect==1)break;//μè′y¿Õ¿a£¬è»oóÑóê±í£Ö1μç»ú
                }   
                delay_ms(550);
                //vTaskDelayUntil( &xLastWakeTime,550);
                MOTO=0;                    //í£Ö1μç»ú
                sysLED=1;
                BACK_COLOR=GRAY;
                LCD_ShowString(110,180,320,24,24,    " LOCK  OFF ");
            }
        }
        
        
        if(key==2)                        //±ÕËøON
        {
            if(detect==1)
            {
                MOTO=1;                    //Çy¶ˉμç»ú
                sysLED=0;
                while(1)
                {
                    while(detect==1){};//μè′y±ÕoÏ£¬è»oóÑóê±í£Ö1μç»ú
                    delay_ms(10);
                    //vTaskDelayUntil( &xLastWakeTime,10);
                    if(detect==0)break;//μè′y±ÕoÏ£¬è»oóÑóê±í£Ö1μç»ú
                }   
                delay_ms(50);
                //vTaskDelayUntil( &xLastWakeTime,50);
                MOTO=0;                    //í£Ö1μç»ú
                sysLED=1;
                BACK_COLOR=GREEN;
                LCD_ShowString(110,180,320,24,24,    " LOCK   ON ");
            }
        
        }
        
    }
}

技术有限,只是写写测试程序,这个是从裸奔改为操作系统的,是不是设计方式,思路有问题?
回复

使用道具 举报

4

主题

35

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2016-6-12 16:10:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:vTaskDelay(550);试试。 (2016-06-12 14:49) 
550mS精度要求还是比较高的诶
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2016-6-12 17:19:35 | 显示全部楼层
用定时器试试
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2016-6-13 00:18:25 | 显示全部楼层

回 swanegong 的帖子

swanegong:void vTaskKey(void * pvParameters)
{
    u8 key=0;
    portTickType xLastWakeTime;
....... (2016-06-12 15:06) 
你现在写的这个程序,还是有些裸机的思想,要转换一下。
1.  if(detect==0)    这个detect应该是全局变量吧。
     怎么修改呢? 你这里是等待key==1和detect==0时执行相应的程序,其实你可以新建一个任务
     并做一个事件标注组等待,等待着两个标志被设置才执行相应的操作。
2. 还有这里的 while(detect==0){};死等,也可以换一个思路去解决的。
回复

使用道具 举报

4

主题

35

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2016-6-13 08:03:09 | 显示全部楼层

回 eric2013 的帖子

eric2013:你现在写的这个程序,还是有些裸机的思想,要转换一下。
1.  if(detect==0)    这个detect应该是全局变量吧。
     怎么修改呢? 你这里是等待key==1和detect==0时执行相应的程序,其实你可以新建一个任务
    .. (2016-06-13 00:18)
恩恩,谢谢硬汉的指导
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 01:25 , Processed in 0.175431 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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