首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

FreeRTOS(六):任务

1、什么是多任务系统 回想一下我们以前在使用 51、AVR、STM32 单片机裸机(未使用系统)的时候一般都是在main 函数里面用 while(1)做一个大循环来完成所有的处理,即应用程序是一个无限的循环...多个任务带来了一个新的问题,究竟哪个任务先运行,哪个任务后运行呢?完成这个功能的东西在 RTOS 系统中叫做任务调度器。...3、任务状态 FreeRTOS 中的任务永远处于下面几个状态中的某一个: ● 运行态 当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务。...只不过最常用 的就是 FreeRTOS 的延时函数。 (5)、任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用 函数 vTaskDelete(NULL)删除此任务!...7、任务堆栈 FreeRTOS 之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场(CPU 寄存器值等)保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场

1.1K10

FreeRTOS 任务调度 任务切换

简述 前面文章 FreeRTOS 任务调度 任务创建 > 介绍了 FreeRTOS 中如何创建任务以及其具体实现。...*/ prvTaskExitError(); return 0; } 启动第一个任务 函数中调用了 prvPortStartFirstTask 来启动第一个任务, 该函数重新初始化了系统的栈指针...FreeRTOS 在两种情况下执行任务切换: 同等级任务时间片用完,提前挂起触发切换 在 SysTick 节拍计数器中断中触发异常 高优先任务恢复就绪(如信号量,队列等阻塞、挂起状态下退出)时抢占...而对应而不同任务,我们在创建时为其分配了空间,作为该任务的堆栈,在该任务运行时,由系统设置进程堆栈 PSP 指向该栈顶。...,调用了函数 vTaskSwitchContext 获取新的运行任务, 该函数会更新当前任务运行时间,检查任务堆栈使用是是否溢出,然后调用宏 taskSELECT_HIGHEST_PRIORITY_TASK

