FreeRTOS(Free Real-Time Operating System)和 uC/OS(Micro-controller Operating System)都是常见的实时操作系统(RTOS),用于嵌入式系统开发。它们有以下区别和特点:
FreeRTOS:
uC/OS:
uC/OS 具有丰富的功能,提供了任务管理、调度、同步、通信、内存管理等操作系统服务。对于实时性要求较高的应用,uC/OS 提供了可选的抢占式调度方式。两者的优缺点比较如下:
FreeRTOS 优点:
FreeRTOS 缺点:
uC/OS 优点:
具有商业版和开源版可供选择。支持抢占式调度,适合对实时性要求高的应用。uC/OS 缺点:
在选择 FreeRTOS 还是 uC/OS 时,应根据具体需求、项目要求、开发团队经验和资源等进行综合考虑。如果项目对资源和成本有限制,或需要轻量级的操作系统,那么选择 FreeRTOS 可能更合适。如果项目对实时性要求较高,或需要丰富的功能和工具支持,而且有购买授权的预算,那么 uC/OS 可能更适合。
在将FreeRTOS移植到STM32上之前,您需要进行以下配置:
配置硬件:确保您的STM32芯片与所选择的FreeRTOS版本兼容,并且具备足够的内存资源(ram资源)。您可以参考芯片的数据手册和FreeRTOS的系统要求来确认这些信息。
引入FreeRTOS源代码:将FreeRTOS源代码添加到您的项目中。您可以从FreeRTOS官方网站下载最新的稳定版本或者适用于STM32的移植版。
配置FreeRTOSConfig.h文件:这个文件包含了FreeRTOS的核心配置参数。您需要根据STM32的硬件特性和应用需求进行相应配置。以下是一些可能需要配置的参数:
系统节拍定时器。配置内存管理器选项。定义任务优先级的范围和默认优先级。为每个任务定义适当大小的栈空间。创建任务:在main.c(或其他文件)中创建需要运行的任务,通过调用FreeRTOS提供的API函数进行任务的创建、启动和管理。
配置中断:根据您的应用需求,配置适当的中断处理程序,并使用FreeRTOS提供的接口函数来在中断中进行任务切换。
配置时钟和系统节拍:根据STM32的时钟设置和FreeRTOS的节拍定时器配置,确保系统节拍的准确性和稳定性。
编译和烧录:将修改后的代码编译为可执行文件,并将其烧录到STM32芯片中进行测试和调试。
请注意,以上步骤仅提供了一个大致的概述,实际移植过程可能会因STM32型号、FreeRTOS版本和应用需求而有所差异。建议您参考针对您具体芯片和FreeRTOS版本的移植指南或示例代码,以获得更详细和准确的配置信息和步骤。


我移植的是内存管理4
Heap_1(只建不删)
Heap_2(Heap1_Pro、提供删除,产生碎片)
Heap_3(传统malloc - free)
Heap_4(Heap2_Pro,解决碎片)
Heap_5(Heap4_Pro,可管理分隔内存)
优缺点总结:

优先级的时间片轮转调度算法,优先级的时间片轮转调度算法是多级反馈队列调度算法的一种变体,它具有以下特点:
多级优先级:该调度算法将进程划分为多个不同的优先级队列。每个队列具有不同的优先级,通常按照优先级从高到低排序。不同的进程可以被分配到不同的队列中,根据进程的优先级确定所在队列。
时间片轮转:每个队列都采用时间片轮转的调度策略。每个进程在当前队列中运行一个固定大小的时间片,当时间片用完后,进程被放入队列尾部,并等待下一次调度。
优先级提升:为了避免低优先级进程饥饿问题,该算法引入了优先级提升机制。当一个进程在低优先级队列中等待一段时间后,其优先级会被提升到更高的队列中,以增加其获得CPU时间片的机会。
公平性和响应性:该算法旨在实现公平性和响应性的平衡。高优先级的进程会更频繁地获得CPU时间,以保证响应及时;而低优先级的进程也会有机会获得一定的CPU执行时间,以保证公平性。
动态调整:根据系统负载和进程优先级的变化,该算法具有动态调整的能力。可以根据实时情况增加或减少队列的数量、调整各个队列的时间片大小,以更好地适应不同的工作负载。
通过以上特点,优先级的时间片轮转调度算法可以在满足高优先级进程响应需求的同时,确保低优先级进程也能得到一定的执行时间,从而在多任务环境中实现较好的公平性和响应性。
这里需要程序员去配置时钟和系统节拍:根据STM32的时钟设置和FreeRTOS的节拍定时器配置,确保系统节拍的准确性和稳定性。
消息队列
队列(queue)可以用于"任务到任务"、“任务到中断”、"中断到任务"直接传输信息,可以实现任务之间的通信
消息队列就是一个像容器一样的东西,我们所有的任务都可以往内部写消息,然后队列会将我们的消息按顺序存下来,所有的任务也可以按顺序将其读出来
队列需要明确数据的大小以及队列的长度
信号量
队列(queue)可以用于传输数据:在任务之间、任务和中断之间,消息队列用于传输多个数据,占用时间按也相对较长,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示,一般是用作同步的效果
信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以用来表示资源的数量,当我们的量只有0和1的时候,它就可以被称作二值的信号量,只有两个状态,当我们的那个量没有限制的时候,它就可以被称作为计数型信号量。
信号量也是队列的一种【因为队列创建的时候,需要传入队列的长度以及队列的大小,而我们的信号量其实就是一种特殊的队列,只不过它的大小是0,毕竟我们的信号量是不需要传递数据,只需要传递信号,然后长度是N,当N=1的时候就是二值信号量,他就只有0和1两个状态,这里的0和1两个状态是指被填入和被拿走这两个状态,当N>1时,就是我们的计数信号量,他也不传递数据,只是传递一个数量值,一般是记录我们设备的资源数量】
互斥量
优先级反转的问题事件组
任务通知
https://blog.csdn.net/ba_wang_mao/article/details/127245356