boringhex.top博客

非典型程序员的小破站

2024第一天,继续给自己加点料。

导言

C语言环形缓冲区是一种常用的数据结构,它提供了一种高效的方式来存储和处理数据。本文将深入解析C语言环形缓冲区的定义、原理和应用,并提供一些实际的代码示例。

一、什么是环形缓冲区

环形缓冲区,也称为循环缓冲区或环形队列,是一种具有固定大小的缓冲区,其特点是当缓冲区已满时,新的数据将覆盖最旧的数据。它主要由两个指针(头指针和尾指针)和一个固定大小的数组组成。

二、环形缓冲区的原理

1. 数据结构

环形缓冲区的主要数据结构是一个数组,用于存储数据。此外,还需要两个指针来标识缓冲区的头和尾。

1
2
3
4
5
6
7
#define BUFFER_SIZE 10

typedef struct {
int buffer[BUFFER_SIZE];
int head;
int tail;
} CircularBuffer;
阅读全文 »

这两天在逛社区时,偶然看到一个程序员竞争力矩阵,感觉不管是选择卷,还是选择躺,搞技术的都应该渐进式提高自己的能力,对自己的能力发展做一个计划,而这个表格则可以作为一个路标参考,让我们在技术上不断进步。

这个竞争力矩阵涵盖了计算机科学、软件工程、编程、经验和知识等多个方面。

计算机科学

数据结构

  • Level 0: 不了解数组和链表的区别
  • Level 1: 能够在实际编程任务中解释和使用数组、链表、字典等基本数据结构
  • Level 2: 熟悉基本数据结构的空间和时间权衡,如数组 vs 链表,能够解释哈希表的实现原理并处理冲突,了解优先队列及其实现方式等
  • Level 3: 掌握高级数据结构,如B树、二项堆、斐波那契堆、AVL/红黑树、伸展树、跳表、Trie等

算法

  • Level 0: 无法找到数组中数字的平均值
  • Level 1: 掌握基本的排序、搜索和数据结构遍历和检索算法
  • Level 2: 理解树、图、简单的贪心算法和分治算法,并能够理解这些矩阵级别的相关性
  • Level 3: 能够识别和编写动态规划解决方案,熟悉图算法和数值计算算法,能够识别NP问题等

系统编程

  • Level 0: 不了解编译器、链接器或解释器是什么
  • Level 1: 基本了解编译器、链接器和解释器,理解汇编代码以及硬件层面的工作原理,了解虚拟内存和分页等知识
  • Level 2: 理解内核模式与用户模式、多线程、同步原语及其实现方式,能够阅读汇编代码,了解网络工作原理、网络协议和套接字级编程等知识
  • Level 3: 理解整个编程栈,包括硬件(CPU + 内存 + 缓存 + 中断 + 微码)、二进制代码、汇编语言、静态和动态链接、编译、解释、JIT编译、垃圾回收、堆栈、内存寻址等知识
阅读全文 »

FreeRTOS 中断处理的基础概念

在 FreeRTOS 中,中断处理是通过中断服务例程(ISR,Interrupt Service Routine)实现的。中断服务例程是一个在中断发生时由操作系统调用的函数。FreeRTOS 提供了一些用于在中断处理中使用的函数,以确保在中断上下文中正确使用实时操作系统。

中断服务例程的注册和处理

FreeRTOS 允许用户在中断服务例程中注册中断处理函数。这可以通过 xTaskGetSchedulerState 函数来判断系统的状态,以决定是否需要调用 FreeRTOS 的中断处理函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "FreeRTOS.h"
#include "task.h"

void vISRHandler(void)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;

// 中断处理代码

// 通知等待的任务发生了事件
vTaskNotifyGiveFromISR(/*任务句柄*/, &xHigherPriorityTaskWoken);

// 如果有任务的优先级高于当前运行的任务,需进行任务切换
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

int main(void)
{
// 注册中断服务例程
registerISRHandler(vISRHandler);

// 创建任务
xTaskCreate(vTaskFunction, "Task", 1000, NULL, 1, NULL);

// 启动调度器
vTaskStartScheduler();

return 0;
}
阅读全文 »

简介

CH348Q是沁恒出品的一款USB转8路串口的芯片,USB为2.0接口,其中4路串口支持流控,另外4路不支持流控,之前介绍过一款开源USB转8路串口的板子,文章链接:https://mp.weixin.qq.com/s/KsrV3nwemQyq3tdv7Lky_g;

今天再开源一款USB转4路RS422+4路RS485电路板,电路板采用分层设计,分为上下两层,下层是USB转4路RS422,上层是4路RS485,两层采用铜柱链接,如图:

RS422

RS485

实物图如下:

实物图

一般来讲,我们若使用多路422或485的时候,采用的方法就是使用多个USB转接模块,那样常遇到不知道串口号和模块的对应关系,尤其在无人值守的自启动程序中,这个就非常尴尬。

但是这个模块可以轻松识别到每一路的串口号,不需要每回启动都要选择串口,具体方法请看我以前发过的文章

阅读全文 »

FreeRTOS 是一个开源的实时操作系统,提供了丰富的时间管理和定时器功能,用于实现任务调度、延时等操作。在本文中,我们将深入探讨 FreeRTOS 的时间管理和定时器相关的内容。

时间管理

FreeRTOS 提供了以下几种与时间相关的管理功能:

1. vTaskDelay函数

vTaskDelay 函数用于使任务进入阻塞状态,以实现延时功能。延时的时间以 FreeRTOS 的时钟节拍(tick)为单位。

1
2
3
4
5
6
7
8
9
#include "FreeRTOS.h"
#include "task.h"

void vTaskFunction(void *pvParameters)
{
// 任务执行的代码

vTaskDelay(pdMS_TO_TICKS(1000)); // 延时 1000 毫秒
}

2. vTaskDelayUntil 函数

vTaskDelayUntil 函数用于设置任务的周期性执行,它在指定的绝对时间执行任务,而不是相对于当前时间的相对延时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "FreeRTOS.h"
#include "task.h"

void vTaskFunction(void *pvParameters)
{
TickType_t xLastWakeTime = xTaskGetTickCount();

for (;;)
{
// 任务执行的代码

// 等待下一个周期
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000));
}
}
阅读全文 »

在嵌入式系统中,任务管理是一个重要的部分,它涉及到任务之间的通信和同步,信号量,队列,互斥锁和事件标志组等概念。本文将以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的功能增强、性能优化以及对更多硬件平台的支持。

阅读全文 »
0%