完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
本章节为大家讲解FreeRTOS二值信号量的另一种实现方式----基于任务通知(Task Notifications)的二值信号量,这里我们将这种方式实现的二值信号量称之为任务二值信号量。任务二值信号量效率更高,需要的RAM空间更小。当然,缺点也是有的,它没有第22章介绍的二值信号量实现的功能全面。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。 25.1 任务通知(TaskNotifications)介绍 25.2 任务二值信号量 25.3 任务二值信号量API函数 25.4 实验例程说明(任务间通信) 25.5 实验例程说明(中断方式) 25.6 总结 25.1 任务通知(TaskNotifications)介绍 (说明:第24,25,26和27章这部分基础知识是相同的) FreeRTOS每个已经创建的任务都有一个任务控制块(task control block),任务控制块就是一个结构体变量,用于记录任务的相关信息。结构体变量中有一个32位的变量成员ulNotifiedValue是专门用于任务通知的。 通过任务通知方式可以实现计数信号量,二值信号量,事件标志组和消息邮箱(消息邮箱就是消息队列长度为1的情况)。使用方法与前面章节讲解的事件标志组和信号量基本相同,只是换了不同的函数来实现。任务通知方式实现的计数信号量,二值信号量,事件标志组和消息邮箱是通过修改变量ulNotifiedValue实现的: (1)设置接收任务控制块中的变量ulNotifiedValue可以实现消息邮箱。 (2)如果接收任务控制块中的变量ulNotifiedValue还没有被其接收到,也可以用新数据覆盖原有数据,这就是覆盖方式的消息邮箱。 (3)设置接收任务控制块中的变量ulNotifiedValue的bit0-bit31数值可以实现事件标志组。 (4)设置接收任务控制块中的变量ulNotifiedValue数值进行加一或者减一操作可以实现计数信号量和二值信号量。 介绍了这么多,那么问题来了,采用这种方式有什么优势呢?根据官方的测试数据,唤醒由于信号量和事件标志组而处于阻塞态的任务,速度提升了45%,而且这种方式需要的RAM空间更小。但这种方式实现的信号量和事件标志组也有它的局限性,主要表现在以下两个方面: (1)任务通知方式仅可以用在只有一个任务等待信号量,消息邮箱或者事件标志组的情况,不过实际项目项目中这种情况也是最多的。 (2)使用任务通知方式实现的消息邮箱替代前面章节讲解的消息队列时,发送消息的任务不支持超时等待,即消息队列中的数据已经满了,可以等待消息队列有空间可以存新的数据,而任务通知方式实现的消息邮箱不支持超时等待。 25.2 任务二值信号量 前面第22章,我们对二值信号量进行了讲解,二值信号量只有两种数值0和1。本章节讲解的任务二值信号量与第22章讲解的二值信号量要实现的功能是一样的,不同的是调用的函数和使用的计数变量: (1)任务二值信号量的计数变量是通过任务控制块中的一个32位变量ulNotifiedValue实现计数。第22章讲解的二值信号量创建后会有自己的计数变量。 (2)任务二值信号量是通过函数ulTaskNotifyTake()替代第22章讲解的函数xSemaphoreTake()实现资源获取,即对二值信号量数值进行清零操作。 (3)任务二值信号量是通过函数xTaskNotifyGive() 和vTaskNotifyGiveFromISR()替代第22章讲解的函数xSemaphoreGive() 和 xSemaphoreGiveFromISR()实现资源释放,即对二值信号量的数值进行加一操作。 多次调用函数xTaskNotifyGive ()难免会出现计数值大于1的情况,用作任务二值信号量时,我们可以将所有大于1的计数理解为一种情况,即二值信号量管理的资源可用。因此,不管当前的计数是多少,大于0的计数在通过函数ulTaskNotifyTake()获取二值信号量的时候统一清零,这样就实现了二值信号量的功能。 具体任务间任务二值信号量的实现过程和中断方式任务二值信号量的实现过程参看第22.1.2小节和22.1.3小节即可。实际项目中,如果使用二值信号量和任务二值信号量都能实现相应功能,强烈建议使用任务二值信号量。 |
|
|
相关推荐
|
|
|
FreeRTOS任务创建:
复制代码 /* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) { xTaskCreate( vTaskTaskUserIF, /* 任务函数 */ "vTaskUserIF", /* 任务名 */ 512, /* 任务栈大小,单位word,也就是4字节 */ NULL, /* 任务参数 */ 1, /* 任务优先级*/ &xHandleTaskUserIF ); /* 任务句柄 */ xTaskCreate( vTaskLED, /* 任务函数 */ "vTaskLED", /* 任务名 */ 512, /* 任务栈大小,单位word,也就是4字节 */ NULL, /* 任务参数 */ 2, /* 任务优先级*/ &xHandleTaskLED ); /* 任务句柄 */ xTaskCreate( vTaskMsgPro, /* 任务函数 */ "vTaskMsgPro", /* 任务名 */ 512, /* 任务栈大小,单位word,也就是4字节 */ NULL, /* 任务参数 */ 3, /* 任务优先级*/ &xHandleTaskMsgPro ); /* 任务句柄 */ xTaskCreate( vTaskStart, /* 任务函数 */ "vTaskStart", /* 任务名 */ 512, /* 任务栈大小,单位word,也就是4字节 */ NULL, /* 任务参数 */ 4, /* 任务优先级*/ &xHandleTaskStart ); /* 任务句柄 */ } |
|
|
|
|
|
|
|
|
定时器中断回调函数中给任务发送任务二值信号量同步消息:
定时器中断的初始化和中断函数在bsp_timer.c 文件中实现,这个不是教程的重点,故不作介绍。 这里主要关心函数vTaskNotifyGiveFromISR在中断服务程序中的使用方法。 复制代码 /* ********************************************************************************************************* * 函 数 名: TIM_CallBack1和TIM_CallBack2 * 功能说明: 定时器中断的回调函数,此函数被bsp_StartHardTimer所调用。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void TIM_CallBack1(void) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; /* 发送任务通知 */ vTaskNotifyGiveFromISR(xHandleTaskMsgPro, &xHigherPriorityTaskWoken); /* 如果xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */ portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } |
|
|
|
|
|
|
|
|
25.6 总结
本章节为大家讲解了FreeRTOS的任务二值信号量,任务二值信号量(本章节讲解的信号量)相比二值信号量(第22章讲解的信号量)的优势就是执行效率高,需要的RAM空间小。实际项目中,如果使用二值信号量和任务二值信号量都能实现相应功能,强烈建议使用任务二值信号量。 |
|
|
|
|
|
|
|
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16901 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:35 , Processed in 0.724874 second(s), Total 46, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