西安网站seo技术,apache添加网站,怎么创建网页,网站导航菜单代码文章目录 freertos和ucos区别#xff0c;优缺点比较移植步骤核心功能内存管理#xff08;5种内存管理策略#xff09;FreeRTOS任务调度算法有三种时间管理通信管理 栈管理 freertos和ucos区别#xff0c;优缺点比较
FreeRTOS#xff08;Free Real-Time Operating System优缺点比较移植步骤核心功能内存管理5种内存管理策略FreeRTOS任务调度算法有三种时间管理通信管理 栈管理 freertos和ucos区别优缺点比较
FreeRTOSFree Real-Time Operating System和 uC/OSMicro-controller Operating System都是常见的实时操作系统RTOS用于嵌入式系统开发。它们有以下区别和特点
FreeRTOS:
FreeRTOS 是由 Richard Barry 创建的免费开源的实时操作系统。FreeRTOS 非常轻量级使用较少的内存资源适用于资源有限的嵌入式系统。提供了任务管理、调度、时间管理、同步和通信等常见的操作系统功能。FreeRTOS 的核心是一个协程调度器支持协作式多任务处理。支持多种处理器架构包括 ARM、MIPS、X86 等。
uC/OS:
uC/OS 是由 Jean J. Labrosse 创建的商业实时操作系统也有免费的开源版本uC/OS-II。uC/OS 具有丰富的功能提供了任务管理、调度、同步、通信、内存管理等操作系统服务。对于实时性要求较高的应用uC/OS 提供了可选的抢占式调度方式。支持多种处理器架构包括 ARM、MIPS、ColdFire 等。uC/OS-III 是 uC/OS 的最新版本相比于旧版本具有更强大的功能和改进的性能。
两者的优缺点比较如下
FreeRTOS 优点
轻量级、简单易用适合资源受限的系统。开源免费可根据需求修改和定制。社区活跃有大量的文档、示例和支持资源。
FreeRTOS 缺点
功能相对较少相比于某些商业 RTOS可能缺乏一些高级特性和工具支持。部分功能需要额外的模块或者移植。
uC/OS 优点
提供丰富的功能满足大部分实时系统的需求。具有商业版和开源版可供选择。支持抢占式调度适合对实时性要求高的应用。
uC/OS 缺点
商业版需要购买授权并且较为昂贵。文档和社区资源相对较少。
在选择 FreeRTOS 还是 uC/OS 时应根据具体需求、项目要求、开发团队经验和资源等进行综合考虑。如果项目对资源和成本有限制或需要轻量级的操作系统那么选择 FreeRTOS 可能更合适。如果项目对实时性要求较高或需要丰富的功能和工具支持而且有购买授权的预算那么 uC/OS 可能更适合。
移植步骤
在将FreeRTOS移植到STM32上之前您需要进行以下配置 配置硬件确保您的STM32芯片与所选择的FreeRTOS版本兼容并且具备足够的内存资源ram资源。您可以参考芯片的数据手册和FreeRTOS的系统要求来确认这些信息。 引入FreeRTOS源代码将FreeRTOS源代码添加到您的项目中。您可以从FreeRTOS官方网站下载最新的稳定版本或者适用于STM32的移植版。 配置FreeRTOSConfig.h文件这个文件包含了FreeRTOS的核心配置参数。您需要根据STM32的硬件特性和应用需求进行相应配置。以下是一些可能需要配置的参数 定时器配置根据STM32的定时器资源配置用于FreeRTOS的系统节拍定时器。内存管理器配置根据可用的RAM大小和需要的内存管理策略配置内存管理器选项。任务优先级配置定义任务优先级的范围和默认优先级。栈配置为每个任务定义适当大小的栈空间。优化配置根据应用需求进行合适的编译优化设置。 创建任务在main.c或其他文件中创建需要运行的任务通过调用FreeRTOS提供的API函数进行任务的创建、启动和管理。 配置中断根据您的应用需求配置适当的中断处理程序并使用FreeRTOS提供的接口函数来在中断中进行任务切换。 配置时钟和系统节拍根据STM32的时钟设置和FreeRTOS的节拍定时器配置确保系统节拍的准确性和稳定性。 编译和烧录将修改后的代码编译为可执行文件并将其烧录到STM32芯片中进行测试和调试。
请注意以上步骤仅提供了一个大致的概述实际移植过程可能会因STM32型号、FreeRTOS版本和应用需求而有所差异。建议您参考针对您具体芯片和FreeRTOS版本的移植指南或示例代码以获得更详细和准确的配置信息和步骤。
核心功能 内存管理5种内存管理策略
内存管理博文 我移植的是内存管理4 Heap_1只建不删
适用场景创建的任务、队列、信号量等不需要删除。它只实现了 pvPortMalloc没有实现 vPortFree。如果你的程序不需要删除内核对象那么可以使用 heap_1
Heap_2Heap1_Pro、提供删除产生碎片
适用场景频繁的创建和删除任务且所创建的任务堆栈都相同此时不会出现碎片化的问题。Heap_2 之所以还保留只是为了兼容以前的代码。新设计中不再推荐使用 Heap_2。建议使用 Heap_4 来替代 Heap_2更加高效。
Heap_3传统malloc - free
Heap_3 使用标准 C 库里的 malloc、 free 函数所以堆大小由链接器的配置决定配置项 configTOTAL_HEAP_SIZE 不再起作用。直接用C库的 malloc - free
Heap_4Heap2_Pro解决碎片
跟 Heap_1、 Heap_2 一样 Heap_4 也是使用大数组来分配内存。Heap_4 使用首次适应算法(first fit)来分配内存。它还会把相邻的空闲内存合并为一个更大的空闲内存这有助于较少内存的碎片问题。heap2的升级版
Heap_5Heap4_Pro可管理分隔内存
Heap_5 分配内存、释放内存的算法跟 Heap_4 是一样的。相比于 Heap_4 Heap_5 并不局限于管理一个大数组它可以管理多块、分隔开的内存。
优缺点总结
FreeRTOS任务调度算法有三种
第一种是基于优先级的抢占式任务调度算法第二种是基于优先级的时间片轮转调度算法第三种是合作式调度算法。【默认情况为使用时间片抢占式任务调度】不再使用了
优先级的时间片轮转调度算法是多级反馈队列调度算法的一种变体它具有以下特点 多级优先级该调度算法将进程划分为多个不同的优先级队列。每个队列具有不同的优先级通常按照优先级从高到低排序。不同的进程可以被分配到不同的队列中根据进程的优先级确定所在队列。 时间片轮转每个队列都采用时间片轮转的调度策略。每个进程在当前队列中运行一个固定大小的时间片当时间片用完后进程被放入队列尾部并等待下一次调度。 优先级提升为了避免低优先级进程饥饿问题该算法引入了优先级提升机制。当一个进程在低优先级队列中等待一段时间后其优先级会被提升到更高的队列中以增加其获得CPU时间片的机会。 公平性和响应性该算法旨在实现公平性和响应性的平衡。高优先级的进程会更频繁地获得CPU时间以保证响应及时而低优先级的进程也会有机会获得一定的CPU执行时间以保证公平性。 动态调整根据系统负载和进程优先级的变化该算法具有动态调整的能力。可以根据实时情况增加或减少队列的数量、调整各个队列的时间片大小以更好地适应不同的工作负载。
通过以上特点优先级的时间片轮转调度算法可以在满足高优先级进程响应需求的同时确保低优先级进程也能得到一定的执行时间从而在多任务环境中实现较好的公平性和响应性。
时间管理
这里需要程序员去配置时钟和系统节拍根据STM32的时钟设置和FreeRTOS的节拍定时器配置确保系统节拍的准确性和稳定性。
通信管理
消息队列 队列(queue)可以用于任务到任务、“任务到中断”、中断到任务直接传输信息可以实现任务之间的通信 消息队列就是一个像容器一样的东西我们所有的任务都可以往内部写消息然后队列会将我们的消息按顺序存下来所有的任务也可以按顺序将其读出来 队列需要明确数据的大小以及队列的长度
信号量 队列(queue)可以用于传输数据在任务之间、任务和中断之间消息队列用于传输多个数据占用时间按也相对较长但是有时候我们只需要传递状态这个状态值需要用一个数值表示一般是用作同步的效果 信号量这个名字我们可以把它拆分来看信号可以起到通知信号的作用然后我们的量还可以用来表示资源的数量当我们的量只有0和1的时候它就可以被称作二值的信号量只有两个状态当我们的那个量没有限制的时候它就可以被称作为计数型信号量。 信号量也是队列的一种【因为队列创建的时候需要传入队列的长度以及队列的大小而我们的信号量其实就是一种特殊的队列只不过它的大小是0毕竟我们的信号量是不需要传递数据只需要传递信号然后长度是N当N1的时候就是二值信号量他就只有0和1两个状态这里的0和1两个状态是指被填入和被拿走这两个状态当N1时就是我们的计数信号量他也不传递数据只是传递一个数量值一般是记录我们设备的资源数量】
互斥量
在项目开发中可能会有多个任务共用一个资源的情况为了避免其发生冲突二值信号量可以一定程度上避免这种事情但是它多数还是用于同步的状况如果任务之间出现优先级的差异就会出现优先级反转的问题
事件组
场景一个任务他执行之前需要经过多个条件进行判断当这多个条件全部满足或者多个条件中的某一个条件满足他才会执行。使用事件组的优点就是不用多个信号量标志位去判断创建太多的全局变量而只需要一个事件组即可
任务通知
任务通知是我们整个FreeRTOS当中的最后一个通信工具然后他是FreeRTOS第8个大版本的时候才更新出来的产物然后我们目前是第10个版本了相对来说还是一个比较新的概念并且它的功能是比较强大的它可以一定程度上的代替二值信号量计数信号量队列还有我们的事件组,并且最重要的是他是我们任务中自带的一个属性不需要我们单独去创建对应的结构体所以他的执行效率也快很多
栈管理
https://blog.csdn.net/ba_wang_mao/article/details/127245356