boringhex.top博客

非典型程序员的小破站

在嵌入式系统中,任务管理是一个重要的部分,它涉及到任务之间的通信和同步,信号量,队列,互斥锁和事件标志组等概念。本文将以FreeRTOS为例,详细讲解这些内容。

1. 任务间通信与同步概述

在FreeRTOS中,任务是由一个或多个函数组成的独立的执行流,它们可以独立的运行和调度。任务之间的通信和同步是任务管理的核心内容之一。任务间的通信是指一个任务向另一个任务传递信息,而同步则是指多个任务按照一定的顺序执行。FreeRTOS提供了多种任务间通信和同步的机制,包括信号量,队列,互斥锁和事件标志组等。

2. 信号量的使用与实例

信号量(Semaphore)是FreeRTOS中一种常用的同步机制,主要用于任务间和中断服务例程(ISR)间的通信。它们被用来保护共享资源,使得只有一个任务或者中断服务例程可以访问共享资源,避免了资源冲突的问题。

FreeRTOS中的信号量主要有两种类型:计数信号量和二值信号量。

  1. 计数信号量(Counting Semaphore):是一种可以持有多个“计数”或者“票”的信号量。例如,如果你有一些共享资源,每个资源都需要独立的访问控制,你就可以使用一个初始计数等于资源数量的计数信号量。当一个任务需要访问一个资源时,它会尝试“获取”一个信号量。如果信号量计数大于0,那么信号量计数减1,任务继续执行。如果计数为0,那么任务就会阻塞,直到信号量计数大于0。当任务不再需要访问资源时,它应该“释放”信号量,信号量计数加1。

  2. 二值信号量(Binary Semaphore):是一种只有两个值(01)的特殊信号量。它通常被用作任务之间或者任务与中断服务例程之间的同步机制。当信号量的值为1时,任务可以获取信号量并继续执行。当信号量的值为0时,任务尝试获取信号量会被阻塞,直到信号量的值变为1。二值信号量也可以被用作互斥量(Mutex),用于保护共享资源的访问。

在FreeRTOS中,信号量的操作主要有创建(xSemaphoreCreateBinary, xSemaphoreCreateCounting等函数)、获取(xSemaphoreTake函数)和释放(xSemaphoreGive函数)。在中断服务例程中,获取和释放信号量的函数有所不同,分别为xSemaphoreTakeFromISRxSemaphoreGiveFromISR

阅读全文 »

引言

FreeRTOS是一个流行的小型开源实时操作系统,广泛应用于嵌入式系统领域。本文旨在详细介绍FreeRTOS的任务调度机制,我们将探讨其调度算法的原理,分析调度器的源码,并通过图表帮助理解调度过程。

FreeRTOS基础

实时操作系统简介

实时操作系统(RTOS)是为了能在规定的时间内完成特定任务的操作系统。与通用操作系统不同,实时性是其最重要的特征。

FreeRTOS的特点

  • 轻量级:占用资源少,适合资源受限的嵌入式系统。
  • 可裁剪:根据需要启用或禁用功能。
  • 多任务支持:支持抢占式和协作式多任务处理。
  • 优先级调度:任务根据优先级进行调度。
阅读全文 »

任务概述

任务是FreeRTOS中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS中的任务是基于优先级的抢占式调度,优先级高的任务可以抢占优先级低的任务的CPU资源。任务的创建、删除、挂起、恢复、设置优先级等操作都是通过调用API函数来实现的。

任务的创建

任务的创建是通过调用 xTaskCreate 函数来实现的,函数原型如下:

1
2
3
4
5
6
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask );

参数说明:

  • pxTaskCode:任务函数的入口地址。
  • pcName:任务的名字,用于调试。
  • usStackDepth:任务栈的大小,单位为字。
  • pvParameters:传递给任务函数的参数。
  • uxPriority:任务的优先级。
  • pxCreatedTask:任务创建成功后,返回任务句柄。
阅读全文 »

什么是实时操作系统(RTOS)

实时操作系统(RTOS)是一种专为实时应用程序设计的操作系统。实时应用程序需要在特定时间内做出预测的响应,因此RTOS专注于提供对时间约束的强调,以确保系统能够满足实时性能要求。

1. 实时性能:

  • 硬实时和软实时: RTOS可以根据实时性能的要求分为硬实时和软实时。硬实时系统对任务的响应时间有极严格的要求,任何未能在规定时间内完成的任务都会被认为是失败。软实时系统也有时间要求,但相对灵活,任务未能在规定时间内完成并不会导致系统失败。

