OpenEdv-开源电子网

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

FreeRTOS新手求解答

[复制链接]

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
发表于 2019-3-6 15:42:06 | 显示全部楼层 |阅读模式
5金钱
      LED1的优先级高于LED0的优先级,(已经删除浮点任务)
      当第一次vTaskDelay(200),阻塞当前任务,进入LED0任务,进入vTaskDelay(500),等vTaskDelay(200)过后,高任务优先级LED1开始执行,保留现场所以从       延迟之后开始跑,
      但是到vTaskDelay(800)时候,又会进入LED0,此时计时的话,是保留上次计时的数吗?即是从300开始计时吗?
      当计时开始的时候CPU在做什么?因为此时LED1还是在阻塞太,CPU会延迟300后,轮询执行LED0任务吗?(在LED1任务回复就绪状态前)。


    如果我的任务不用任何的延迟,即不用vTaskDelay()函数,怎么去实现多任务?比如I2C读取EEPROM,和读写内部Flash,


   如果CPU在执行当前最高优先级任务,其他任务发生中断怎么处理?(外部按键中断等)


谢谢!

最佳答案

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

会啊, 我之前贴的你没看到在200ms时在执行那个任务么?我都特意让你留意看最右边的时间 led1_task LED1(0); 0s led1_task vTaskDelay(200); 0.x us led0_task LED0Toggle; 0.x us led0_task vTaskDelay(500); 0.x us Idle led1_task LED1(1); 200ms led1_task vTaskDelay(800); 200 ...
穷不可怕,可怕的是穷的是我~~~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 15:42:07 | 显示全部楼层
烈日灼心 发表于 2019-3-7 15:14
是的,比如有2个任务 A和B,A的优先级大于B的优先级,CPU首先执行的是A任务,但是当跑
vTaskDelay(200 ...

会啊, 我之前贴的你没看到在200ms时在执行那个任务么?我都特意让你留意看最右边的时间

led1_task     LED1(0);                          0s
led1_task     vTaskDelay(200);            0.x us
led0_task     LED0Toggle;                   0.x us
led0_task     vTaskDelay(500);            0.x us  
Idle
led1_task     LED1(1);                          200ms
led1_task     vTaskDelay(800);            200ms+0.x us
Idle
led0_task     LED0Toggle;                   500ms
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 15:43:09 | 显示全部楼层
如图!


1551857479(1).jpg
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-3-6 15:53:04 | 显示全部楼层
帮顶~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 15:58:43 | 显示全部楼层
有一个任务叫 IDLE的任务, 不需要你创建, 系统自动生成, 当所有任务都处于阻塞时就执行IDLE任务, 而不会因为某任务优先级高, 就算是处于阻塞, 也硬要你跳过阻塞继续执行的
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 16:10:34 | 显示全部楼层
edmund1234 发表于 2019-3-6 15:58
有一个任务叫 IDLE的任务, 不需要你创建, 系统自动生成, 当所有任务都处于阻塞时就执行IDLE任务, 而不 ...

谢谢回答,那LED1延迟这个800MS,LED0跑完一次就去跑IDLE任务?那什么时候推出IDLE?
是计时超过800ms吗?
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 16:18:30 | 显示全部楼层
或者大家有这方面比较好的资料或者电子档/书本推荐吗
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 16:20:16 | 显示全部楼层
烈日灼心 发表于 2019-3-6 16:10
谢谢回答,那LED1延迟这个800MS,LED0跑完一次就去跑IDLE任务?那什么时候推出IDLE?
是计时超过800ms吗 ...

是, 800ms的阻塞就会跳回LED1任务
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-6 16:26:37 | 显示全部楼层
每个任务的vTaskDelay是根据任务自己的时间的.  和其他任务的时间没关系.

不过系统会调度, 让优先级别高的先执行,  推迟优先级别低的执行而已.  优先级别低的vTaskDelay的实际等待时间会被其他任务占用和拉长

回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 16:28:35 | 显示全部楼层
edmund1234 发表于 2019-3-6 16:20
是, 800ms的阻塞就会跳回LED1任务

实验的结果是LED0每隔500ms反正一次,但是从代码角度看,第一次200ms就会翻转,到了200ms就会退出去执行led1,为啥可以达到500ms的轮询呢
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 16:33:42 | 显示全部楼层
ZHDX 发表于 2019-3-6 16:26
每个任务的vTaskDelay是根据任务自己的时间的.  和其他任务的时间没关系.

不过系统会调度, 让优先级别 ...

我不是很明白,,,
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 16:51:43 | 显示全部楼层
烈日灼心 发表于 2019-3-6 16:28
实验的结果是LED0每隔500ms反正一次,但是从代码角度看,第一次200ms就会翻转,到了200ms就会退出去执行l ...

要不是你的回复写错, 要不就是你理解代码有误
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 17:02:20 | 显示全部楼层
edmund1234 发表于 2019-3-6 16:51
要不是你的回复写错, 要不就是你理解代码有误

代码我都贴上去了。就是不知道怎么跑的呢
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 17:06:17 | 显示全部楼层
烈日灼心 发表于 2019-3-6 17:02
代码我都贴上去了。就是不知道怎么跑的呢

实验的结果是LED0每隔500ms反正一次, 这正是你代码所写的啊
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 17:09:12 | 显示全部楼层
edmund1234 发表于 2019-3-6 17:06
实验的结果是LED0每隔500ms反正一次, 这正是你代码所写的啊

为什么会500ms??
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2019-3-6 17:13:42 | 显示全部楼层
自己先找本书或者看看资料,了解下操作系统原理吧
学无止境
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 17:16:44 | 显示全部楼层

因为在led0_task里的这句 vTaskDelay(500) 啊
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 17:33:56 | 显示全部楼层
edmund1234 发表于 2019-3-6 17:16
因为在led0_task里的这句 vTaskDelay(500) 啊

可能不是这个原因的吧。。
还是我想的太复杂了,你看看我提问题时候的话
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 17:34:21 | 显示全部楼层
jermy_z 发表于 2019-3-6 17:13
自己先找本书或者看看资料,了解下操作系统原理吧

有合适的推荐吗?
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 17:54:22 | 显示全部楼层
烈日灼心 发表于 2019-3-6 17:33
可能不是这个原因的吧。。
还是我想的太复杂了,你看看我提问题时候的话

你应该是对这类系统的操作原理不懂
在宏观的角度看, 多项任务是同时进行的(这正是你还没想通的地方), 当然从微观而论它们不是同时进行的
由于CPU的执行速度与你所用的时间阻塞之比太大, 所以说从宏观的角度看, 这众多的任务是同时进行的。
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 17:56:48 | 显示全部楼层
edmund1234 发表于 2019-3-6 17:54
你应该是对这类系统的操作原理不懂
在宏观的角度看, 多项任务是同时进行的(这正是你还没想通的地方) ...

还是不明白,同时进行是怎么解释得。。。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 18:07:24 | 显示全部楼层
烈日灼心 发表于 2019-3-6 17:56
还是不明白,同时进行是怎么解释得。。。

你有N个任务, 就当有N个CPU,每一任务都单独分配一CPU。
所以不存在你想的, 在led0 Delay了500ms, 然后又在led1 Delay200ms, 所以我再执行led0时应该是700ms后,
每个任务都是单独运行。

这不是实情, 但在宏观的看, 你所用的操作系统表现就是如此。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-6 18:10:29 | 显示全部楼层
我也只能说这么多, 你还是不明白, 我也没办法了
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-6 21:20:32 | 显示全部楼层
你的几个任务根本没事可干, CPU一点都不忙. 当然不会影响延时时间.

尝试一下在任务高的地方写入一些消耗运算力的代码, 让CPU真正忙起来,  之后你就会发现LED0闪得更慢的.

回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 23:03:34 | 显示全部楼层
ZHDX 发表于 2019-3-6 21:20
你的几个任务根本没事可干, CPU一点都不忙. 当然不会影响延时时间.

尝试一下在任务高的地方写入一些消 ...

大哥,,你答非所问啊
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 23:07:22 | 显示全部楼层
edmund1234 发表于 2019-3-6 18:07
你有N个任务, 就当有N个CPU,每一任务都单独分配一CPU。
所以不存在你想的, 在led0 Delay了500ms, 然 ...

可能和我你的想法有出入,我的想法是,LED0的500ms并没有计时到500,因为高优先级的任务经过200ms后成了就绪态。所以。当LED0进行一半,就会执行LED1了,感谢您的回答,我明天在做验证!
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-6 23:11:14 | 显示全部楼层
我举个简单例子吧.

你是一个大管家(CPU)

你的一个客户A, 要求你每天到他办公室处理一下.

你的一个客户B, 也是这样要求的.

你平时很空闲, 客户A和客户B都很满意, 觉得你很准时.



突然有一天, 你的客户B, 要你到美国走一转, 这么一转, 就要3天时间了.

那么你还能执行客户A的动作吗??

回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-6 23:13:14 | 显示全部楼层
ZHDX 发表于 2019-3-6 23:11
我举个简单例子吧.

你是一个大管家(CPU)

我懂你的意思,你的意思是任务需要执行的时间,他们的任务很小,几乎可以忽略这个时间。但是这个不是我的问题呀
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-6 23:16:49 | 显示全部楼层
烈日灼心 发表于 2019-3-6 23:13
我懂你的意思,你的意思是任务需要执行的时间,他们的任务很小,几乎可以忽略这个时间。但是这个不是我的 ...

那就没什么问题了.

你的任务不延迟, 那有什么重要事情一直干下去呢??

那个优先级高的任务如果一直干下去, 是真的会把其他任务卡死的.

但实际的编程工作里, 没这种事情, 就算不断重复一件事情, 中间肯定有空闲的时候要delay一下的.

另外中断是中断,  中断和其他低等级任务无关.    中断的优先级是比任务要大.

回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 09:14:36 | 显示全部楼层
ZHDX 发表于 2019-3-6 23:16
那就没什么问题了.

你的任务不延迟, 那有什么重要事情一直干下去呢??

看你说:但实际的编程工作里, 没这种事情, 就算不断重复一件事情, 中间肯定有空闲的时候要delay一下的.  如果我这个任务是红外解码,或者I2C读写,这个delay会引起任务调度?
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 09:34:35 | 显示全部楼层
烈日灼心 发表于 2019-3-7 09:14
看你说:但实际的编程工作里, 没这种事情, 就算不断重复一件事情, 中间肯定有空闲的时候要delay一下的.   ...

我现在想知道,当LED1任务vTaskDelay 200,跑去LED0任务,有没有跑完vTaskDelay 500,还是说,vTaskDelay200之后不管LED0任务跑没跑完,都会转到LED1任务。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 09:34:56 | 显示全部楼层
edmund1234 发表于 2019-3-6 18:10
我也只能说这么多, 你还是不明白, 我也没办法了

我现在想知道,当LED1任务vTaskDelay 200,跑去LED0任务,有没有跑完vTaskDelay 500,还是说,vTaskDelay200之后不管LED0任务跑没跑完,都会转到LED1任务。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-7 09:54:09 | 显示全部楼层
烈日灼心 发表于 2019-3-7 09:34
我现在想知道,当LED1任务vTaskDelay 200,跑去LED0任务,有没有跑完vTaskDelay 500,还是说,vTaskDelay ...

我可以告诉你这是怎样跑的

但想你先去明白vTaskDelay是什么, 它不是你以往用的Delay, 不是调用后就把一变量从A减到B, 然后返回, 它不是这样的工作原理。
vTaskDelay的工作方式是, 一个变量为你设定的时间(比如是500), 然后由SysTick所触发的1ms中断所递减, 直到等于零就解除阻塞

led1_task     LED1(0);                          0s
led1_task     vTaskDelay(200);            0.x us
led0_task     LED0Toggle;                   0.x us
led0_task     vTaskDelay(500);            0.x us  
Idle
led1_task     LED1(1);                          200ms
led1_task     vTaskDelay(800);            200ms+0.x us
Idle
led0_task     LED0Toggle;                   500ms
led0_task     vTaskDelay(500);            500ms+0.xus
Idle
led1_task     LED1(0);                          1s
led1_task     vTaskDelay(200);            1s + 0.x us
led0_task     LED0Toggle;                   1s + 0.x us
led0_task     vTaskDelay(500);            1s + 0.xus
Idle
led1_task     LED1(1);                          1.2s
led1_task     vTaskDelay(800);            1.2s + 0.x us
Idle
led0_task     LED0Toggle;                   1.5s
led0_task     vTaskDelay(500);            1.5s + 0.xus
" " "
" " "
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 09:59:05 | 显示全部楼层
edmund1234 发表于 2019-3-7 09:54
我可以告诉你这是怎样跑的

但想你先去明白vTaskDelay是什么, 它不是你以往用的Delay, 不是调用后就 ...

看你的这个代码分析,意思好像是LED1 delay 跑去LED0Toggle,在跑完delay500,在跑了一个Idle。在跑LED1,我还是想不懂。也不太明白你的意思。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2019-3-7 10:07:19 | 显示全部楼层
不自己先看看操作系统原理,就开始看代码,一辈子不会理解
学无止境
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-7 10:29:37 | 显示全部楼层
我觉得你应该去学学统筹方法.

或者玩玩一些快餐店游戏.

举个很简单的例子,

你自己是厨师(CPU),

一个烧水的流程是10分钟,

你按烧水,  就相当于烧水的任务代码是  ShaoShui(); vTaskDelay(10分钟);

一旦启动了热水壶,  你自己是CPU, 10分钟之内是不用管这个水壶的.

如果你的所有任务都很轻松,  那么你能准确在10分钟后立刻使用这壶水.

但如果刚巧你有一些很重要的步骤正在做不好打断,  那么你就会选择晚一点管这壶烧好的水.

在这壶烧好的水的角度上, 它就被任务调度影响到了, 自己的vTaskDelay被拖延了. 它不理解你CPU干嘛去了.


这些其实毫无难度,  只要花多一点时间去模拟场景, 去活得类似的经验.

经验不够, 那么理解力就不会够.

回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 11:36:11 | 显示全部楼层
jermy_z 发表于 2019-3-7 10:07
不自己先看看操作系统原理,就开始看代码,一辈子不会理解

就像你说的,道不同不相为谋。不解释了。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 11:37:39 | 显示全部楼层
ZHDX 发表于 2019-3-7 10:29
我觉得你应该去学学统筹方法.

或者玩玩一些快餐店游戏.

可能你说对了,但是和我的问题不相符
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-7 11:38:22 | 显示全部楼层
本帖最后由 edmund1234 于 2019-3-7 11:42 编辑
烈日灼心 发表于 2019-3-7 09:59
看你的这个代码分析,意思好像是LED1 delay 跑去LED0Toggle,在跑完delay500,在跑了一个Idle。在跑LED1 ...
看到你回复的“在跑完delay500”, 感觉你还没能从传统的delay摆脱出来, 它不是你以往所认识的Delay


留意看最右边的时间吧
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2019-3-7 13:03:56 | 显示全部楼层
烈日灼心 发表于 2019-3-7 11:36
就像你说的,道不同不相为谋。不解释了。

嗯  教会你方法,你却自以为是的还在瞎jb乱搞,只能说祝你好运
学无止境
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2019-3-7 13:04:35 | 显示全部楼层
edmund1234 发表于 2019-3-7 11:38
看到你回复的“在跑完delay500”, 感觉你还没能从传统的delay摆脱出来, 它不是你以往所认识的Delay

他就是自以为是的在按照自己的理解在瞎搞,告诉他先去了解下原理,也不去,祝他好运吧
学无止境
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 14:15:20 | 显示全部楼层
ZHDX 发表于 2019-3-6 23:11
我举个简单例子吧.

你是一个大管家(CPU)

我的意思是,如果客户A的优先级高,你在执行客户B的任务,会不会跳到A?因为A的延迟是200ms,B的任务是500ms、
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-7 14:53:22 | 显示全部楼层
本帖最后由 edmund1234 于 2019-3-7 14:55 编辑
烈日灼心 发表于 2019-3-7 09:59
看你的这个代码分析,意思好像是LED1 delay 跑去LED0Toggle,在跑完delay500,在跑了一个Idle。在跑LED1 ...

试试再用这种方式给你解释吧

RTOS有一个叫调度器的东东, 它其实是掌管何时执行那一个任务
vTaskDelay(500)不是类似下面这样的函数
vTaskDelay(int t_in_ms)
{ int i, k;
    for (i=0; i<1000; i++)
     for (k=0; k<t_in_ms; k++);
}
vTaskDelay(500) 是等于告诉调度器, 500ms后再给我这任务分配执行时间, 调度器就会根据你设定的时间, 在SysTick的1ms中断时给你计时, 在这时间还没到之前, 此任务是处于阻塞状态, 调度器是不会给你这任务分配时间的(所谓不给你分配时间, 就是指跳到你这个务任执行程序)

所以不存现你说的执行了vTaskDelay(200)到一半就跳到更优先的任务去, 一执行vTaskDelay(200)几乎就马上离开当前的任务了, 而离开后跳去哪儿, 是调度器根据任务的优先+是否正被vTaskDelay这样的阻塞, 而决定跳到那个任务去, 就算是最高级别的任务, 如果说是被阻塞, 调度器是不会跳去它哪儿去, 直到阻塞被解除。
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-7 14:56:35 | 显示全部楼层
烈日灼心 发表于 2019-3-7 14:15
我的意思是,如果客户A的优先级高,你在执行客户B的任务,会不会跳到A?因为A的延迟是200ms,B的任务是50 ...

你主贴根本就没这个问题.

二, 启用 configUSE_TIME_SLICING 时会定时中断正在的任务并且重新分配工作.

只能帮你倒这里了. 太费劲. 自行理解.
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 15:14:07 | 显示全部楼层
edmund1234 发表于 2019-3-7 14:53
试试再用这种方式给你解释吧

RTOS有一个叫调度器的东东, 它其实是掌管何时执行那一个任务

是的,比如有2个任务 A和B,A的优先级大于B的优先级,CPU首先执行的是A任务,但是当跑
vTaskDelay(200)的时候,就把A挂起,直到完成200ms的延迟,但是在这200ms里,cpu会执行就绪态的B任务,此时在执行B任务的时候,又遇上vTaskDelay(500),这个时候cpu怎么工作。我认为是去执行任务调度器里面创建的最低优先级Idle任务。但是如果A任务的200ms延迟结束,也就是任务A恢复就绪态,CPU会去执行A任务吗。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-7 15:14:38 | 显示全部楼层
ZHDX 发表于 2019-3-7 14:56
你主贴根本就没这个问题.

二, 启用 configUSE_TIME_SLICING 时会定时中断正在的任务并且重新分配工作. ...

抱歉,谢谢。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
 楼主| 发表于 2019-3-8 10:36:43 | 显示全部楼层
edmund1234 发表于 2019-3-7 16:32
会啊, 我之前贴的你没看到在200ms时在执行那个任务么?我都特意让你留意看最右边的时间

led1_task    ...

我理解了。谢谢你。
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

0

主题

29

帖子

0

精华

高级会员

Rank: 4

积分
672
金钱
672
注册时间
2012-2-24
在线时间
226 小时
发表于 2020-5-18 10:33:59 | 显示全部楼层
记号一下。学习了。谢谢大家!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 17:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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