OpenEdv-开源电子网

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

FreeRTOS使用osDelayUntil()无法正常任务切换??

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-17
在线时间
2 小时
发表于 2020-1-11 18:31:01 | 显示全部楼层 |阅读模式
2金钱
使用cubeMX生成的FreeRTOS工程,由于程序中要使用PID算法,所以要精准控制云台、底盘任务的运行周期,从网上看到的教程说使用osDelayUntil()这个函数,于是我用了。
然后!!
我的工程一共有6个任务,其中云台底盘的优先级是最高的,就是cubemx里选的最高的,并且用osDelayUntil()这个函数控制任务周期,用了之后发现只有这两个任务在跑,其他的都死了,后续测试中发现
如果我都用这个函数,只有优先级最高的两个任务(而且他俩必须同优先级,也就是说优先级最高的)才能运行,现在云台很不稳定,就是PID周期控制的不严格,希望大佬们帮帮,大佬们要是需要我的代码
就私聊我,代码没办法公开。。谢谢谢谢

最佳答案

查看完整内容[请看2#楼]

我给你出一个排除法找问题的方法: 第一步:把6个任务中的代码全部删除 第二步:6个任务如果是周期性任务,添加测试代码: (1)、如果是任务1,则闪烁控制第1个LED 如果是任务2,则闪烁控制第2个LED 如果是任务3,则闪烁控制第3个LED 如果是任务4,则闪烁控制第4个LED 如果是任务5,则闪烁控制第5个LED 如果是任务6,则闪烁控制第6 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2020-1-11 18:31:02 | 显示全部楼层
我给你出一个排除法找问题的方法:

     第一步:把6个任务中的代码全部删除
     第二步:6个任务如果是周期性任务,添加测试代码:
            (1)、如果是任务1,则闪烁控制第1个LED
            如果是任务2,则闪烁控制第2个LED
            如果是任务3,则闪烁控制第3个LED
            如果是任务4,则闪烁控制第4个LED
            如果是任务5,则闪烁控制第5个LED
            如果是任务6,则闪烁控制第6个LED

        (2)、如果任务2需要任务1的信号量或消息队列,则任务1定时给任务2发送信号量,设计1个变量用于记录发送次数,设计一个变量用于观察接收次数。

      (3)、当上述6个任务运行OK后,再一步一步的添加原始代码进来。
                        先添加周期性的任务代码,所有周期性任务代码都能正常跑后,再添加等待信号量或消息队列的任务代码。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-17
在线时间
2 小时
 楼主| 发表于 2020-1-11 22:31:06 | 显示全部楼层
顶一下 大佬们帮帮我
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-1-12 02:55:52 | 显示全部楼层
帮顶
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2020-1-15 17:03:33 | 显示全部楼层
还有周期性任务的延时节拍数和程序执行周期严重脱节时,也会造成低优先级的任务永远得不到执行的机会
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2020-1-15 17:05:50 | 显示全部楼层
等待信号量的任务的优先级要设计的比发送该信号量的任务的优先级高。
    例如:任务A发送信号量,任务B等待信号量。

            当任务A发送完信号量时,任务B会立即得到CPU的控制权。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-1-16
在线时间
0 小时
发表于 2020-1-16 15:38:36 | 显示全部楼层
顶顶顶顶顶顶顶顶顶
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-17
在线时间
2 小时
 楼主| 发表于 2020-1-16 19:59:56 | 显示全部楼层
霸王猫 发表于 2020-1-11 18:31
我给你出一个排除法找问题的方法:

     第一步:把6个任务中的代码全部删除

谢谢 用这个方法找到了问题
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-12-9
在线时间
3 小时
发表于 2020-3-10 14:23:05 | 显示全部楼层
本帖最后由 张文 于 2020-3-10 14:24 编辑

osDelayUntil()延时到的是绝对时间,不是相对时间。比如你要延时100个ticks,不能直接写成osDelayUntil(100);
void xTask(unsigned char *argument)
{
    TickType_t  pxPreviousWakeTime;
    for(;;)
    {
        pxPreviousWakeTime = xTaskGetTickCount();
        xx;
        xx;
        xxxxx;
        osDelayUntil(pxPreviousWakeTime+100);
    }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 21:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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