2. 任务调度:

  • 实时调度算法: RTOS使用实时调度算法来确定哪个任务将在处理器上运行。这些算法考虑任务的优先级、截止期限和其他实时要求。
  • 时间片轮转: 在一些情况下,RTOS可能使用时间片轮转调度,确保每个任务都有机会运行,以防止某个任务长时间独占处理器。

3. 任务管理:

  • 任务创建与删除: RTOS允许创建和删除任务。任务可以是独立运行的单元,执行特定的功能。
  • 任务同步和通信: 提供机制使任务能够同步和通信,如信号量、互斥锁、消息队列等。

4. 内存管理:

  • 动态内存分配: 一些RTOS支持动态内存分配,允许在运行时分配和释放内存。
  • 静态内存分配: 为了提高可预测性,一些RTOS可能支持静态内存分配,即在编译时为任务分配内存。

5. 中断处理:

  • 中断服务例程(ISR): RTOS允许开发人员编写中断服务例程,以处理硬件中断事件。
  • 中断优先级: 中断服务例程可以具有不同的优先级,RTOS确保高优先级的中断可以中断低优先级的中断或任务。

6. 实时时钟和定时器:

  • 实时时钟: 提供对实时时钟的支持,以便任务能够基于实际时间进行调度和同步。
  • 定时器: 允许设置和管理定时器,以在指定时间触发任务或事件。

7. 错误处理:

  • 错误检测与处理: RTOS通常提供错误检测和处理机制,以确保系统在出现错误时能够采取适当的措施。

8. RTOS应用领域:

  • 嵌入式系统: RTOS广泛应用于嵌入式系统,如汽车控制单元、医疗设备、工业自动化等。
  • 通信系统: 在通信系统中,RTOS用于管理网络设备、路由器和交换机等。

9. 示例RTOS:

  • FreeRTOS: 一个开源的实时操作系统,广泛用于嵌入式系统。
  • VxWorks: 用于嵌入式实时系统的商业RTOS。
  • RTOS-32: 针对Windows平台的实时操作系统。

10. RTOS与通用操作系统的区别:

  • 实时性能: RTOS关注实时性能,而通用操作系统通常更注重吞吐量和响应时间。
  • 内核大小: RTOS通常具有更小、更精简的内核,以确保快速启动和响应。
  • 任务调度: RTOS使用实时调度算法,以确保任务在规定时间内完成。

实时操作系统在对实时性能有严格要求的应用中发挥着关键作用。通过提供对任务调度、同步、通信和实时时钟的支持,RTOS使得开发者能够设计和实现对时间要求极高的系统。在嵌入式系统和实时控制领域,RTOS成为了不可或缺的工具。

阅读全文 »

导言

在嵌入式系统的领域中,实时操作系统(RTOS)是非常重要甚至不可或缺的组成部分。FreeRTOS(Real-Time Operating System)是一款广泛使用的开源RTOS,为嵌入式开发提供了可靠、高效的实时调度和任务管理。本文将简要介绍FreeRTOS的发展历史、技术演进、技术特点,并介绍ESP-IDF对FreeRTOS的绑定,以及FreeRTOS在ESP32等芯片上的应用。

FreeRTOS的发展历史

FreeRTOS的历史可以追溯到2003年,由英国工程师Richard Barry创建。作为一位在嵌入式领域有着丰富经验的工程师,Barry的目标是开发一个轻量级、可裁剪、易于移植的RTOS,以满足各种嵌入式系统的需求。

随着时间的推移,FreeRTOS不断演进和壮大。其源代码的开放性质促使全球的开发者和企业积极参与,形成了一个庞大的社区。这个社区的不断贡献推动了FreeRTOS的功能增强、性能优化以及对更多硬件平台的支持。

阅读全文 »

鸽了数月,终于把固定翼小飞机的机身和硬件部分走通了,今天整理好开源,希望跟大家一起交流讨论。

项目开源地址:

  1. TinyPlane GitHub

简介

Tiny Plane是一个固定翼小飞机飞控项目,旨在DIY一款操控良好、飞行时间长、可玩性高的固定翼小飞机。目前基于48cm翼展手抛机进行改装,飞控采用ESP32-C3。

特性

