OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3785|回复: 6

FreeRtos延时问题请教,延时时间不对

[复制链接]

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-12-14
在线时间
32 小时
发表于 2021-9-28 17:19:37 | 显示全部楼层 |阅读模式
1金钱
求教大神,FreeRtos延时问题,在任务主体内部的for循环下面加了绝对延时,总共延时3s,但是实际测下来2s都不到,是哪里出了问题???
if(!GPIO_ReadInputDataBit(PowerONOFFState_GPIO, PowerONOFFState_GPIO_Pin))
    {                             
        while(!GPIO_ReadInputDataBit(PowerONOFFState_GPIO, PowerONOFFState_GPIO_Pin));   
               
        if (0 == g_AlarmFlg || g_AlarmMode == KeyDevicesAlarmMode)    //无报警,关机
        {
            g_ShutDownFlg = 1;//关机标志位置1
            vTaskSuspend(SystemWorkTaskToSuspend);//挂起系统工作任务
            DisplayShutDownFont();//清屏显示关闭主机
            WorkTimeReset();//泄气延迟3s
            for(i = 0; i < 3; i++)
            {
                System_Delay(1000);
            }
            GPIO_OFF(PowerONOFF_GPIO,PowerONOFF_GPIO_Pin);//关闭电源
        }
        else                            //有报警清除报警位,重新自检                                                                    
            {   
                while( 0 == g_ReturnFlg)
                    System_Delay(100);
                vTaskSuspend(AlarmTaskToSuspend);
                vTaskSuspend(AlarmLEDTaskToSuspend);
                g_WorkProcess = SelfTestProcess;                        
                g_AlarmMode  = NoAlarmMode;
                g_AlarmFlg      = 0;        
                g_SelfTestOverFlg = 0;
            }
    }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

889

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1468
金钱
1468
注册时间
2020-8-19
在线时间
333 小时
发表于 2021-9-28 17:47:05 | 显示全部楼层
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-9-28 20:57:13 | 显示全部楼层
freertos 默认会把滴答定时器改成SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 检查你的delay初始化是不是这个
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-12-14
在线时间
32 小时
 楼主| 发表于 2021-9-29 09:08:49 | 显示全部楼层
nashui_sx 发表于 2021-9-28 20:57
freertos 默认会把滴答定时器改成SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 检查你的delay初始化 ...

delay初始化里面是SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
然后System_Delay函数是这样的:
void System_Delay(u16 delay)
{
        portTickType xLastExecutionTime;
        xLastExecutionTime = xTaskGetTickCount();
        vTaskDelayUntil( &xLastExecutionTime, delay );
}
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-9-29 12:35:09 | 显示全部楼层
hj911024 发表于 2021-9-29 09:08
delay初始化里面是SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
然后System_Delay函数是这样的:
...

你这vTaskDelay(3000);不就行了
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-12-14
在线时间
32 小时
 楼主| 发表于 2021-9-29 13:10:32 | 显示全部楼层
nashui_sx 发表于 2021-9-29 12:35
你这vTaskDelay(3000);不就行了

vTaskDelay();跟vTaskDelayUntil();哪个用的多?我都是用的vTaskDelayUntil();这两个我感觉差不多,除非是特定的固定频率做一个动作
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2021-10-1 14:33:50 | 显示全部楼层
建议你在RTOS里边做比较长时间的延时,使用基准+计数的方式,这样比较好,比如你要延时3min,那么可以这么设计,基准延时是1s,那么计数就是3 * 60即可,当然,需要准确一点的,用绝对延时vTaskDelayUntil(),大概的即可,使用vTaskDelay()也行,更加准确那就用硬件定时器了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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