FreeRTOS 基本API解析
————转自前辈的博客———— 介绍FreeRTOS的基本功能,移植与使用。主要介绍FreeRTOS的裁剪、任务、内存管理、队列、信号量、任务通知等基本组成,看完会用FreeRTOS
Kx_Kevin
记录 重要的
展开
-
5-1 - FreeRTOS的不同内存管理方案
FreeRTOS的内存管理近两天从前辈的博客上看到非常好的关于freeRTOS的各项细节解析,之前一直对freeRTOS的内存管理方式有多种而感到疑惑,看了前辈文章后醍醐灌顶,在此做下记录并表示敬意!FreeRTOS提供的内存分配方案分别位于不同的源文件(heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c)之中,源文件位于下载包\FreeRTOS\Sou...转载 2019-09-06 17:49:23 · 522 阅读 · 0 评论 -
1 - FreeRTOS入门指南
FreeRTOS可以被移植到很多不同架构的处理器和编译器。每一个RTOS移植都附带一个已经配置好的演示例程,可以方便快速启动开发。更好的是,每个演示例程都附带一个说明网页,提供如何定位RTOS演示工程源代码、如何编译演示例程、如何配置硬件平台的全部信息。演示例程说明网页还提供基本的RTOS移植细节信息,包括如何编写FreeRTOS兼容的中断服务例程,不同架构的中断处理会稍有不同。通过下面的简...转载 2019-11-10 15:56:08 · 600 阅读 · 0 评论 -
2 - FreeRTOS在Cortex-M3上的移植
FreeRTOS下载包的文件结构在FreeRTOS官方网站可以下载到最新版的FreeRTOS包,我这里使用的是V8.2.3版本。下载包内的总文件数量多的令人生畏,但文件结构却很简洁。《FreeRTOS入门指南》一文的第3节详细描述了下载包文件结构,我们这里只是简单提一下。下载包根目录下包含两个子目录:FreeRTOS和FreeRTOS-Plus。其中,FreeRTOS-Plus文件夹中包含...转载 2019-11-10 15:47:54 · 614 阅读 · 0 评论 -
3 - FreeRTOS内核配置说明
FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制。每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核。这个配置文件是针对用户程序的,而非内核,因此配置文件一般放在应用程序目录下,不要放在RTOS内核源码目录下。在下载的FreeRTOS文件包中,每个演示例程都有一个FreeRTOSConfig.h文件。有些例程的配...转载 2019-11-10 15:31:13 · 489 阅读 · 0 评论 -
4 - Cortex-M内核使用FreeRTOS特别注意事项
在阅读本文之前,有两个定义在FreeRTOSConfig.h中的宏,你必须先明白它们是什么意思,《FreeRTOS内核配置说明》一文中,讲解了这两个宏:configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITYFreeRTOS与Cortex-M内核可谓是绝配,以至于让移植和使用FreeRTOS都变得更简单起来...转载 2019-11-10 15:00:32 · 316 阅读 · 0 评论 -
5 - FreeRTOS内存管理
FreeRTOS提供了几个内存堆管理方案,有复杂的也有简单的。其中最简单的管理策略也能满足很多应用的要求,比如对安全要求高的应用,这些应用根本不允许动态内存分配的。FreeRTOS也允许你自己实现内存堆管理,甚至允许你同时使用两种内存堆管理方案。同时实现两种内存堆允许任务堆栈和其它RTOS对象放置到快速的内部RAM,应用数据放置到低速的外部RAM。每当创建任务、队列、互斥量、软件定时器、信号...转载 2019-11-10 14:53:13 · 663 阅读 · 0 评论 -
6 - FreeRTOS任务概述
任务和协程(Co-routines)应用程序可以使用任务也可以使用协程,或者两者混合使用,但是任务和协程使用不同的API函数,因此在任务和协程之间不能使用同一个队列或信号量传递数据。通常情况下,协程仅用在资源非常少的微处理器中,特别是RAM非常稀缺的情况下。目前协程很少被使用到,因此对于协程FreeRTOS作者既没有把它删除也没有进一步开发。所以本系列文章以后不会对协程过多描述,包括其AP...转载 2019-11-10 14:41:31 · 303 阅读 · 0 评论 -
7 - FreeRTOS任务创建和删除
在FreeRTOS移植到Cortex-M3硬件平台的文章中,我们已经见过任务创建API,但那篇文章的重点在于如何移植FreeRTOS,本文将重点放在任务的创建和删除API函数上面。任务创建和删除API函数位于文件task.c中,需要包含task.h头文件。任务创建函数描述 BaseType_t xTaskCreate( TaskFunction_t pvTa...转载 2019-11-10 14:33:02 · 345 阅读 · 0 评论 -
8 - FreeRTOS任务控制
FreeRTOS任务控制API函数主要实现任务延时、任务挂起、解除任务挂起、任务优先级获取和设置等功能。相对延时函数描述void vTaskDelay( portTickTypexTicksToDelay )调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数xTicksToDelay指定,单位是系统节拍时钟周期。常量portTICK_...转载 2019-11-10 14:28:56 · 335 阅读 · 0 评论 -
9 - FreeRTOS任务应用API
任务应用函数是一组辅助类函数,一般用于调试信息输出、获取任务句柄、获取任务状态、操作任务标签值等等。获取任务系统状态函数描述 UBaseType_t uxTaskGetSystemState( TaskStatus_t * constpxTaskStatusArray, const UBaseTy...转载 2019-11-10 14:21:45 · 366 阅读 · 0 评论 -
10 - FreeRTOS内核控制
内核控制的一些功能需要移植层提供,为了方便移植,这些API函数用宏来实现,比如上下文切换、进入和退出临界区、禁止和使能可屏蔽中断。内核控制函数还包括启动和停止调度器、挂起和恢复调度器以及用于低功耗模式的调整系统节拍函数。强制上下文切换宏taskYIELD:用于强制上下文切换的宏。在中断服务程序中的等价版本为portYIELD_FROM_ISR,这也是个宏,其实现取决于移植层。用于上下文...转载 2019-11-10 14:03:53 · 234 阅读 · 0 评论 -
11 - FreeRTOS任务通知
每个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0。RTOS任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选的改变接收任务的通知值。可以通过下列方法向接收任务更新通知:不覆盖接收任务的通知值覆盖接收任务的通知值设置接收任务通知值的某些位增加接收任务的通知值相对于用前必...转载 2019-11-10 13:58:21 · 292 阅读 · 0 评论 -
12 - 使用任务通知实现命令行解释器
虽然这是介绍FreeRTOS系列的文章,但这篇文章偏重于命令行解释器的实现。这一方面是因为任务通知使用起来非常简单,另一方面也因为对于嵌入式程序来说,使用命令行解释器来辅助程序调试是非常有用的。程序调试是一门技术,基本上我们需要两种调试手段,一种是可以单步仿真的硬件调试器,另外一种是可以长期监视程序状态的状态输出,可以通过串口、显示屏等等手段输出异常信息或者某些关键点。这里的命令行解释器就属于后...转载 2019-11-10 11:41:00 · 300 阅读 · 0 评论 -
13 - 可视化追踪调试
使用RTOS编程,为每个任务分配多大的堆栈空间就成了一项技术活:分配多了浪费系统资源,分配少了又恐怕会发生堆栈溢出。由于中断和抢占式调度器的存在,我们要估算出一个任务需要多少堆栈是非常困难的,今天我们就介绍一种方法,来获取每个任务的剩余堆栈空间。本文以NXP LPC177x_8x系列微控制器为例。我们将这个功能做成一个命令,添加到《15 - 使用任务通知实现命令行解释器》一文介绍的命令解释列表...转载 2019-11-10 11:25:17 · 445 阅读 · 0 评论 -
14 - FreeRTOS队列
FreeRTOS队列队列是主要的任务间通讯方式。可以在任务与任务间、中断和任务间传送信息。大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面。当然,数据也可以放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置。使用模型:最简单、最灵活通常情况下,鱼和熊掌是不可兼得的,但FreeRTOS的队列用户模型管理却兼顾简单和灵活。发送到队列的消息...转载 2019-11-10 11:15:28 · 239 阅读 · 0 评论 -
15 - FreeRTOS队列API
FreeRTOS为操作队列提供了非常丰富的API函数,包括队列的创建、删除,灵活的入队和出队方式、带中断保护的入队和出队等等。下面就来详细讲述这些API函数。获取队列入队信息数目函数描述UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue );返回队列中存储的信息数目。具有中断保护的版本为uxQueueMessagesWai...转载 2019-11-10 11:11:19 · 558 阅读 · 0 评论 -
16 - FreeRTOS信号量
信号量简介FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。互斥量和信号量在用法上不同:信号量用于同步,任务间或者任务和中断间同步;互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁。信号量用于同步时,一般是一个任务(或中断)给出信号,另一个任务获取...转载 2019-11-10 10:49:59 · 285 阅读 · 0 评论 -
17 - FreeRTOS信号量API
FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥量,需要包含semphr.h头文件。二进制信号量、计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放A...转载 2019-11-10 10:41:44 · 382 阅读 · 0 评论