首页 > 编程知识 正文

freertos任务间通信,freertos任务调度

时间:2023-05-06 11:27:59 阅读:175242 作者:1503

1 .任务和API APP应用可以使用任务,也可以使用API,但是因为任务和/或API使用不同的API函数,所以在任务和API之间使用相同的键

通常,“协和式”仅用于资源非常少的微处理器,尤其是在RAM非常不足的情况下。 现在Acconficode很少使用,所以Acconficode Free RTOS的作者既没有删除也没有开发它。

因此,在这一系列文章中,我们不太讨论API函数,包括API函数。

1.1任务特性简单地说,使用RTOS的实时APP应用可以看作是一系列独立任务的集合。 每个任务都在自己的环境中运行,与系统中的其他任务和RTOS调度程序无关。 任何时候只能运行一个任务,RTOS调度程序将确定要执行的任务。 调度程序持续启动和停止每个任务,并且宏看起来像整个APP应用程序正在运行。 作为任务不需要知道调度程序的活动,提取任务时保存上下文环境(寄存器值、堆栈内容)是调度程序的主要作用。 为了实现这一点,每个任务都需要自己的堆栈。 剪切任务后,其运行环境将保存在任务的堆栈中,以便在重新运行时可以从堆栈中正确恢复上次的运行环境。

1.2任务概览简单无限制完全抢占支持优先级每个任务都有自己的堆栈,在使用具有大量RAM消耗的抢占时,必须仔细考虑可重入性

2 .任务状态

任务可以是以下内容之一:

运行:如果任务正在运行,则该任务正在运行。 此时它占用了处理器。 准备就绪:与阻塞和锁定不同,准备就绪的任务已经可以执行,但由于正在执行优先级高于相同优先级的任务,因此没有实际执行。 阻止:如果任务当前正在等待某个时间或外部中断,我们会说此任务被阻止。 例如,如果任务调用vTaskDelay ),它将被阻止直到延迟周期结束。 任务可能会被队列或信号量事件阻止。 被阻止的任务通常具有一个“超时”周期,当事件超时时,这些周期将被解除阻止。 挂起:挂起状态的任务对调度程序也无效。 只有在分别显式调用vTaskSuspend (和xTaskResume )的API函数时,任务才会进入或退出挂起状态。 不能指定超时周期事件(不能通过设置超时事件来解除挂起状态)。

三.任务优先次序

每个任务都被分配了优先级,并在FreeRTOSConfig.h中定义: 0到configMAX_PRIORITIES,configMAX_PRIORITIES。

如果架构硬件支持CLZ (或类似)指令、计算前零个数、Cortex-M3支持此指令并从ARMv6T2支持此指令,则在移植层使用此特性来配置任务调度机制首先在FreeRTOSConfig.h中,configuse_port另外,configMAX_PRIORITIES可以设定为任意值,但configMAX_PRIORITIES的设定越大,RAM的消耗量也越大

优先级数值越低,优先级越低。 空闲任务(idle task )的优先级为0(tskidle_priority )。

FreeRTOS调度程序确保具有最高优先级的就绪或运行状态的任务将获取处理器。 换句话说,处于运行状态的任务只会运行其中的最高优先级任务。

任意数量的任务可以共享相同的优先级。 如果未定义宏configUSE_TIME_SLICING或宏configUSE_TIME_SLICING定义为1,则处于就绪状态的许多相同优先级的任务在时间片切换过程中可能会出现

4 .实现一项任务的一项任务具有以下结构:

voidvataskfunction (void * PV parameters ) for ); (/)---请把APP码放在这里。 ----*/()/*任务不能从此函数返回或退出。 对于新的FreeRTOS迁移软件包,当您尝试从任务返回时,将调用configASSERT () (如果已定义)。 如果任务实际上退出函数,则任务必须调用vTaskDelete(NULL )函数来处理一些清理工作。 */vtaskdelete (空); }

任务函数返回为void,参数只有一个void类型指针所有任务函数都应该是这样的。 void类型指针可以向任务传递任何类型的信息。

任务函数通常是死循环的,因为永远不应该返回任务函数。

任务由xTaskCreate ()函数创建,并由vTaskDelete ) )函数删除。

5 .空闲任务和空闲任务挂接(idle task和Idle Task hook ) 5.1空闲任务空闲任务是在RTOS调度程序启动时由内核自动创建的任务,至少有一个任务正在运行空闲任务具有最低的任务优先级,因此当高优先级任务准备就绪时,可以立即释放CPU

      删除任务后,空闲任务用来释放RTOS分配给被删除任务的内存。因此,在应用中使用vTaskDelete()函数后确保空闲任务能获得处理器时间就很重要了。除此之外,空闲任务没有其它有效功能,所以可以被合理的剥夺处理器时间,并且它的优先级也是最低的。

      应用程序任务共享空闲任务优先级(tskIDLE_PRIORITY)也是可能的。这种情况如何配置可以参考configIDLE_SHOULE_YIELD配置参数类获取更多信息。

5.2空闲任务钩子

      空闲任务钩子是一个函数,每一个空闲任务周期被调用一次。如果你想将任务程序功能运行在空闲优先级上,可以有两种选择:

在一个空闲任务钩子中实现这个功能:因为FreeRTOS必须至少有一个任务处于就绪或运行状态,因此钩子函数不可以调用可能引起空闲任务阻塞的API函数(比如vTaskDelay()或者带有超时事件的队列或信号量函数)。创建一个具有空闲优先级的任务去实现这个功能:这是个更灵活的解决方案,但是会带来更多RAM开销。

      创建一个空闲钩子步骤如下:

  在FreeRTOSConfig.h头文件中设置configUSE_IDLE_HOOK为1;  定义一个函数,名字和参数原型如下所示:

void vApplicationIdleHook( void );

         通常,使用这个空闲钩子函数设置CPU进入低功耗模式

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。