飞控主要特性:

  • 单串锂电池供电,最大工作电压5.5V
  • 电源电压、电流感测
  • 锂电池温度感测
  • DCDC降压电源,效率90%以上
  • 3轴加速度计,3轴陀螺仪
  • 气压计,高度精度10cm
  • 2路动力电机通道,支持电流感测
  • 2路数字IO通道
  • USB TypeC接口,调试和烧写程序
  • 1路串口,可用于连接GPS

机身主要特性:

手抛机机身

  • 49cm翼展,47cm长,22cm平尾
  • 重量 ~40g
阅读全文 »

ESP32C3小飞控板赶在国庆节前发出打样,假期后上班就收到了样板,但是迟迟没有动手调试,这两天终于抽出时间调试了,调试过程还算顺利,基本没有遇到什么大问题,下面记录一下调试过程。

原理图

ESP-FC原理图

比计划中多加了一个大气压力传感器,用作测高。主要特性:

  • 单串锂电池供电,最大工作电压5.5V
  • 电源电压、电流感测
  • 锂电池温度感测
  • DCDC降压电源,效率90%以上
  • 3轴加速度计,3轴陀螺仪
  • 气压计,高度精度10cm
  • 2路动力电机通道,支持电流感测
  • 2路数字IO通道
  • USB TypeC接口,调试和烧写程序
  • 1路串口,可用于连接GPS
阅读全文 »

大多数公司都是每个月定期提交报销,一般报销用的发票都是电子发票发到邮箱,每次要报销时都需要登录邮箱,点开邮件,一个个下载整理,工作量不大,但是发票多了也着实很烦。这个月终于下决心把这个过程自动化一下。

思路

查看了一下邮箱里的发票邮件,虽然主题内容格式不固定,但是基本都包含“发票”,所以可以用“发票”关键词将发票邮件筛选出来。然后解析发票邮件内容,将发票pdf文件提取下载,并整理到指定文件夹。

嗯,就这么简单。

实现

这种事还是用python比较快吧,搞起。

阅读全文 »

这个机器人程序可以将发票邮件中的发票pdf文件自动下载整理,但是发票邮件格式并不标准,有下载失败的可能。

程序用python编写,以源码提供,可以自行修改。总的来说配置比较简单,但还是需要一点点基础。

虽然用自己常用的邮箱也可以,但还是强烈建议为接收发票邮件单独申请一个邮箱。下面就从邮箱申请开始,对发票机器人的配置过程进行说明。

申请邮箱

任何支持IMAP协议的邮箱都可以,国内常用的免费邮箱都支持的,这里以网易163邮箱为例。

  1. 打开网易邮箱主页 https://mail.163.com/,点击注册新账号。
  2. 按照注册向导完成邮箱注册。
阅读全文 »

之前的文章 信号去噪 中列出了7种常用的信号去噪算法,对于后两种算法——深度学习和奇异值分解(SVD),我现在也不太理解,就先不写了。

很多朋友留言又提了一些算法,今天一起来聊聊椭圆滤波器。

椭圆滤波器(Elliptic Filter),也称为Cauer滤波器,是一种数字滤波器,用于信号处理和滤波应用。椭圆滤波器之所以得名,是因为其在频率响应图上的特征呈现出椭圆形的形状。

椭圆滤波器有以下特点和优点:

  1. 极窄的过渡带宽:椭圆滤波器的过渡带宽(即通频带到阻频带的过渡区域)非常窄,这意味着它可以在频域内实现非常陡峭的滤波特性。

  2. 通带和阻带均衡:椭圆滤波器通常可以在通带和阻带内实现更好的幅度响应均衡。这意味着它可以在通带内最小化幅度失真,并在阻带内最大化信号抑制。

  3. 允许通带和阻带的波动:与其他滤波器设计相比,椭圆滤波器允许通带和阻带内的振荡,但在给定的通带和阻带容限下,可以实现更小的阶数(更低的复杂度)。

  4. 高阶滤波特性:椭圆滤波器通常以较高的阶数实现,这使其适用于需要极高滤波性能的应用,如无线通信和雷达系统。

椭圆滤波器的设计需要确定以下参数:

  • 通带边界频率(通带上下限的频率)。
  • 阻带边界频率(阻带上下限的频率)。
  • 通带最大允许波纹(通带内振荡的幅度波纹)。
  • 阻带最小抑制(阻带内信号抑制的最小要求)。

椭圆滤波器设计通常涉及到数学优化问题,以找到最佳参数配置来满足上述要求。

阅读全文 »
0%