当前位置: 首页 > news >正文

【FreeRTOS】FreeRTOS操作系统在嵌入式单片机上裸机移植

目录

一 RTOS概述

二 FreeRTOS移植

三 FreeRTOS使用

四 附录


一 RTOS概述

        

        先了解一些基础概念,以下内容摘自FreeRTOS官网(FreeRTOS™ - FreeRTOS™):

【1】RTOS基础知识

        实时操作系统 (RTOS) 是一种体积小巧、确定性强的计算机操作系统。 RTOS 通常用于需要在严格时间限制内对外部事件做出反应的嵌入式系统,如医疗设备和汽车电子控制单元 (ECU)。 通常,此类嵌入式系统中只有一两项功能需要确定性时序,即使嵌入式系统不需要严格的实时反应,使用 RTOS 仍能提供诸多优势。 

        RTOS 通常比通用操作系统体积更小、重量更轻,因此 RTOS 非常适用于 内存、计算和功率受限的设备。

【2】多任务处理

        内核是操作系统的核心组件。Linux 等通用操作系统采用的内核 允许多个用户看似同时访问计算机的处理器。这些用户可以各自执行多个程序,看起来像是并发运行。
每个执行的程序由操作系统控制下的一个或多个线程实现。如果操作系统能够以这种方式执行多个线程,则称为多任务处理。 像 FreeRTOS 这样的小型 RTOS 通常将线程称为任务,因为它们不支持虚拟内存,因此进程和线程之间没有区别。
使用多任务操作系统可以简化原本复杂的软件应用程序的设计:

  • 操作系统的多任务处理和任务间通信功能允许将复杂的应用程序 划分为一组更小且更易于管理的任务。
  • 这种划分可以简化软件测试,确保团队分工明确,并促进代码复用。
  • 复杂的时序和排序细节将由 RTOS 内核负责,从而减轻了应用程序代码的负担。

【3】多任务处理与并发

        常规单核处理器一次只能执行一个任务,但多任务操作系统可以快速切换任务, 使所有任务看起来像是同时在执行。下图展示了 三个任务相对于时间的执行模式。任务名称用不同颜色标示,并写在左侧。时间从左向右移动, 彩色线条显示在特定时间执行的任务。上方展示了所感知的并发执行模式, 下方展示了实际的多任务执行模式。

【4】调度

        调度器是内核中负责决定在特定时间应执行什么任务的部分。内核 可以在任务的生命周期内多次暂停并恢复该任务。 如果任务 B 取代任务 A 成为当前执行的任务 (即任务 A 暂停,任务 B 恢复),我们就可以称任务 A “换出”,任务 B “换入”。

        调度策略是调度器用来决定何时执行哪个任务的算法。在(非实时)多用户系统中, 调度策略通常会确保每个任务获得“公平”的处理器时间。实时嵌入式系统中使用的策略详见下文。

        只有当调度算法决定执行不同的任务时,任务才会换出。这种切换可能在当前 执行的任务不知情的情况下发生,例如调度算法响应外部事件或定时器到期时; 还可能 发生在执行任务显式调用某个导致其让出、休眠(也称为延迟)或阻塞的 API 函数时。

        如果某任务让出,调度算法可能会再次选择同一任务执行。如果某任务休眠, 则在指定的延迟时间到期前不可被选择。 同样,如果某任务阻塞, 则在特定事件发生(例如,数据到达 UART)或超时期满之前将不可被选择。

        操作系统内核负责管理这些任务状态和转换, 确保根据调度算法和每个任务的当前状态在给定时间选择适当的任务执行。

        参考上图中的数字标记:

  • 在标记 (1) 处,任务 1 正在执行。
  • 在标记 (2) 处,内核将任务 1 换出……
  • ……并在标记 (3) 处将任务 2 换入。
  • 在任务 2 执行期间,在标记 (4) 处,任务 2 锁定了处理器外设以进行独占访问(图中不可见)。
  • 在标记 (5) 处,内核将任务 2 换出……
  • ……并在标记 (6) 处将任务 3 换入。
  • 任务 3 试图访问之前被任务 2 锁定的处理器外设,发现其被锁定,在标记 (7) 处阻塞以等待外设解锁。
  • 在标记 (8) 处,内核将任务 1 换入。
  • 如此往复。
  • 在标记 (9) 处,任务 2 再次执行,完成对外设的操作并解锁。
  • 在标记 (10) 处,任务 3 再次执行,发现外设可用,继续执行直到再次被换出。

【5】实时调度

        实时操作系统 (RTOS) 利用与通用(非实时)系统相同的原理来实现多任务处理, 但两者的目标截然不同。这一差异主要体现在调度策略上。实时嵌入式系统 旨在对现实世界的事件作出及时响应。这些事件通常有截止时间, 实时嵌入式系统必须在此之前响应,RTOS 调度策略必须确保遵守这些截止时间要求。

        为在小型 RTOS(如 FreeRTOS)中实现这一目标,软件工程师必须为每个任务分配优先级。RTOS 的调度策略 就是确保能够执行的最高优先级任务获得处理时间。如果存在多个能够运行的同等最高优先级任务(既没有延迟也没有阻塞),则调度策略可以选择在这些任务之间“公平”地分配处理时间。

        这种基本形式的实时调度并非万能,无法改变时间的快慢,应用程序编写者必须确保设定的时序约束在所选任务优先级安排下是可行的。

        以下为最基本的示例,涉及一个带有键盘、LCD 和控制算法的实时系统。

        用户每次按键后, 必须在合理的时间内获得视觉反馈,如果用户在此期间无法看到按键已被接受, 则该软件产品的使用感会很差(软实时)。如果最长可接受的响应时间是 100 毫秒,则任何介于 0 和 100 毫秒之间的响应都是 可接受的。此功能可作为自主任务实现,结构如下:

void vKeyHandlerTask( void *pvParameters )
{// Key handling is a continuous process and as such 

http://www.mrgr.cn/news/94048.html

相关文章:

  • Maven的依赖管理
  • ubuntu 解决 DNS 代理设置错误,导致不能上网的 DoH、DoT问题
  • 统计登录系统10秒内连续登录失败超过3次的用户
  • 基于redisson实现接口幂等性
  • Jenkins链接私有仓库Failed to connect to repository,stderr: No ECDSA...的问题
  • bootloader相关部分
  • 通道注意力机制、空间注意力机制、混合注意力机制
  • 【Spring 事务】
  • PySide(PyQT),QGraphicsRectItem的setPos()和setRect()的坐标位置的区别
  • 【WRF-Urban】使用 LCZ 替换 WRF 运行中的 LUCC 数据
  • 【Yonghong 企业日常问题07 】 东方通TongWeb替代Tomcat的实战指南!
  • 如何使用logrotete定时切割mysql的慢日志
  • Android DUKPT - 3DES
  • shell编程——条件表达式和if判断
  • liunx磁盘挂载和jar启动命令
  • Vue3项目-大事件
  • 在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧
  • 瑞芯微RK3576(2)-调试过程中遇到的问题
  • 使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)
  • 制作自定义镜像