5.8K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    嵌入式开发基础之任务管理(线程管理)

    在日常生活中,我们要完成一个大任务,一般会将它分解成多个简单、容易解决的小问题,小问题逐个被解决,大问题也就随之解决了。...在裸机系统中,系统的主体就是 main 函数里面顺序执行的无限循环,这个无限循环里面 CPU 按照顺序完成各种事情。...任务堆栈 RTOS 之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,(如果是在有进程的操作系统中,保存和恢复现场是通过PCB完成)任务调度器在进行任务切换的时候会将当前任务的现场(CPU...下面还以FreeRTOS为例: 挂起线程 在FreeRTOS中,vTaskSuspend()此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。...恢复线程 在FreeRTOS中,vTaskResume()此函数用于将某一个任务从挂起态恢复到就绪态。

    42830

    FreeRTOS系列第6篇---FreeRTOS内核配置说明

    通常情况下,FreeRTOS回调空闲任务钩子函数(需要设计者自己实现),在空闲任务钩子函数中设置微处理器进入低功耗模式来达到省电的目的。...(void ); 这个钩子函数不可以调用会引起空闲任务阻塞的API函数(例如:vTaskDelay()、带有阻塞时间的队列和信号量函数),在钩子函数内部使用协程是被允许的。...替代API在queue.h头文件中有详细描述。 注:“替代”队列函数已经被弃用,在新的设计中不要使用它!...任务切换出去后,该任务的上下文环境被保存到自己的堆栈空间,这时很可能堆栈的使用量达到了最大(最深)值。在这个时候,RTOS内核会检测堆栈指针是否还指向有效的堆栈空间。...当堆栈首次创建时,在它的堆栈区中填充一些已知值(标记)。当任务切换时,RTOS内核会检测堆栈最后的16个字节,确保标记数据没有被覆盖。如果这16个字节有任何一个被改变,则调用堆栈溢出钩子函数。

    2.9K22

    嵌入式开发基础之任务管理(线程管理)

    在日常生活中,我们要完成一个大任务,一般会将它分解成多个简单、容易解决的小问题,小问题逐个被解决,大问题也就随之解决了。...在裸机系统中,系统的主体就是 main 函数里面顺序执行的无限循环,这个无限循环里面 CPU 按照顺序完成各种事情。...在系统中,当有比当前线程优先级更高的线程就绪时,当前线程将立刻被换出,高优先级线程抢占处理器运行。优先级数字越低表示任务的优先级越低,0 的优先级最低。...下面还以FreeRTOS为例: 挂起线程 在FreeRTOS中,vTaskSuspend()此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。...恢复线程 在FreeRTOS中,vTaskResume()此函数用于将某一个任务从挂起态恢复到就绪态。

    93210

    FreeRTOS系列第8篇---FreeRTOS内存管理

    同时实现两种内存堆允许任务堆栈和其它RTOS对象放置到快速的内部RAM,应用数据放置到低速的外部RAM。 每当创建任务、队列、互斥量、软件定时器、信号量或事件组时,RTOS内核会为它们分配RAM。...标准函数库中的malloc()和free()函数有些时候能够用于完成这个任务,但是: 在嵌入式系统中,它们并不总是可以使用的; 它们会占用更多宝贵的代码空间; 它们没有线程保护; 它们不具有确定性(每次调用执行的时间可能会不同...嵌入式/实时系统具有千差万别的RAM和时间要求,因此一个RAM内存分配算法可能仅属于一个应用的子集。 为了避免这个问题,FreeRTOS在移植层保留内存分配API函数。...如果要使用FreeRTOS提供的内存堆分配方案,选中的源文件必须被正确的包含到工程文件中。 1.heap_1.c 这是所有实现中最简单的一个。一旦分配内存之后,它甚至不允许释放分配的内存。...创建RTOS对象(任务、队列、信号量等等)会隐含的调用pvPortMalloc(),因此必须注意:使用heap_5创建任何对象前,要先执行vPortDefineHeapRegions()函数。

    1.2K20

    M-Arch(14)兼容FreeRTOS:FreeRTOS任务管理

    关键字:FreeRTOS,STM32,GD32,任务管理 关于FreeRTOS的官方文档,里面实际上也讲的很详细,参见:FreeRTOS官方文档[1] 任务 如果非要给任务下个定义的话,在嵌入式系统中,...main函数中一个while(1),时基计数,到了某个任务的运行周期就运行某个任务。 如有中断,优先运行中断。...这种做法的缺点也很明显,就是一大锅饭,大家一起等着,到点了才能领饭,管你是不是老弱病残孕。 在FreeRTOS中,任务被赋予了优先级,高优先级的任务可优先运行;当然,它占用ram资源多一些。...空闲任务Hook Hook一般翻译为钩子,在软件设计中,通常是一个函数指针。...运行时,它将在每一个空闲任务周期被调用一次。 由于空闲任务钩子的特殊性,vApplicationIdleHook中不可以调用可能引起空闲任务阻塞的API函数(比如vTaskDelay())。

    79120

    FreeRTOS | 任务管理(第十四天)

    如果此任务是使用动态方法创建的,也就是使用函数 xTaskCreate()创建的,那么在此任务被删除以后此任务之前申请的堆栈和控制块内存会在空闲任务中被释放掉,因此当调用函数vTaskDelete()删除任务以后必须给空闲任务一定的运行时间...>>>3.函数vTaskResumeFromISR此函数是vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务。...pdFALSE:恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。...如果用户在 FreeRTOS.h 中禁止使用时间片调度,那么每个任务必须配置不同的优先级。...抢占式调度器>>>在实际的应用中,不同的任务需要不同的响应时间。例如,我们在一个应用中需要使用电机,键盘和LCD 显示。

    15810

    FreeRTOS(十一):其他任务 API 函数

    4、函数 vTaskGetInfo() 此函数也是用来获取任务壮态的,但是是获取指定的单个任务的壮态的,任务的壮态信息 填充到参数 pxTaskStatus 中,这个参数也是 TaskStatus_t...9、函数 uxTaskGetStackHighWaterMark() 每个任务都有自己的堆栈,堆栈的总大小在创建任务的时候就确定了,此函数用于检查任务从创建好到现在的历史剩余最小值,这个值越小说明任务堆栈溢出的可能性就越大...FreeRTOS 把这个历史剩余最小值叫做“高水位线”。此函数相对来说会多耗费一点时间,所以在代码调试阶段可以使用,产品发布的时候最好不要使用。...13、函数 xTaskGetTickCountFromISR() 此函数是 xTaskGetTickCount()的中断级版本,用于在中断服务函数中获取时间计数器xTickCount 的值。...17、函数 vTaskGetRunTimeStats() FreeRTOS 可以通过相关的配置来统计任务的运行时间信息,任务的运行时间信息提供了每个任务获取到 CPU 使用权总的时间。

    2.3K30

    【STM32项目】在FreeRtos背景下的实战项目的实现过程(一)

    ,它常用于不需要高实时性的场景的产品开发 在delay函数下的等待只能等待,没有占用CPU的情况,浪费资源 (2)基于Rtos的开发 Rtos有很多种,除了FreeRtos以外,我们可以在浏览器上搜索其他的...Rtos,但在所有嵌入式系统中,FreeRtos是应用最多的 添加了Rtos的嵌入式系统实时性会提高,我们可以将某些程序分为多个任务,给予它们优先级,优先级高的优先获得CPU使用权,也就是一个优先级低的任务执行过程中...,优先级高的任务一旦出现需要执行的情况,优先级低的任务立刻发生中断,先让优先级高的任务完成,然后再回到原来的位置继续执行,而且这个过程是可以嵌套的,在优先级1的任务过程中,优先级2的任务可以中断优先级1...的任务,然后优先级3的任务又可以中断优先级2的任务 多个任务可以同一优先级,创建的实时任务数量没有软件限制,也就是说,在理想条件下,创建的实时任务可以有无数个 在不断中断的过程中,嵌入式系统捕捉外界变化的能力变得十分灵敏...//任务控制块 vTaskStartScheduler();//开启任务调度 } (4)开始任务函数 在FreeRtos进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断

    79910

    FreeRTOS系列第9篇---FreeRTOS任务概述基础篇

    为了实现这点,每个任务都需要有自己的堆栈。当任务切出时,它的执行环境会被保存在该任务的堆栈中,这样当再次运行时,就能从堆栈中正确的恢复上次的运行环境。...在较新的FreeRTOS移植包中,如果 试图从一个任务中返回,将会调用configASSERT()(如果定义的话)。...因此,在应用中使用vTaskDelete()函数后确保空闲任务能获得处理器时间就很重要了。 除此之外,空闲任务没有其它有效功能,所以可以被合理的剥夺处理器时间,并且它的优先级也是最低的。...如果你想将任务程序功能运行在空闲优先级上,可以有两种选择: 在一个空闲任务钩子中实现这个功能:因为FreeRTOS必须至少有一个任务处于就绪或运行状态,因此钩子函数不可以调用可能引起空闲任务阻塞的API...当运行在特权模式下,任务可以访问整个内存映射;当处于用户模式下,任务仅能访问自己的堆栈。 无论在何种模式下,MPU都不会自动捕获堆栈溢出,因此标准的FreeRTOS堆栈溢出检测机制仍然会被用到。

    1.7K40

    freeRTOS任务创建

    我们曾经在公众号里给大家推送过关于freeRTOS在NXP kinetis KV4x上的移植,得到了猿友大量的反馈,很多猿友还是感觉对基础的一些东西不懂,今天我们就从基础的任务创建讲起,任务创建是RTOS...学习中很重要的一步,因为你的应用就是基于大量的任务来实现的,那么在freeRTOS下如何来创建任务呢,首先打开任意一个移植好的例程或者我们移植的demo,找到task.h和tasks.c这两个文件里面定义声明了许多与任务相关的类型和函数...任务的创建主要有两个函数,先来看第一个 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const...这两种创建任务函数的不同在与,第一种的任务堆栈的RAM是自动分配的,而第二种是由创建者分配的。更多详细的关于这两种的介绍可以参考官方网站的介绍。...顺便提一下任务的删除函数 void vTaskDelete(TaskHandle_t xTask ); 宏定义INCLUDE_vTaskDelete必须为1这个函数才能可用,主要用于将一个任务从内核任务管理中移除

    1.1K70

    FreeRTOS 任务调度 任务创建

    简述 FreeRTOS 的任务调度在 Source/include/task.c 中实现,包含了任务的创建、切换、挂起、延时和删除等所有功能。...*任务堆栈大小 *StackType_t*/ &ucParameterToPass, /*任务运行时的参数*/ tskIDLE_PRIORITY...函数按顺序完成: 根据用户传递内存,初始化任务 TCB 初始化任务堆栈 将新建任务加入到就绪链表中 如果调度器运行,新任务优先级更高,触发系统切换 TaskHandle_t xTaskCreateStatic..., 先申请栈内存再申请任务控制块内存 // 可以避免栈溢出覆盖了自己任务控制块 // 对应向上增长的则相反 // 在旧版本 V8.0.0 中没有这么处理,统一先 TCB...在创建任务的函数中, 如果成功获得新任务所需要的内存空间, 则会调用以下函数对任务控制块 TCB 的成员变量进行初始化。

    3.3K50

    FreeRTOS(七):任务相关 API 函数

    上一篇学习了 FreeRTOS 的任务基础知识,本文就正式学习如何使用 FreeRTOS 中有关任务的 API 函数。 先学习怎么用,先知其然,后面在知其所以然。...1、任务创建和删除 API 函数 xTaxkCreate():创建一个任务,任务需要 RAM 来保存与任务有关的状态信息(任务控制块),任务也需要一定的 RAM 来作为任务堆栈。...删除任务以后必须给空闲任务一定的运行时间。...此函数原型如下: 2、任务挂起和恢复 API 函数 有时候我们需要暂停某个任务的运行,过一段时间以后在重新运行。这个时候要是使用任务删除和重建的方法的话那么任务中变量保存的值肯定丢失了!...FreeRTOS 中任务相关的 API 当然不止有这几个,还有很多其他 API,我们在下一篇文章再讲解。但大部分情况下,我们要用的就只有这几个 API:创建、挂起、恢复、删除,就四个。

    61410

    FreeRTOS例程1-基础任务创建

    ,也是任务的任务堆栈 返回值: pdPASS:数值1,任务创建成功,且添加到就绪列表 错误代码:负数,任务创建识别 这里的返回值是BaseType_t,实际它是long类型,可以在portmacro.h...注:通过 xTaskCreate()动态创建的任务,在使用vTaskDelete()删除后,该任务创建时申请的堆栈和内存会在系统的空闲任务中被释放掉。...程序设计 主函数 主函数还是我们熟悉的main函数,但FreeRTOS里的main函数不需要自己设计成死循环,只需要创建任务并开启任务调度,即可使系统持续运行。...任务的创建一般都是先创建一个开始任务,然后开始任务再负责创建其它子任务。 int main(void) { //设置系统中断优先级分组4(FreeRTOS中的默认方式!)...LED按照各自任务函数中设定的亮灭时间不断闪烁。

    55120

    FreeRTOS(十八):内存管理

    内存管理是一个系统基本组成部分,FreeRTOS 中大量使用到了内存管理,比如创建任务、信号量、队列等会自动从堆中申请内存。...一种是由用户自行定义所需的 RAM,这种方法也叫静态方法,使用静态方法的函数一般以“Static”结尾,比如任务创建函数 xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈...使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RAM。...千万不能这么想,有很多小型的应用在系统一开始就创建好任务、信号量或队列等,在程序运行的整个过程这些任务和内核对象都不会删除,那么这个时候使用 heap_1 就很合适的。...如果任务所需的堆栈大小每次都是不同,那么 heap_2 就不适合了,因为这样会导致内存碎片产生,最终导致任务分配不到合适的堆栈!

    1.4K10

    深入探索嵌入式开发中的 FreeRTOS:从入门到精通

    编写第一个FreeRTOS程序搭建工程框架:在IDE中创建一个全新的工程,根据实际使用的硬件平台和芯片型号进行准确选择。...通过这个简单的示例,我们初步领略了FreeRTOS的任务创建与调度机制。每个任务都是一个独立的函数,借助xTaskCreate函数创建并加入到任务调度器中。...这些函数在实现上与普通的API函数有所不同,充分考虑了中断上下文的特殊性,以确保系统的稳定性和正确性。中断优先级管理:在FreeRTOS中,可以灵活设置中断的优先级。...例如,FreeRTOS 自带的vTaskList和vTaskGetRunTimeStats函数,能够提供有关任务运行状态和运行时间统计的详细信息。...其次,利用 FreeRTOS 提供的调试宏,如configASSERT,可以在程序运行时检测到一些潜在的错误,如非法的函数调用、空指针引用等。

    17910

    FreeRTOS(十七):空闲任务

    当然了,实际上肯定不会这么浪费宝贵的处理器资源,FreeRTOS 空闲任务中也会执行一些其他的处理。...空闲任务还有另外一个重要的职责,如果某个任务要调用函数 vTaskDelete()删除自身,那么这个任务的任务控制块 TCB 和任务堆栈等这些由 FreeRTOS 系统自动分配的内存需要在空闲任务中释放掉...2、空闲任务钩子函数 在每个空闲任务运行周期都会调用空闲任务钩子函数,如果想在空闲任务优先级下处理某个任务有两种选择: ● 在空闲任务钩子函数中处理任务。...(3)中空闲任务在 T12 时刻被某个外部中断唤醒,中断的具体处理过程在任务 2(使用信号量实现中断与任务之间的同步)。...说明在Tickless 模式中只有空闲任务要运行时间的超过某个最小阈值的时候才会进入低功耗模式,此阈值通过 configEXPECTED_IDLE_TIME_BEFORE_SLEEP 来设置。

    3.1K20

    FreeRTOS-Qemu 实现三任务同步通信机制以及API信息

    效果上仅仅是函数名 const portCHAR * const pcNane, 具有描述性的任务名。FreeRTOS 不会使用它。...uxPriority, 任务运行时的优先级 xTaskHandle *pvCreatedTask 用于传递任务的句柄,可以引用从而对任务进行其他操作。...延时任务为已知时间片,任务被锁住剩余的实际时间由时间片速率决定。...在Tracealyzer for FreeRTOS软件中打开trace_data.bin,可以看到详细的FreeRTOS的任务和事件信息。...Git”的使用技巧,同时也优化了自己的编程环境 说一下我的思路: 首先,采用全局变量来统领发送的数据和接收到的数据,通过在main函数外声明了一个发送数据的和,一个接收数据的和,一个队列用于传递由于周期不对等的发送和接受的数据

    3.3K61

    FreeRTOS学习笔记 | 基础知识体系梳理

    在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。...也就是说,在 FreeRTOS 任务中,所有栈空间的使用都是通过 PSP 指针进行指向的。一旦进入了中断函数以及可能发生的中断嵌套都是用的 MSP 指针。...在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中禁止使用时间片调度,那么每个任务必须配置不同的优先级。...在 FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还需要用户在FreeRTOSConfig.h 文件中使能宏定义: #define configUSE_TIME_SLICING 1...时间延时 FreeRTOS 中的时间延迟函数主要有以下两个作用: 为周期性执行的任务提供延迟。

    2.8K21
    领券