FreeRtos——多任务

多任务和单任务几乎没有差别。只用多创建一个或多个任务,其他地方和单任务时相同。

static void AppTaskCreate(void)
{
    xTaskCreate(vTaskLed1,           /* 任务函数名 */
                "Task Led1",         /* 任务名,字符串形式,方便调试 */
                 512,                /* 栈大小,单位为字,即4个字节 */
                 (void *)&task_led3,  // task_led1-task_led3可以切换   /* 任务形参 */
                 1,                  /* 优先级,数值越大,优先级越高 */
                 &xHandleTaskLED1);  /* 任务句柄 */

    xTaskCreate(
                             vTaskBeep,
                             "Task Beep",
                             512,
                             NULL,
                             2,
                             &xHandleTaskBeep);
}

这里采用一个任务做LED灯闪烁,一个任务做蜂鸣器,可以看到两个任务展现出似乎同时运行的现象。

但是,其中有一个地方需要测试。

我们知道裸机中,优先级设置一样时,会看硬件编号,小的优先级高。

freertos中,优先级数值越大的,优先级越高,那么,要是设置成优先级相同,那是以什么方式运行的呢?这个等到下一章,讲串口调试时我们来验证。

vTaskDelayUntil() API 函数
vTaskDelayUntil()类似于 vTaskDelay()。和范例中演示的一样,函数 vTaskDelay()
的参数用来指定任务在调用 vTaskDelay()到切出阻塞态整个过程包含多少个心跳周期。
任务保持在阻塞态的时间量由 vTaskDelay()的入口参数指定,但任务离开阻塞态的时刻
实际上是相对于 vTaskDelay()被调用那一刻的。 vTaskDelayUntil()的参数就是用来指定
任务离开阻塞态进入就绪态那一刻的精确心跳计数值。 API 函数 vTaskDelayUntil()可以
用于实现一个固定执行周期的需求(当你需要让你的任务以固定频率周期性执行的时
候)。由于调用此函数的任务解除阻塞的时间是绝对时刻,比起相对于调用时刻的相对
时间更精确(即比调用 vTaskDelay()可以实现更精确的周期性)。
void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );
程序清单 13 vTaskDelayUntil() API 函数原型

时间: 2024-11-10 11:26:30

FreeRtos——多任务的相关文章

FreeRTOS 事件标志组

为什么要使用事件标志事件标志组是实现多任务同步的有效机制之一.也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单?其实不然,在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题:? 使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现.? 使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心.? 使用事件标志组

FreeRTOS 消息队列

本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息队列在实际项目中应用较多. 消息队列的概念及其作用消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息(注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II 和 uCOS-III 是传递的地址)放入到队列.同样,一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息.通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先

FreeRTOS——任务调度—抢占式,时间片和合作式

本章教程为大家将介绍 FreeRTOS 操作系统支持的任务调度方式:抢占式,时间片和合作式,这部分算是 FreeRTOS 操作系统的核心了. 对于初学者来说,要一下子就能够理解这些比较困难,需要多花些时间把这些基本概念搞清楚,然后阅读下源码,深入理解实现方法. 关于合作式调度器的特别说明 FreeRTOS 支持的调度方式FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度. 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少. ? 抢占式调度每个任务都有不同的优

第二次作业_RTCSD

第二次作业要求 这次作业内容有些多,里面有很多陌生的东西,先梳理一下: 1.实现代码管理: 将例程项目Fork到自己的repository,同时在本地电脑安装git工具,创建云端本地的文件同步. 2.安装仿真软件: 安装好QEMU来模拟stm32f4评估板的运行,实现Demo1的仿真运行,(以此调高调试速度.节约调试成本). 3.学习和实现FreeRTOS多任务同步和通信: 学习Demo1的闪灯例程,以此熟悉FreeRTOS的API接口和使用.熟悉main.c的代码结构; 编程实现如下要求: 创

FreeRTOS 任务栈大小确定及其溢出检测

FreeRTOS 的任务栈设置不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要. 局部变量,函数调用时的现场保护和返回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃.裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式.如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用. FreeRTOS 的系统栈设置上面跟大家讲解了什么是任务栈,这里的系统栈又是

FreeRTOS 特性简介

FreeRTOS 由 Richard Barry 开发,是一个开源的.可移植的.小型的嵌入式实时操作系统内核.FreeRTOS 既支持抢占式多任务,也支持协作式多任务.FreeRTOS的主要特性如下: 实时性:FreeRTOS “可以”配置成为一个硬(Hard)实时操作系统内核.要注意这里用的是“可以”,FreeRTOS 也可以配置为非实时型内核,甚至于部分任务是实时性的,部分不是.这一点比uC/OS-II 要灵活. 任务数量:FreeRTOS对任务数没有限制,同一优先级也可以有多个任务.这点上

FREERTOS 手册阅读笔记

郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized method is used then configMAX_PRIORITIES cannot be greater than 32. vTaskDelay() delay from call the vTaskDelay vTaskDelayUntil delay from last wake

FreeRTOS 动态内存管理

本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建. 信号量. 消息队列. 事件标志组. 互斥信号量. 软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的. 动态内存管理介绍FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现,这 5 个文件在 FreeRTOS

FreeRTOS基础以及UIP之协程--C语言剑走偏锋

在FreeRTOS中和UIP中,都使用到了一种C语言实现的多任务计数,专业的定义叫做协程(coroutine),顾名思义,这是一种协作的例程, 跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧. 意思就是说协程不需要每次调用的时候都为任务准备一次空间,我们知道像ucos这种操作系统,它内置的多任务是需要在中断过程中切换堆栈的,开销较大,而协程的功能就是在尽量降低开销的情况下,实现能够保存函数上下文快速切换的办法,用操作系统的概念来说,一千个