1 前言
本系列学习笔记是对“韦东山FreeRtos学习系列教程”和B站up主“愿意做我的战士吗”FreeRtos操作系统教程的总结,读者若想对FreeRtos有更加深刻的了解可以移步这两位的专栏就行学习。
本系列学习笔记是基于STM32的FreeRtos,使用CubeMx和Keil作为开发工具,正点原子STM32F1战舰开发板作为开发平台。
2 关于FreeRtos
2.1 FreeRTOS的特点
- 实时性: FreeRTOS可以配置成为一个硬实时操作系统内核,也可以配置为非实时型内核,甚至于部分任务是实时性的,部分不是。这一点比uC/OS-II 要灵活。
- 任务数量: FreeRTOS对任务数没有限制,同一优先级也可以有多个任务。这点上比uC/OS-II好。
- 抢占式或协作式调度算法: 任务调度既可以为抢占式也可以为协作式。采用协作式调度算法后,一个处于运行态任务除非主动要求任务切换,否则是不会被调度出运行态的。
- 任务调度的时间点: 调度器会在每次定时中断到来时决定任务调度,同时外部异步事件也会引起调度器任务调度。
- 调度算法: 任务调度算法首先满足高优先级任务最先执行,当多于1个任务具有相同的高优先级时,采用round robin算法调度。
- 优先级翻转: FreeRTOS没有提供优先级继承机制或其他的避免优先级翻转的方法。
- 任务间通信: FreeRTOS 支持队列和几种基本的任务同步机制。
2.2 FreeRTOS 部分解析
- 消息队列: 任务间传递信息可以采用队列方式,FreeRTOS实现的队列机制传递信息是采用传值方式,因此对于传递大量数据效率有些低。但可以通过传递指针的方式提高效率。中断处理函数中读写队列都是非阻塞型的。任务中读写队列可以为阻塞型也可以配置非阻塞型。当配置为阻塞型时可以指定一个阻塞的最大时间限(Timeout)。
- 任务间同步: FreeRTOS 支持基本的信号量功能。FreeRTOS 采用队列来实现信号量的功能,可以认为一个值为n的信号量就是一个长度为n的队列,队列中每个元素的大小为0。这样的队列并不会浪费宝贵的内存空间。
- 对于死锁(Deadlock)的处理: FreeRTOS 并没有实现一种可以完全避免死锁的机制。只是通过指定一个阻塞的最大时间限(Timeout)来减少死锁现象的发生。或者说是给出了当死锁现象发生时解锁的可能。当然能不能真的解锁要依赖于使用者的处理代码是否合适。
- 临界区: FreeRTOS 采用开关中断的方式实现临界区保护。任务代码中临界区可以嵌套,FreeRTOS 会自动记录每个任务中临界区嵌套的层数。
- 暂停调度: 与进入临界区类似,FreeRTOS 可以通过暂时关闭任务调度来保证任务代码不被更高优先级的其他任务打断,与临界区不同,关闭任务调度并不会关闭中断,这样中断处理函数仍会照常的执行。
- 内存分配: FreeRTOS 提供了多种内存动态分配的方法,具体程序中需要选择其中一种。最简单的内存分配方式提供了一种非常简单的固定内存分配算法,这种方式下只支持内存的分配,不支持分配内存的回收。因此,任务建立后就不能被删除。其他几种内存分配算法支持分配内存的回收,有的方法支持邻接内存块的合并,有些不支持。对我个人来说,我还是比较欣赏uC/OS-II中内存分配的方法,既保证了实时性,也具有一定的灵活性。FreeRTOS 中提供的几种方式,实时性好的功能上有缺陷,功能上完善的实时性却不好。我通常采用的方式是采用最简单的内存固定分配算法,当需要动态释放时将uC/OS-II中内存分配的代码拿来用。
3 使用CubeMx配置FreeRtos
1.首先,像往常一样需要先设置RCC、SYS以及时钟树,这里不做详细介绍。
需要提醒一点的是:裸机的时钟源默认是SysTick,但是开启FreeRTOS后,FreeRTOS会占用SysTick,所以需要需要为其他总线提供另外的时钟源。(这里建议使用普通定时器TIM7作为时钟源)
2.开启FreeRTOS(建议使用CMSIS_V1,据说V2不太稳定),进行相关配置。详情如下:
持续跟新...
【FreeRtos教程一】STM32 CubeMx——StaticDynamicTask(静态动态任务)_stm32cubemx中freertos 中的 dynamic 和 static-CSDN博客
【FreeRtos教程二】STM32 CubeMx——Suspend And Resume(挂起与解挂起)_freertos中suspend作用-CSDN博客
【FreeRtos教程三】STM32 CubeMx——Message Queue(消息队列)_freertos osmessagequeueget-CSDN博客
【FreeRtos教程四】STM32 CubeMx——Mail(邮箱)_freertos队列邮箱可以存地址吗-CSDN博客
【FreeRtos教程六】STM32 CubeMx——Mutexes And Recursive Mutexes(互斥量与递归互斥量)_stm32互斥锁-CSDN博客
【FreeRtos教程七】STM32 CubeMx——EventGroup(事件组)_xeventgroupcreate-CSDN博客
【FreeRtos教程八】STM32 CubeMx——Task Notifications(任务通知)_cubemx xtasknotify()-CSDN博客
【FreeRtos教程九】STM32 CubeMx——Timers(定时器)_freertos硬件定时器-CSDN博客
【FreeRtos教程十】STM32 CubeMx——Interrupt Management(中断管理)_stm32 freertos 中断-CSDN博客