版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选ppt嵌 入 式 实 时 系 统 - -F r e e R T O S精选ppt1、FreeRTOS简介 FreeRTOS是一个嵌入式系统使用的开源实时系统。是一个嵌入式系统使用的开源实时系统。 FreeRTOS小巧,简单,易用。能支持许多不同硬件小巧,简单,易用。能支持许多不同硬件 架构以及交叉编译器。架构以及交叉编译器。 此系统可以免费进行商业应用,被大量公司与科研公司此系统可以免费进行商业应用,被大量公司与科研公司用于嵌入式产品的开发。用于嵌入式产品的开发。 支持的处理器架构:支持的处理器架构:ARM7,ARM9,COLTEX-m3、AVR、PIC等。等。 精选ppt1、FreeRT
2、OS简介n嵌入式系统:嵌入式系统:n一个专门设计用来做一些简单事情的计算机系统,一个专门设计用来做一些简单事情的计算机系统,如电视遥控器,车载如电视遥控器,车载GPS,电子手表,或者起搏,电子手表,或者起搏器这类。嵌入式系统比通用计算机系统更小更慢,器这类。嵌入式系统比通用计算机系统更小更慢,通常也更便宜。通常也更便宜。n如:低端:一个运行速度为如:低端:一个运行速度为25MHz的的8位位CPU, 几几KB的内存。的内存。n 高端:一个运行速度为高端:一个运行速度为750MHz的的32位位 CPU,一个一个GB左右的内存,和几个左右的内存,和几个GB的闪存。的闪存。精选ppt1、FreeRTO
3、S简介n实时(实时(RT)n软实时:按照任务的优先级,尽可能快地完成操软实时:按照任务的优先级,尽可能快地完成操作即可作即可 。n硬实时:硬实时要求在规定的时间内必须完成操硬实时:硬实时要求在规定的时间内必须完成操作作 。精选ppt1、FreeRTOS简介系统基本架构系统基本架构其代码可以分解为三个主要区块:其代码可以分解为三个主要区块:任务任务通讯通讯硬件接口硬件接口任务:大约任务:大约50%的的FreeRTOS的核心代码的核心代码精选ppt1、FreeRTOS简介通讯:大约通讯:大约40%的的FreeRTOS核心代码是用来处核心代码是用来处理通讯的。任务和中断使用队列互相发送数据,理通讯的
4、。任务和中断使用队列互相发送数据,并且使用信号灯和互斥来发送临界资源的使用情并且使用信号灯和互斥来发送临界资源的使用情况。况。硬件接口:大约有硬件接口:大约有6%的的FreeRTOS的核心代码,的核心代码,在硬件无关的在硬件无关的FreeRTOS内核与硬件相关的代码内核与硬件相关的代码间扮演着垫片的角色。间扮演着垫片的角色。精选ppt2、任务简介2.1任务函数任务函数 任务是由任务是由C语言函数实现的。任务函数其必须返语言函数实现的。任务函数其必须返回回void, 而且带有一个而且带有一个void指针参数。其函数原指针参数。其函数原型参见程序清单型参见程序清单1。void ATaskFunct
5、ion( void *pvParameters ); 程序清单程序清单1 任务函数原型任务函数原型精选ppt2.1任务函数任务函数注意事项:注意事项: FreeRTOS 任务不允许以任何方式从实现函数中返回任务不允许以任何方式从实现函数中返回它们绝不能有一条它们绝不能有一条”return”语句,也不能执行到函数语句,也不能执行到函数末尾。如果一个任务不再需要,可以显式地将其删除末尾。如果一个任务不再需要,可以显式地将其删除(void vTaskDelete( xTaskHandlepxTaskToDelete );)。)。精选ppt2.1任务函数任务函数创建任务创建任务:创建任务使用创建任务使
6、用FreeRTOS的的API函数函数xTaskCreate()。 程序清单程序清单2精选ppt2.1任务函数任务函数n参数介绍参数介绍 :npvTaskCode 一个指向任务的实现函数的指针一个指向任务的实现函数的指针(效果上仅仅是函数效果上仅仅是函数n名名)。npcName 具有描述性的任务名。这个参数不会被具有描述性的任务名。这个参数不会被FreeRTOS使用。使用。其只是单其只是单n纯地用于辅助调试。纯地用于辅助调试。usStackDepth 当任务创建时,内核会分为每个当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态。任务分配属于任务自己的唯一状态。nusStackDepth
7、值用于告诉内核为它分配多大的栈空间。值用于告诉内核为它分配多大的栈空间。n这个值指定的是栈空间可以保存多少个字这个值指定的是栈空间可以保存多少个字(word),而不是多少个字,而不是多少个字n节节(byte)。比如说,如果是。比如说,如果是32位宽的栈空间,传入的位宽的栈空间,传入的usStackDepthn值为值为100,则将会分配,则将会分配400字节的栈空间字节的栈空间(100 * 4bytes)。n。精选pptn参数:参数:npvParameters 任务函数接受一个指向任务函数接受一个指向void的指针的指针(void*)。 pvParameters的值即是传递到任务中的值。的值即是
8、传递到任务中的值。nuxPriority 指定任务执行的优先级。优先级的取值范围可以从最低优先级指定任务执行的优先级。优先级的取值范围可以从最低优先级0到最高优先级到最高优先级(configMAX_PRIORITIES 1)。nconfigMAX_PRIORITIES 是一个由用户定义的常量。是一个由用户定义的常量。npxCreatedTask 用于传出任务的句柄。这个句柄将在用于传出任务的句柄。这个句柄将在API调用中对该创建出调用中对该创建出来的任务进行引用,比如改变任务优先级,或者删除任务。如果应用程序中来的任务进行引用,比如改变任务优先级,或者删除任务。如果应用程序中不会用到这个任务的
9、句柄,则不会用到这个任务的句柄,则pxCreatedTask可以可以n被设为被设为NULL精选pptn返回值返回值 n有两个可能的返回值:有两个可能的返回值:n1.pdTRUE n表明任务创建成功。表明任务创建成功。n2.errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY n由于内存堆空间不足,由于内存堆空间不足,FreeRTOS无法分配足够的空间来无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。保存任务结构数据和任务栈,因此无法创建任务。n第五章将提供更多有关内存管理方面的信息。第五章将提供更多有关内存管理方面的信息。精选ppt2.1任务函数任务函数例
10、例1. 创建任务创建任务本例演示了创建并启动两个任务的必要步骤。本例演示了创建并启动两个任务的必要步骤。两个任务内容:两个任务内容:周期性地打印输出字符串。周期性地打印输出字符串。两者在创建时指定了相同的优先级。两者在创建时指定了相同的优先级。精选ppt任务一:周期性输出任务一:周期性输出: Task 1 is runningrn精选ppt任务二:周期性输出任务二:周期性输出: Task 2 is runningrn精选pptmain()函数:简单地创建这两个任务,然后启动调函数:简单地创建这两个任务,然后启动调度器度器精选ppt运行结果:运行结果: 图一图一 精选ppt2.1任务函数任务函数
11、任务分配分析:任务分配分析:图图2中看到两个任务在同时运行,事实上这两个任务中看到两个任务在同时运行,事实上这两个任务由于优先级相同,而且在一个处理器上运行,其由于优先级相同,而且在一个处理器上运行,其实是在交替运行。实是在交替运行。真实的执行流程所图真实的执行流程所图3所示所示精选ppt 2.1任务函数任务函数 图二精选ppt2.1任务函数任务函数 上例中上例中main()函数在启动调度器之前先完成两个任务函数在启动调度器之前先完成两个任务 的创建。当然也可以从一个任务中创建另一个任务。的创建。当然也可以从一个任务中创建另一个任务。 我们可以先在我们可以先在main()中创建任务中创建任务1
12、,然后在任务,然后在任务1中创中创建任务建任务2这样需要在任务一中添加以下语句:这样需要在任务一中添加以下语句: xTaskCreate( vTask2, Task 2, 1000, NULL, 1, NULL );精选ppt2.1任务函数任务函数n关于使用关于使用xTaskCreate()时任务函数的参数时任务函数的参数问题问题n例例1中的两个任务几乎完全相同,唯一的区中的两个任务几乎完全相同,唯一的区别就是打印输出的字符串。这种重复性可别就是打印输出的字符串。这种重复性可以通过创建同一个任务代码的两个实例来以通过创建同一个任务代码的两个实例来去除。去除。n这时任务参数就可以用来传递各自打印
13、输这时任务参数就可以用来传递各自打印输出的字符串。出的字符串。精选ppt我们仍然调用两次xTaskCreate(),但其,但其pvParameters(第四个)(第四个) 参数变为了两个不同的指针,两个指针分别指向各自需要打印输出的文本。精选ppt2.2任务调度任务的调度方法:任务的调度方法:通过对任务设置优先级进行优先级抢占式调度。通过对任务设置优先级进行优先级抢占式调度。每个任务都赋予了一个优先级。每个任务都赋予了一个优先级。每个任务都可以存在于一个或多个状态。每个任务都可以存在于一个或多个状态。在任何时候都只有一个任务可以处于运行状态。在任何时候都只有一个任务可以处于运行状态。调度器总是
14、在所有处于就绪态的任务中选择具调度器总是在所有处于就绪态的任务中选择具有最高优先级的任务来执行。有最高优先级的任务来执行。精选ppt2.2任务调度优先级:优先级: xTaskCreate() API函数的参数函数的参数uxPriority(即第五个(即第五个参数)为创建的任务赋予了一个初始优先级。参数)为创建的任务赋予了一个初始优先级。 常量常量configMAX_PRIORITIES在在(FreeRTOSConfig.h文件中)的值,即是系统最多可具文件中)的值,即是系统最多可具有的优先级数目。有的优先级数目。0到到(configMAX_PRIORITES 1) 函数优先级可以调用函数优先级
15、可以调用vTaskPrioritySet() API函数进行函数进行修改。修改。精选ppt2.2任务调度n关于优先级为零的任务介绍:关于优先级为零的任务介绍:n 当创建的任务都处于阻塞态时(很多时候都会有这种当创建的任务都处于阻塞态时(很多时候都会有这种情况出现),这种状态下所有的任务都不可运行,但处理情况出现),这种状态下所有的任务都不可运行,但处理器总是需要代码来执行器总是需要代码来执行所以至少要有一个任务处于运所以至少要有一个任务处于运行态。行态。n 为了保证这一点,当调用为了保证这一点,当调用vTaskStartScheduler()时,时,调度器会自动创建一个空闲任务(非常短小的循环
16、)。调度器会自动创建一个空闲任务(非常短小的循环)。n空闲任务拥有最低优先级空闲任务拥有最低优先级(优先级优先级0),这样不会妨碍具有更,这样不会妨碍具有更高优先级的应用任务进入运行态。高优先级的应用任务进入运行态。精选ppt2.2任务调度n图中任务一(图中任务一(Task1)任务二()任务二(Task2)都设置有定时阻)都设置有定时阻塞,任务二的优先级高于任务一的优先级,在两个任务都塞,任务二的优先级高于任务一的优先级,在两个任务都被阻塞的时候,空闲任务被阻塞的时候,空闲任务(idle)开始执行。开始执行。n 图三图三精选ppt2.2任务调度n空闲任务钩子函数:空闲任务钩子函数:n 通过空闲
17、任务钩子函数通过空闲任务钩子函数(或称回调,或称回调,hook, or call-back),可以直接在空闲任务中添加应用程序,可以直接在空闲任务中添加应用程序相关的功能。空闲任务钩子函数会被空闲任务每相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。循环一次就自动调用一次。n 空闲任务钩子函数有很多用途,如在没有任空闲任务钩子函数有很多用途,如在没有任何应用功能需要处理的时候,将系统配置到省电何应用功能需要处理的时候,将系统配置到省电模式。模式。精选ppt2.2任务调度n定义一个空闲任务钩子函数:定义一个空闲任务钩子函数:nvoid vApplicationIdleHook(
18、 void ); FreeRTOSConfig.h中的配置常中的配置常configUSE_IDLE_HOOK必须定义为必须定义为1,这样空闲任务钩子函数才会被调用。,这样空闲任务钩子函数才会被调用。精选ppt2.2任务调度n空闲任务钩子函数必须遵从以下规则:空闲任务钩子函数必须遵从以下规则:n1. 绝不能阻塞或挂起。空闲任务的目的就是希望绝不能阻塞或挂起。空闲任务的目的就是希望在所有任务阻塞时仍能有任务运行,一旦钩子函在所有任务阻塞时仍能有任务运行,一旦钩子函数阻塞或挂起,将不再有任务运行。数阻塞或挂起,将不再有任务运行。n2. 如果应用程序用到了如果应用程序用到了vTaskDelete()
19、函数,则函数,则空闲钩子函数必须能够尽快返回。空闲钩子函数必须能够尽快返回。n因为在任务被删除后(因为在任务被删除后(vTaskDelete()),空闲任),空闲任务负责回收内核资源。如果空闲任务一直运行在务负责回收内核资源。如果空闲任务一直运行在钩子函数中,则无法进行回收工作。钩子函数中,则无法进行回收工作。精选ppt2.2任务调度n任务优先级的改变任务优先级的改变n API函数函数vTaskPriofitySet()可以用于在调度器启动后可以用于在调度器启动后改变任何任务的优先级。改变任何任务的优先级。n void vTaskPrioritySet( xTaskHandle pxTask,
20、 unsigned portBASE_TYPE uxNewPriority );n 参数:参数:n pxTask 被修改优先级的任务句柄被修改优先级的任务句柄(即目标任务即目标任务)n uxNewPriority 目标任务将被设置到哪个优先级上。目标任务将被设置到哪个优先级上。 如果设置的值超过了最大可用优先级如果设置的值超过了最大可用优先级(configMAX_PRIORITIES 1),则会被自动封顶为最大值。,则会被自动封顶为最大值。精选ppt2.2任务调度n根据优先级的具体调度方法:根据优先级的具体调度方法:n调度器保证总是在所有可运行的任务中选调度器保证总是在所有可运行的任务中选择具
21、有最高优先级的任务,并使其进入运择具有最高优先级的任务,并使其进入运n行态。行态。n如果被选中的优先级上具有不止一个任务,如果被选中的优先级上具有不止一个任务,调度器会让这些任务轮流执行调度器会让这些任务轮流执行(如图二如图二)。 精选ppt2.2任务调度n时间片的概念时间片的概念n 图二中的两个任务优先级相同,所以每个任图二中的两个任务优先级相同,所以每个任务都执行一个务都执行一个”时间片时间片”,任务在时间片起始时,任务在时间片起始时刻进入运行态,在时间片结束时刻又退出运行态。刻进入运行态,在时间片结束时刻又退出运行态。图图2中中t1与与t2之间的时段就等于一个时间片。之间的时段就等于一个
22、时间片。n 要能够选择下一个运行的任务,调度器需要要能够选择下一个运行的任务,调度器需要在每个时间片的结束时刻运行自己本身。一个称在每个时间片的结束时刻运行自己本身。一个称为心跳为心跳(tick)中断的周期性中断用于此目的。时间中断的周期性中断用于此目的。时间片的长度是可以设定的。片的长度是可以设定的。精选ppt2.2任务调度n此图中的任务一与任务二与图此图中的任务一与任务二与图2中的是一样的,此图中标出了调度器中的是一样的,此图中标出了调度器在时间片之间的调度过程。在时间片之间的调度过程。n 图图4精选ppt2.2任务调度n任务状态任务状态n在简要介绍了优先级调度后,我们需要了解与调度相关的
23、各种任务的在简要介绍了优先级调度后,我们需要了解与调度相关的各种任务的状态。状态。n1、运行态、运行态.n运行中的任务状态。运行中的任务状态。n2、阻塞状态、阻塞状态n如果一个任务正在等待某个事件,则称这个任务处于如果一个任务正在等待某个事件,则称这个任务处于”阻塞态阻塞态(blocked)”。n挂起状态。挂起状态。n3、“挂起挂起(suspended)”处于挂起状态的任务对调度器而言是不可见处于挂起状态的任务对调度器而言是不可见的。让一个任务进入挂起状态的唯一办法就是调用的。让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() API函数。函数。n4、就绪状态、就绪状态n如果
24、任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处如果任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处于就绪于就绪(ready,准备或就绪,准备或就绪)状态。状态。精选ppt2.2任务调度n完整的状态转移图完整的状态转移图 图5精选ppt3、队列n 独立的任务之间很可能会通过相互通信以提供有用的系独立的任务之间很可能会通过相互通信以提供有用的系统功能。统功能。n FreeRTOS中所有的通信与同步机制都是基于队列实现中所有的通信与同步机制都是基于队列实现的。的。n特性:特性:n1、数据存储、数据存储n2、队列可以保存有限个具有确定长度的数据单元、队列可以保存有限个具有确定长度的数
25、据单元n3、可被多任务存取、可被多任务存取n4、队列是具有自己独立权限的内核对象,并不属于或赋、队列是具有自己独立权限的内核对象,并不属于或赋予任何任务。所有任务都可以向同一队列写入和读出。予任何任务。所有任务都可以向同一队列写入和读出。精选ppt3、队列n5、读队列时阻塞读队列时阻塞n 当某个任务试图读一个队列时,其可以指定一个阻塞超当某个任务试图读一个队列时,其可以指定一个阻塞超时时间。在这段时间中,如时时间。在这段时间中,如n果队列为空,该任务将保持阻塞状态以等待队列数据有效。果队列为空,该任务将保持阻塞状态以等待队列数据有效。n6、写队列时阻塞、写队列时阻塞n 同读队列一样,任务也可以
26、在写队列时指定一个阻塞超同读队列一样,任务也可以在写队列时指定一个阻塞超时时间。这个时间是当被写时时间。这个时间是当被写n队列已满时,任务进入阻塞态以等待队列空间有效的最长队列已满时,任务进入阻塞态以等待队列空间有效的最长时间。时间。精选ppt3、队列n创建队列:创建队列:nxQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); n参数:参数:nuxQueueLength 队列能够存储的最大单元数目,即队列深度。队列能够存储的最大单元数目,即队列深
27、度。nuxItemSize 队列中数据单元的长度,以字节为单位。队列中数据单元的长度,以字节为单位。n返回值:返回值:NULL表示没有足够的堆空间分配给队列而导致创建失败。表示没有足够的堆空间分配给队列而导致创建失败。n非非NULL值表示队列创建成功。此返回值应当保存下来,以作为值表示队列创建成功。此返回值应当保存下来,以作为n操作此队列的句柄。操作此队列的句柄。精选ppt3、队列n向列中写数据向列中写数据nxQueueSendToBack() 与与xQueueSendToFront() API函数函数nportBASE_TYPE xQueueSendToFront( xQueueHandle
28、 xQueue, const void * pvItemToQueue, portTickType xTicksToWait ); /将数据发送到队列尾部将数据发送到队列尾部精选ppt3、队列n参数说明参数说明nxQueue 目标队列的句柄。这个句柄即是调用目标队列的句柄。这个句柄即是调用xQueueCreate()创建该队列时的返回值。创建该队列时的返回值。npvItemToQueue 发送数据的指针。其指向将要发送数据的指针。其指向将要复制到目标队列中的数据单元。复制到目标队列中的数据单元。nxTicksToWait 阻塞超时时间。如果在发送时队阻塞超时时间。如果在发送时队列已满,这个时间
29、即是任务处于阻塞态等待队列列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间。空间有效的最长等待时间。精选ppt3、队列n返回值返回值 n有两个可能的返回值有两个可能的返回值: n1.pdPASS n 数据被成功发送到队列中。数据被成功发送到队列中。n2.errQUEUE_FULL n 如果由于队列已满而无法将数据写入,则将返回。如果由于队列已满而无法将数据写入,则将返回。精选ppt3、队列nortBASE _TYPE xQueueSendToBack( xQueueHandle xQueue, const void * pvItemToQueue, portTickType x
30、TicksToWait ); /将数据发送到队列首部将数据发送到队列首部n其参数和返回值与前者相似,这里不再介其参数和返回值与前者相似,这里不再介绍。绍。精选ppt3、队列nxQueueReceive()与与xQueuePeek() API函数函数nxQueueReceive()用于从队列中接收用于从队列中接收(读取)数据读取)数据单元。接收到的单元同时会从队列单元。接收到的单元同时会从队列n中删除。中删除。nxQueuePeek()也是从从队列中接收数据单元,也是从从队列中接收数据单元,不同的是并不从队列中删出接收到不同的是并不从队列中删出接收到n的单元。的单元。精选ppt3、队列nport
31、BASE_TYPE xQueueReceive( xQueueHandle xQueue, nconst void * pvBuffer, nportTickType xTicksToWait ); n参数:参数:精选pptnxQueue 被读队列的句柄。这个句柄即是调用xQueueCreate()创建该队列n时的返回值。npvBuffer 接收缓存指针。其指向一段内存区域,用于接收从队列中拷贝来n的数据。nxTicksToWait 阻塞超时时间。如果在接收时队列为空,则这个时间是任务处于n阻塞状态以等待队列数据有效的最长等待时间。把它设为0,并且队列为空,则xQueueRecieve()与x
32、QueuePeek()均会立即返回。n 如果把xTicksToWait 设置为portMAX_DELAY,并且在nFreeRTOSConig.h中设定INCLUDE_vTaskSuspend 为1,那么n阻塞等待将没有超时限制。精选ppt3、队列n返回值返回值n有两个可能的返回值有两个可能的返回值: n1.pdPASS n只有一种情况会返回只有一种情况会返回pdPASS,那就是成功地从队列中读到数据。,那就是成功地从队列中读到数据。n2.errQUEUE_FULL n如果在读取时由于队列已空而没有读到任何数据,则将返回如果在读取时由于队列已空而没有读到任何数据,则将返回nerrQUEUE_FU
33、LL。n如果设定了阻塞超时时间(如果设定了阻塞超时时间(xTicksToWait非非0),在函数返回之前),在函数返回之前n任务将被转移到阻塞态以等待队列数据有效。但直到超时也没有任务将被转移到阻塞态以等待队列数据有效。但直到超时也没有n其它任务或是中断服务例程往队列中写入数据,函数则会返回其它任务或是中断服务例程往队列中写入数据,函数则会返回nerrQUEUE_FULL。 nxQueuePeek()的参数与返回值与的参数与返回值与xQueueReceive()类似,这里不再重复。类似,这里不再重复。精选ppt3、队列nuxQueueMessagesWaiting()用于查询队列中当前有效用于
34、查询队列中当前有效数据单元个数数据单元个数n函数原型:函数原型:nunsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue ); n参数参数 nxQueue 被查询队列的句柄。这个句柄即是调用被查询队列的句柄。这个句柄即是调用xQueueCreate()创建该队列时创建该队列时n的返回值。的返回值。n返回值返回值 n当前队列中保存的数据单元个数。返回当前队列中保存的数据单元个数。返回0表明队列为空。表明队列为空。精选ppt3、队列n 以上五个函数均不能在中断服务中使用,系统会提供以以上五个函数均不能在中断服务中使用,系
35、统会提供以上函数专门的中断版本(后面将会讲到)。上函数专门的中断版本(后面将会讲到)。 精选ppt3、队列n队列使用例程队列使用例程n例例2:n本例示范创建一个队列,由多个任务往队列中写本例示范创建一个队列,由多个任务往队列中写数据,以及从队列中把数据读出。数据,以及从队列中把数据读出。n其中往队列中写数据的任务没有设定阻塞超时时其中往队列中写数据的任务没有设定阻塞超时时间,而读队列的任务设定了超时时间。间,而读队列的任务设定了超时时间。精选ppt3、队列、队列n写队列任务函数。主函数将调用此函数分别写入写队列任务函数。主函数将调用此函数分别写入100、200.精选ppt3、队列、队列n写队列
36、任务在每次循环中都调用写队列任务在每次循环中都调用taskYIELD()。taskYIELD()通知调度通知调度器立即进行任务切换,而不必等到当前任务的时间片耗尽。器立即进行任务切换,而不必等到当前任务的时间片耗尽。精选ppt3、队列、队列n读队列任务函数,函数中设置了延迟时间。读队列任务函数,函数中设置了延迟时间。精选ppt3、队列、队列精选ppt3、队列、队列nmain函数:其在启动调度器之前创建了一个队列和三个任务。尽管对任务的函数:其在启动调度器之前创建了一个队列和三个任务。尽管对任务的优先级的设计使得队列实际上在任何时候都不可能多于一个数据单元,本例优先级的设计使得队列实际上在任何时
37、候都不可能多于一个数据单元,本例代码还是创建了一个可以保存最多代码还是创建了一个可以保存最多5个个long 型值的队列。型值的队列。精选ppt3、队列、队列精选ppt3、队列、队列n 写队列任务在每次循环中都调用写队列任务在每次循环中都调用taskYIELD()。taskYIELD()通知调度器立通知调度器立即进行任务切换,而不必等到当前任务的时间片耗尽。本例中两个写队列任即进行任务切换,而不必等到当前任务的时间片耗尽。本例中两个写队列任务(写入务(写入100和和200)是具有相同的任务优先级(均为)是具有相同的任务优先级(均为1),所以一旦其中一),所以一旦其中一个任务调用了个任务调用了ta
38、skYIELD(),另一个任务将会得到执行。反映到输出上就是两,另一个任务将会得到执行。反映到输出上就是两个人物交替输出。个人物交替输出。 图图6精选ppt3、队列、队列n调用过程如下调用过程如下 图图7n 精选ppt3、队列、队列n使用队列传递复合数据类型使用队列传递复合数据类型 精选ppt3、队列、队列n对大型数据单元的传递对大型数据单元的传递 精选ppt4、中断、中断 n4.1延迟中断处理延迟中断处理n 当中断发生时,程序将进入中断服务程序中行,如果当中断发生时,程序将进入中断服务程序中行,如果中断服务程序运行时间很长,甚至包括迟将大大降低系统中断服务程序运行时间很长,甚至包括迟将大大降
39、低系统的实时性。这时,我们可以将中断服务程序作为触发者,的实时性。这时,我们可以将中断服务程序作为触发者,触发其他函数来执行需要执行的任务。这样中断服务程序触发其他函数来执行需要执行的任务。这样中断服务程序可以很简短,大大增强了实时性。而真正需要做的事情则可以很简短,大大增强了实时性。而真正需要做的事情则放在被触发的函数中执行。放在被触发的函数中执行。n 我们可以使用二值信号量完成中断服务程序与被触发我们可以使用二值信号量完成中断服务程序与被触发函数的这种触发关系。函数的这种触发关系。精选ppt4.1延迟中断处理延迟中断处理n延迟中断处理如下图所示延迟中断处理如下图所示:图图8精选ppt4.1
40、延迟中断处理延迟中断处理n延迟处理任务(即被中断服务程序触发的函数)对一个信延迟处理任务(即被中断服务程序触发的函数)对一个信号量进行带阻塞性质的号量进行带阻塞性质的”take”调用,意思是进入阻塞态调用,意思是进入阻塞态以等待事件发生。当事件发生后,以等待事件发生。当事件发生后,ISR 对同一个信号量进对同一个信号量进行行”give”操作,使得延迟处理任务解除阻塞,从而事件操作,使得延迟处理任务解除阻塞,从而事件在延迟处理任务中得到相应的处理。在延迟处理任务中得到相应的处理。精选ppt4.1延迟中断处理延迟中断处理n 在此情形下,信号量可以看作是一个深度为在此情形下,信号量可以看作是一个深度
41、为1的队列。这个队列由的队列。这个队列由于最多只能保存一个数据单元,所以其不为空则为满于最多只能保存一个数据单元,所以其不为空则为满(所谓所谓”二值二值”)。n 延迟处理任务调用延迟处理任务调用xSemaphoreTake()时,等效于带阻塞时间地读时,等效于带阻塞时间地读取队列,如果队列为空的话任务则进入阻塞态。当事件发生后,取队列,如果队列为空的话任务则进入阻塞态。当事件发生后,ISR(中断服务例程)(中断服务例程) 简单地通过调用简单地通过调用xSemaphoreGiveFromISR()放置放置一个令牌一个令牌(信号量信号量)到队列中,使得队列成为满状态。这使得延迟处理到队列中,使得队
42、列成为满状态。这使得延迟处理任务切出阻塞态,进入运行态。任务切出阻塞态,进入运行态。n 当任务完成处理后,再次读取队列,发现队列为空,又进入阻塞态,当任务完成处理后,再次读取队列,发现队列为空,又进入阻塞态,等待下一次事件发生。等待下一次事件发生。精选ppt4.1延迟中断处理延迟中断处理n以上过程如下图所示以上过程如下图所示:图图9精选ppt4.1延迟中断处理延迟中断处理精选ppt4.1延迟中断处理延迟中断处理nvSemaphoreCreateBinary() API函数函数n 在使用信号量之前,必须先创建它。创建二值信号量使用在使用信号量之前,必须先创建它。创建二值信号量使用nvSemaph
43、oreCreateBinary()API函数。函数。nvoid vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore ); n参数:参数:nxSemaphore 创建的信号量创建的信号量n需要说明的是需要说明的是vSemaphoreCreateBinary()在实现上是一个宏,所以在实现上是一个宏,所以n信号量变量应当直接传入,而不是传址。本章中包含本函数调用的示信号量变量应当直接传入,而不是传址。本章中包含本函数调用的示n例可用于参考进行复制例可用于参考进行复制精选ppt4.1延迟中断处理延迟中断处理nxSemaphoreTake() API
44、 函数函数n延迟任务处理函数,调用此函数获取信号量。延迟任务处理函数,调用此函数获取信号量。n只有当信号量有效的时候才可以被获取。除互斥信号量只有当信号量有效的时候才可以被获取。除互斥信号量(Recursive Semaphore)外,所有类型的信号量都可以调外,所有类型的信号量都可以调用函数用函数xSemaphoreTake()来获取。来获取。n但但xSemaphoreTake()不能在中断服务例程中调用。不能在中断服务例程中调用。精选ppt4.1延迟中断处理延迟中断处理nportBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, p
45、ortTickType xTicksToWait ); n参数:参数:nxSemaphore 需要获取的信号量需要获取的信号量nxTicksToWait 阻塞超时时间。任务进入阻塞态以等待信阻塞超时时间。任务进入阻塞态以等待信号量有效的最长时间。号量有效的最长时间。n如果如果xTicksToWait为为0,则,则xSemaphoreTake()在信号量在信号量无效时会无效时会n立即返回。立即返回。精选ppt4.1延迟中断处理延迟中断处理n返回值返回值 有两个可能的返回值有两个可能的返回值: n1.pdPASS n只有一种情况会返回只有一种情况会返回pdPASS,那就是成功获得信号量。,那就是成
46、功获得信号量。n2.pdFALSE n未能获得信号量。未能获得信号量。精选ppt4.1延迟中断处理延迟中断处理nxSemaphoreGiveFromISR() API 函数函数n中断服务程序调用此函数给出信号量。中断服务程序调用此函数给出信号量。n n 所有信号量(除互斥信号量)都可以通过调用所有信号量(除互斥信号量)都可以通过调用xSemaphoreGiveFromISR()给出。给出。n xSemaphoreGiveFromISR()是是xSemaphoreGive()的的特殊形式,专门用于中断服务例程中。特殊形式,专门用于中断服务例程中。精选ppt4.1延迟中断处理延迟中断处理nport
47、BASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, nportBASE_TYPE *pxHigherPriorityTaskWoken );n参数:参数:nxSemaphore 给出的信号量给出的信号量npxHigherPriorityTaskWoken 对某个信号量而言,可能对某个信号量而言,可能有不止一个任务处于阻塞态在等待其有效。调用有不止一个任务处于阻塞态在等待其有效。调用xSemaphoreGiveFromISR()会让信号量变为有效,所以会让信号量变为有效,所以会让其中一个等待任务切出阻塞态。会让其中一个等待任
48、务切出阻塞态。精选ppt4.1延迟中断处理延迟中断处理n返回值返回值 有两个可能的返回值有两个可能的返回值: n1.pdPASS nxSemaphoreGiveFromISR()调用成功。调用成功。n2.pdFAIL n如果信号量已经有效,无法给出,则返回如果信号量已经有效,无法给出,则返回pdFAIL。精选ppt4.1延迟中断处理延迟中断处理n例三例三n本例在中断服务例程中使用一个二值信号量让延迟处理任本例在中断服务例程中使用一个二值信号量让延迟处理任务从阻塞态中切换出来。务从阻塞态中切换出来。n下面的一个简单的周期性任务用于每隔下面的一个简单的周期性任务用于每隔500毫秒产生一个毫秒产生一
49、个软件中断。此任务在产生中断之前和之后都会打印输出一软件中断。此任务在产生中断之前和之后都会打印输出一个字符串。个字符串。精选ppt4.1延迟中断处理延迟中断处理精选ppt4.1延迟中断处理延迟中断处理n 下面的任务展现的是延迟处理任务的具体实现下面的任务展现的是延迟处理任务的具体实现此任此任务通过使用二值信号量与软件中断进行同步。务通过使用二值信号量与软件中断进行同步。n 这个任务也在每次循环中打印输出一个信息,这样做这个任务也在每次循环中打印输出一个信息,这样做的目的同样是可以在程序的执行输出结果中直观地看出任的目的同样是可以在程序的执行输出结果中直观地看出任务与中断的执行流程。务与中断的
50、执行流程。精选ppt4.1延迟中断处理延迟中断处理精选ppt4.1延迟中断处理延迟中断处理n 下个任务展现的是中断服务例程,这才是真正的中断处下个任务展现的是中断服务例程,这才是真正的中断处理程序。理程序。n 这段代码做的事情非常少,仅仅是给出一个信号量,这段代码做的事情非常少,仅仅是给出一个信号量,以让延迟处理任务解除阻塞。以让延迟处理任务解除阻塞。精选ppt4.1延迟中断处理延迟中断处理精选ppt4.1延迟中断处理n main()函数很简单,创建二值信号量及任务,安装中函数很简单,创建二值信号量及任务,安装中断服务例程,然后启动调度器。断服务例程,然后启动调度器。 精选ppt精选ppt4.
51、1延迟中断处理延迟中断处理n例例3整个执行流程可以描述如下整个执行流程可以描述如下: n1. 中断产生。中断产生。n2. 中断服务例程启动,给出信号量以使延迟处理中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。任务解除阻塞。n3. 当中断服务例程退出时,延迟处理任务得到执当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是获取信号量。行。延迟处理任务做的第一件事便是获取信号量。n4. 延迟处理任务完成中断事件处理后,试图再次延迟处理任务完成中断事件处理后,试图再次获取信号量获取信号量如果此时信号量无效,任务将切如果此时信号量无效,任务将切入阻塞待等待事件发生。入阻塞待
52、等待事件发生。精选ppt4.1延迟中断处理延迟中断处理n输出结果参见下图。和期望的一样,延迟处理任务在中断产生后立即输出结果参见下图。和期望的一样,延迟处理任务在中断产生后立即执行。所以延迟处理任务的输出信息将周期任务的两条输出信息分开。执行。所以延迟处理任务的输出信息将周期任务的两条输出信息分开。n 图图10精选ppt4.1延迟中断处理延迟中断处理n执行流程执行流程: 图图11精选ppt4.2计数信号量计数信号量n 在中断以相对较慢的频率发生的情况下,二值信号量是在中断以相对较慢的频率发生的情况下,二值信号量是足够而完美的。足够而完美的。n 如果在延迟处理任务完成上一个中断事件的处理之前,如
53、果在延迟处理任务完成上一个中断事件的处理之前,新的中断事件又发生了,等效于将新的事件锁存在二值信新的中断事件又发生了,等效于将新的事件锁存在二值信号量中,使得延迟处理任务在处理完上一个事件之后,立号量中,使得延迟处理任务在处理完上一个事件之后,立即就可以处理新的事件。即就可以处理新的事件。n 但一个二值信号量最多只可以锁存一个中断事件。在锁但一个二值信号量最多只可以锁存一个中断事件。在锁存的事件还未被处理之前,如果又有中断事件发生,这时存的事件还未被处理之前,如果又有中断事件发生,这时的信号量已满,那么后续发生的中断事件将会丢失。的信号量已满,那么后续发生的中断事件将会丢失。精选ppt4.2计
54、数信号量计数信号量n 如果用计数信号量代替二值信号量,那么,以上那种丢如果用计数信号量代替二值信号量,那么,以上那种丢中断的情形将可以避免。中断的情形将可以避免。n 就如同我们可以把二值信号量看作是只有一个数据单元就如同我们可以把二值信号量看作是只有一个数据单元的队列一样,计数信号量可以看作是深度大于的队列一样,计数信号量可以看作是深度大于1的队列。的队列。n 计数信号量有以下两种典型用法:计数信号量有以下两种典型用法:n 1、事件计数、事件计数n 2、资源管理、资源管理 精选ppt4.2计数信号量n1事件计数事件计数 n 在这种用法中,每次事件发生时,中断服务例在这种用法中,每次事件发生时,
55、中断服务例程都会程都会“给出给出(Give)”信号量信号量信号量在每次被信号量在每次被给出时其计数值加给出时其计数值加 1。延迟处理任务每处理一个。延迟处理任务每处理一个任务都会任务都会”获取获取(Take)”一次信号量一次信号量信号量在信号量在每次被获取时其计数值减每次被获取时其计数值减 1。信号量的计数值其。信号量的计数值其实就是已发生事件的数目与已处理事件的数目之实就是已发生事件的数目与已处理事件的数目之间的差值。间的差值。n 用于事件计数的计数信号量,在被创建时其计用于事件计数的计数信号量,在被创建时其计数值被初始化为数值被初始化为 0。 精选ppt4.2计数信号量n2资源管理资源管理
56、 n在这种用法中,信号量的计数值用于表示可用资在这种用法中,信号量的计数值用于表示可用资源的数目。源的数目。n一个任务要获取资源的控制权,其必须先获得信一个任务要获取资源的控制权,其必须先获得信号量号量使信号量的计数值减使信号量的计数值减 1。当计数值减至。当计数值减至 0,则表示没有可用资源。当任务利用资源完成工,则表示没有可用资源。当任务利用资源完成工作后,将给出作后,将给出(归还归还)信号量信号量使信号量的计数使信号量的计数值加值加 1。精选ppt4.2计数信号量计数信号量nxSemaphoreCreateCounting() API函数函数n 信号量在使用前必须先被创建。使用信号量在使
57、用前必须先被创建。使用xSemaphoreCreateCounting() API 函数来创建函数来创建一个计数信号量。一个计数信号量。精选ppt4.2计数信号量n参数参数:nuxMaxCount :n最大计数值。如果把计数信号量类比于队列的话,最大计数值。如果把计数信号量类比于队列的话,uxMaxCount值就是队列的最大深度。值就是队列的最大深度。n当此信号量用于对事件计数或锁存事件的话,当此信号量用于对事件计数或锁存事件的话,uxMaxCount就是可锁存事件的最大数目。就是可锁存事件的最大数目。n当此信号量用于对一组资源的访问进行管理话,当此信号量用于对一组资源的访问进行管理话,uxM
58、axCount应当设置为所有可用资源的总数。应当设置为所有可用资源的总数。精选ppt4.2计数信号量nuxInitialCount:n信号量的初始计数值。信号量的初始计数值。n当此信号量用于事件计数的话,当此信号量用于事件计数的话,uxInitialCount应当应当设置为设置为0因为当信号量被创建时,还没有事件因为当信号量被创建时,还没有事件发生。发生。n当此信号量用于资源管理的话,当此信号量用于资源管理的话,uxInitialCount 应当应当等于等于uxMaxCount因为当信号量被创建时,所有因为当信号量被创建时,所有的资源都是可用的。的资源都是可用的。精选ppt4.2计数信号量n返
59、回值返回值: n如果返回如果返回NULL值,表示堆上内存空间不足,所值,表示堆上内存空间不足,所以以FreeRTOS无法为信号量结构分配内存导致信无法为信号量结构分配内存导致信号量创建失败。第五章有提供更多的内存管理方号量创建失败。第五章有提供更多的内存管理方面的信息。面的信息。n如果返回非如果返回非NULL值,则表示信号量创建成功。值,则表示信号量创建成功。此值应当被保存起来作为这个的信号量的句柄。此值应当被保存起来作为这个的信号量的句柄。精选ppt4.2计数信号量计数信号量n例例4:利用计数信号量对任务和中断进行同步例:利用计数信号量对任务和中断进行同步例4用计数信用计数信号量代替二值信号
60、量对例号量代替二值信号量对例3的实现进行了改进。修改的实现进行了改进。修改main()函数调用函数调用xSemaphoreCreateCounting()替代替代xSemaphoreCreateBinary()的调用。新的的调用。新的API调用如程序清单调用如程序清单49所示:所示:精选ppt4.2计数信号量计数信号量n为了模拟多个事件以高频率发生,修改了中断服务例程,在每次中断为了模拟多个事件以高频率发生,修改了中断服务例程,在每次中断多次多次”给出给出(Give)”信号量。每个事件都锁存到信号量的计数值中。信号量。每个事件都锁存到信号量的计数值中。修改后的中断服务例程如下。修改后的中断服务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广元营销方案服务(3篇)
- 招生宣传用品采购管理制度(3篇)
- 施工工艺部管理制度(3篇)
- 国际商贸公司管理制度(3篇)
- 屋面清扫施工方案(3篇)
- 2026湖南湘潭医卫职业技术学院招聘5人备考题库及答案详解【名校卷】
- 防震减灾科普宣传
- 2026年金融学专升本金融学原理模拟试卷单套
- 眼科青光眼筛查与治疗指南
- 2026年教师资格证综合素质冲刺预测单套试卷(含时政热点)
- 2025年全民《乡村振兴战略》知识竞赛题库及含答案
- 2025至2030中国汽车影院行业项目调研及市场前景预测评估报告
- 安全生产标准操作程序(SOP)手册
- pr详细教学课件
- 村务监督委员选举会会议记录范文
- 福建省全国名校联盟2026届高三上学期联合开学摸底考试语文试题(含答案)
- 作物遗传育种课件
- DGTJ08-82-2020 养老设施建筑设计标准
- 2025年山西省中考英语试卷真题(含答案详解)
- 冷冻储备肉管理制度
- T/CBMCA 007-2019合成树脂瓦
评论
0/150
提交评论