08嵌入式实时操作系统FreeRTOS信号量与任务同步.ppt
-
资源ID:87477630
资源大小:1.10MB
全文页数:30页
- 资源格式: PPT
下载积分:10金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
08嵌入式实时操作系统FreeRTOS信号量与任务同步.ppt
嵌入式实时操作系统嵌入式实时操作系统FreeRTOSFreeRTOS原理及应用原理及应用基基于于STM32STM32微控制器微控制器嵌入式实时操作系统嵌入式实时操作系统FreeRTOS原理及应用原理及应用张超张超 主编主编STM32 Cortex-M4通用开发板通用开发板嵌入式实时操作系统嵌入式实时操作系统FreeRTOS原理及应用原理及应用二值信号量二值信号量计数信号量计数信号量互斥信号量互斥信号量递归互斥信号量递归互斥信号量FreeRTOS信号量与任务同步信号量与任务同步主要内容:主要内容:一、二值信号量二值信号量FreeRTOS信号量与任务同步信号量与任务同步二值信号量二值信号量二值信号量相当于只有一个队列项的队列。创建二值信号量使用的创建函数与创建队列使用的是同一个函数。二值信号量只关心这个特殊的队列状态,要不为空,要不为满,它并不关心队列中存放的是什么消息。二值信号量二值信号量二值信号量主要用于同步,用于任务和任务之间的同步或者中断和任务之间的同步。创建二值信号量创建二值信号量二值信号量二值信号量FreeRTOS创建二值信号量使用的是宏vSemaphoreCreateBinary()和xSemaphoreCreateBinary(),这二个宏最终被队列创建函数xQueueGenericCreate()所替换,使用这二个宏创建二值信号量,需要宏configSUPPORT_DYNAMIC_ALLOCATION为1。创建二值信号量创建二值信号量二值信号量二值信号量1、vSemaphoreCreateBinary()这是旧版本使用的二值信号量创建宏,在semphr.h文件中定义:#define vSemaphoreCreateBinary(xSemaphore)(xSemaphore)=xQueueGenericCreate(UBaseType_t)1,semSEMAPHORE_QUEUE_ITEM_LENGTH,queueQUEUE_TYPE_BINARY_SEMAPHORE);if(xSemaphore)!=NULL)(void)xSemaphoreGive(xSemaphore);创建二值信号量创建二值信号量二值信号量二值信号量2、xSemaphoreCreateBinary()新版本的FreeRTOS使用此宏创建二值信号量,同样是通过调用xQueueGenericCreate()队列创建函数来创建二值信号量,只不过创建成功后,并没有释放此二值信号量。#define xSemaphoreCreateBinary()xQueueGenericCreate(UBaseType_t)1,semSEMAPHORE_QUEUE_ITEM_LENGTH,queueQUEUE_TYPE_BINARY_SEMAPHORE);释放二值信号量释放二值信号量二值信号量二值信号量1、xSemaphoreGive()xSemaphoreGive()是一个宏,用于释放信号量,最终实现功能的是xQueueGenericSend()队列发送函数。#define xSemaphoreGive(xSemaphore)xQueueGenericSend(QueueHandle_t)(xSemaphore),NULL,semGIVE_BLOCK_TIME,queueSEND_TO_BACK);释放二值信号量释放二值信号量二值信号量二值信号量2、xSemaphoreGiveFromISR()释放信号量的中断版本,在中断服务函数中使用,同样也是一个宏。可以用来释放二值信号量和计数型信号量,但不能用于释放互斥信号量。最终实现功能的是xQueueGiveFromISR()函数。#define xSemaphoreGiveFromISR(xSemaphore,pxHigherPriorityTaskWoken)xQueueGiveFromISR(QueueHandle_t)(xSemaphore),(pxHigherPriorityTaskWoken);获取二获取二值信号量值信号量二值信号量二值信号量1、xSemaphoreTake()xSemaphoreTake()是一个宏,用于获取信号量,不止是二值信号量,计数型信号量、互斥信号量也都是使用此宏来释放信号量。其宏定义为:#define xSemaphoreTake(xSemaphore,xBlockTime)xQueueSemaphoreTake(xSemaphore),(xBlockTime);获取二获取二值信号量值信号量二值信号量二值信号量2、xSemaphoreTakeFromISR()获取信号量的中断版本,在中断服务函数中使用,同样也是一个宏。可以用来获取二值信号量和计数型信号量,但不能用于获取互斥信号量。最终实现功能的是xQueueReceiveFromISR()函数。#define xSemaphoreTakeFromISR(xSemaphore,pxHigherPriorityTaskWoken)xQueueReceiveFromISR(QueueHandle_t)(xSemaphore),NULL,(pxHigherPriorityTaskWoken);用二值信号量进行任务同步用二值信号量进行任务同步二值信号量二值信号量本示例通过对二值信号量的操作,实现任务与任务之间,以及中断与任务之间的同步。任务1,优先级3,其功能是使LED0闪烁,通过二值信号量实现任务之间同步,输出信息到串口。任务2,优先级3,其功能是使LED1闪烁,通过二值信号量实现中断与任务之间同步,输出信息到串口。任务3是串口输出守护任务,优先级3。任务4是按键扫描任务,优先级4,其功能是按键扫描,并根据返回的键值执行释放信号量、启动定时器等操作。二、计数计数信号量信号量FreeRTOS信号量与任务同步信号量与任务同步计数信号量计数信号量计数信号量相当于长度大于1的队列,主要用在事件计数或资源管理。用在事件计数时,创建时初值一般为0,事件处理函数每释放一次信号量,其值就加一,其它任务获取信号量时,其值就减一。用作资源管理时,信号量代表资源可用的数量,初值为可用资源的最大值。创建计数信号量创建计数信号量计数信号量计数信号量xSemaphoreCreateCounting()是动态方法创建计数信号量宏,定义如下:#define xSemaphoreCreateCounting(uxMaxCount,uxInitialCount)xQueueCreateCountingSemaphore(uxMaxCount),(uxInitialCount)计数信号量的释放和获取计数信号量的释放和获取计数信号量计数信号量计数信号量的释放和获取与二值信号量完全相同,使用相同的释放和获取函数,包括中断版本的释放和获取都一样。用计数信号量进行任务同步用计数信号量进行任务同步计数信号量计数信号量本示例改写自“用二值信号量进行任务同步”例子,将原例子中断服务函数释放的二值信号量换成计数信号量,观察中断与任务同步的情况。三、互斥信号量互斥信号量FreeRTOS信号量与任务同步信号量与任务同步互斥信号量互斥信号量互斥信号量是一种特殊的二值信号量,用于控制在两个或多个任务间访问共享资源。互斥信号量提供一种“优先级继承”机制,让持有互斥量的任务优先级提升到等待这个互斥量的任务优先级。与二值信号量主要用于同步不同,互斥信号量主要用于互斥访问。互斥信号量互斥信号量除优先级继承外,二者的区别在于信号量被获取后发生的事情:用于互斥的信号量必须归还。用于同步的信号量通常是完成同步之后便丢弃,不再归还。创建互斥信号量创建互斥信号量互斥信号量互斥信号量宏xSemaphoreCreateMutex()使用动态内存分配方法来创建互斥信号量,定义如下:#define xSemaphoreCreateMutex()xQueueCreateMutex(queueQUEUE_TYPE_MUTEX)互斥信号量的获释放和获取互斥信号量的获释放和获取互斥信号量互斥信号量因为有优先级继承机制,互斥信号量不能用于中断服务函数中,因此中断版本的信号量释放与获取函数不能用于互斥量。在任务中使用互斥量,其释放和获取与二值信号量完全相同,使用相同的释放和获取函数。优先级翻转优先级翻转互斥信号量互斥信号量在抢占式内核上使用二值信号量,往往容易出现优先级翻转现象。所谓优先级翻转,是指任务的事务处理顺序上,高优先级任务事务处理反而滞后于低优先级任务的事务处理的现象。优先级优先级翻转示例翻转示例互斥信号量互斥信号量本示例通过函数appStartTask(),创建4个不同优先级的FreeRTOS任务,开启抢占式调度和时间片调度。低优先级任务:优先级为1,任务需要获取信号量来运行,同时将运行信息送往串口。中优先级任务:优先级为2,任务简单地将运行信息送往串口。高优先级任务:优先级为3,任务需要获取与低优先级任务相同的信号量来运行,同时将运行信息送往串口。串口输出守护任务:任务优先级4,其功能是将通过队列传送过来的字符信息在串口上输出,任何时候只有该守护任务能访问串口。用互斥量抑制优先级翻转用互斥量抑制优先级翻转互斥信号量互斥信号量互斥信号量拥有优先级继承机制,能够将持有互斥量任务的优先级提升到等待这个互斥量任务的优先级,从而抑制优先级翻转。本示例仅仅将优先级翻转示例中的二值信号量换成互斥信号量,其它代码完全相同。创建互斥信号量是在appStartTask()函数中完成。四、递归互斥信号量递归互斥信号量FreeRTOS信号量与任务同步信号量与任务同步递归互斥信号量递归互斥信号量互斥信号量在使用时,已经获取了这个互斥量的任务不能再次获取这个互斥信号量。递归互斥信号量则是一种特殊的互斥信号量,允许已经获取了递归互斥信号量的任务可以重复获取这个递归互斥信号量,而且没有次数的限制。同互斥信号量一样,递归互斥信号量也有优先级继承机制,同样不能用在中断服务函数中。其它诸如创建、释放和获取的操作与互斥量完全相同,只是API函数的名字不一样而已。操作操作函数函数递归互斥信号量递归互斥信号量xSemaphoreCreateRecursiveMutex()用动态方法创建递归互斥信号量。用动态方法创建递归互斥信号量。xSemaphoreCreateRecursiveMutexStatic()用静态方法创建递归互斥信号量。xSemaphoreGiveRecursive()释放递归互斥信号量。xSemaphoreTakeRecursive()获取递归互斥信号量。