前面我们学习了怎样去创建任务然后启动。任务创建启动之后,需要依赖一定的资源完成特定的功能。

由于整个系统中无论软硬件资源都是有限的,所以多个任务之间有时需要共享资源。这就会导致任务之间在共享资源时导致冲突。 那么,从这节课程开始,我们就开始学习怎样用RTOS去解决这些资源冲突的问题。首先我们会讲解任务与任务之间共享资源,然后介绍任务与中断之间共享资源。

主要内容

资源有限导致共享

结合课程的介绍及我们自己已有的经验,可以得到发现:资源总是有限的,有限必然导致了任务间共享。

  • 硬件资源是有限的。例如CPU内核寄存器、存储器空间、片内GPIO控制器、板上的LCD等
  • 软件资源总是有限的。任务可用的堆栈空间、串口数据收发的缓冲区等。

通常情况下,正是由于硬件资源的有限,导致了软件资源的有限。
在课程中,我们对这些资源进行进行大致的分类。
资源共享冲突问题概述 - 图1

共享需要避免冲突

既然资源可能被多个任务共享,那么就需要办法解决多任务同时使用资源时的”冲突”问题。当出现”冲突”现像时,可能导致数据读写出现异常,或不一致的状态。如果你还是不理解,在后面我们会看到具体的例子。
在课程中,介绍了两种方案:

  • 程序运行期间,资源完全归某任务管理,其它任务请求该任务读写
  • 按某种原则在多个任务间分配,一旦分配给某任务,其它任务必须等待资源释放

    冲突发生的原因

    之所以会出现冲突,其主要原因在于:任务在执行过程中可能随时被打断。如果在此过程中前一任务正在执行访问资源的代码,此时被打断运行另一个读写该资源的任务,则资源的状态将会被改写。如果再切换回之前的任务,该任务继续按之前的逻辑执行,则会导致资源完全错误,严重导致系统崩溃。
    对于上面的描述,课程中举了几个示例。
    资源共享冲突问题概述 - 图2

资源共享冲突问题概述 - 图3
在以后的课时中,我们还会看到其它的案例。

打断产生的原因

结合我们在RTOS工作原理与功能概述课时中的介绍,我们知道在单CPU上,RTOS是通过分时利用CPU,将CPU不断地在各个任务之间切换执行
资源共享冲突问题概述 - 图4
具体来说,任务切换发生的时间点,可能有如下几种:
资源共享冲突问题概述 - 图5

解决冲突问题

课程中介绍了资源共享冲突的解决方案,提出了临界区的概念。

临界区指的是访问多个任务/中断共享资源的一段代码。 当有任务进入临界区时,其它任务必须等待直至该任务离开临界区,以确定共享资源的访问不会冲突。

为了解决冲突问题,我们只需要对该临界区进行保护:任务在进入临界区后,其它任务无法进入他们各自访问该资源的临界区,除非该任务退出临界区。
资源共享冲突问题概述 - 图6

重点难点

对于任务间共享资源产生的危害及现像,课程中只是介绍了几种示例。
如果能根据自己实际经验,总结发现一些可能存在冲突问题,那么会更好。

注意事项

冲突发生时机不确定性

也许你可能会说:我之前也试过多任务共享同一资源啊,没碰到问题。
没碰到问题并等于没有潜在问题。在视频中也讲到,这个问题发生的时机是不确定的,也就是说不确定它什么时候发生。因为整个应用在执行时,程序的执行状态并不完全预测的,比如你不确定当GPIO中断发生时,当前程序出现在哪里。或者反过来说,当执行某个函数,某个外部中断是否会发生,其它任务究竟执行到了哪行代码?
也许你的代码跑了100天都没问题,但说不定恰恰就在101天就出现这种问题。而一旦出问题,轻则导致某个任务执行功能失败,重则导致系统崩溃。
因此,我们必须采取措施来杜绝这种问题的发生。

常见问题