RTOS笔记---7_同步互斥与通信概述

同步与互斥的概念:                       

eg1——我等你用完厕所,我再用厕所            同步:任务a正在做某件事情,任务b必须等待a做完才能往下走,步调要一致。                      互斥:厕所同一时间只能有一个人使用,我用了你就不能用,这叫互斥。

eg2——在团队活动里,同事A先写完报表,经理B才能拿去向领导汇报。经理B必须等同事A完 成报表,AB之间有依赖,B必须放慢脚步,被称为同步。在团队活动中,同事A已经使用会议室了,经 理B也想使用,即使经理B是领导,他也得等着,这就叫互斥。经理B跟同事A说:你用完会议室就提醒我。这就是使用"同步"来实现"互斥"。

有时候看代码更容易理解,伪代码如下:

01 void 抢厕所(void)
02 {
03 if (有人在用) 我眯一会;
04 用厕所;
05 喂,醒醒,有人要用厕所吗;
06 }

假设有A、B两人早起抢厕所,A先行一步占用了;B慢了一步,于是就眯一会;当A用完后叫醒B,B也 就愉快地上厕所了。 在这个过程中,A、B是互斥地访问“厕所”,“厕所”被称之为临界资源。我们使用了“休眠-唤醒”的同步机 制实现了“临界资源”的“互斥访问”。 同一时间只能有一个人使用的资源,被称为临界资源。比如任务A、B都要使用串口来打印,串口就是临 界资源。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。所以使用串口时, 应该是这样:A用完,B再用;B用完,A再用。

 

RTOS笔记---7_同步互斥与通信概述_第1张图片

如果任务一和任务二同步执行,当flagcalc end=1的时候,CPU耗时4秒多。但是如果将任务二注释掉,任务一标志位等于一的时候,耗时2秒多,同步执行会极大消耗CPU资源。

 

RTOS笔记---7_同步互斥与通信概述_第2张图片

同步执行时,如果不加后面的延时函数,那么将会先执行任务四,接下来一直执行任务四,无法执行任务三。(任务四一直处于全速运行状态,任务三处于ready准备状态,给任务四一个延时,让任务四主动处于阻塞休息一下,让任务三有运行的机会)

下面来自Chatgpt3.5的回答:

如果没有在任务循环中加入 vTaskDelay(1),可能会导致任务3的输出被任务4的输出所覆盖。让我解释一下可能的情况:

在多任务系统中,多个任务共享处理器时间片,每个任务在时间片内轮流执行。当任务3和任务4同时运行时,它们都在循环中执行,并尝试通过串口打印输出。如果没有加入适当的延迟,它们会快速地切换执行,从而可能导致输出内容在串口上混合,或者任务4的输出覆盖了任务3的输出。

通过在任务循环中加入 vTaskDelay(1),您让每个任务在每次循环结束时暂停 1 个时间片的时间,这使得任务在切换之间有一些延迟。这个微小的延迟足够让不同的任务在串口上输出它们的内容,避免了输出内容的混合或覆盖。

总之,vTaskDelay(1) 的作用是为了确保任务之间的公平共享处理器时间,并避免在串口输出上发生混乱。如果没有这个延迟,由于任务间切换非常迅速,可能会导致输出不按预期顺序出现。

 

 

 

 

 

 

你可能感兴趣的:(FreeRTOS,flask)