解读单链表-C语言实现
链表的概念及结构
概念: 链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由一系列节点组成的集合,每个节点包含实际存储的数据信息(称为元素或数据域)以及一个指向下一个节点的引用(称为链接或指针)。链表不像数组那样在内存中连续存储元素,而是通过节点之间的链接来组织数据。
首先来梳理链表的一些基本概念:
节点(Node):链表中的一个元素,通常包含数据域和链接域。数据域用于存放实际的数据值,而链接域则存储指向列表中下一个节点的引用。
头结点(Head):链表的第一个节点。对于空链表来说,头结点为 null 或者说没有头结点。
尾结点(Tail):链表的最后一个节点,其链接域通常为 null,表示链表的结束。
单向链表(Singly Linked List):最简单的链表类型,其中每个节点只有一个指向其后继节点的链接。
双向链表(Doubly Linked List):除了有一个指向前驱节点的额外链接外,其余与单向链表相同。这使得遍历可以从前向后也可以从后向前进行。
循环链表(Circular Linked List):在这种类型的链表 ...
信号量简介
信号量(Semaphore)是一种非常重要的同步方式,用于任务之间的同步和共享资源的管理。
信号量类型
FreeRTOS 支持多种类型的信号量,每种类型适用于不同的场景:
二值信号量(Binary Semaphore):
二值信号量是最简单的信号量类型,只有两种状态:0 和 1。
通常用于任务间的同步,确保某一事件的发生。
当信号量值为 1 时,表示资源可用;为 0 时,表示资源不可用。
任务获取信号量时,若信号量值为 1,则将其设为 0 并继续执行;若信号量值为 0,则任务将阻塞,直到信号量值变为 1。
计数信号量(Counting Semaphore):
计数信号量可以保存任意非负整数值。
通常用于控制对有限数量资源的访问,例如缓冲区或硬件设备。
任务获取信号量时,若信号量值大于 0,则将其减 1 并继续执行;否则任务将阻塞。
信号量可以由任务或中断服务程序来递增其值。
互斥信号量(Mutex Semaphore):
互斥信号量用于保护临界区代码或共享资源,确保一次只有一个任务能访问。
与二值信号量类似,但它具有优先级继承机制,可以用来解决优先级反 ...
嵌入式
未读队列简介
摘自freertos官网
队列传输方式
队列是任务间通信的主要形式。它们可以用于在任务之间 以及中断和任务之间发送消息。在大多数情况下,队列用作线程安全的 FIFO(先进先出)缓冲区, 新数据被发送到队列的后面,但也可以发送到前面。
向队列中写入和从队列中读取。此示例中创建队列来保存 5 个项目,并且 队列永远不会满。
FreeRTOS 队列使用模型既简单又灵活, 这两者通常是不可兼得的。消息通过队列以副本的方式发送, 这意味着数据(可以是更大的缓冲区的指针)本身被复制到队列中, 而不是队列始终只存储对数据的引用。这是最好的方法,因为:
已经包含在 C 语言变量(整数、 小结构体等)中的小消息可以直接送入队列。没有 必要为消息分配一个缓冲区, 然后将变量复制到分配的缓冲区中。同样,可以直接从队列中将消息读取到 C 变量中 。
此外,以这种方式向队列发送消息, 允许发送任务立即覆盖发送到队列的变量或缓冲区, 即使发送的消息仍在队列中。
由于变量中包含的数据已复制到队列中, 变量本身可以重复使用。不要求发送消息的任务 和接收消息的任务约定哪个任务拥有该消息, 以及哪个任务负责在 ...
任务调度
任务被创建后,它可能正在运行,可能暂停运行,任务有状态之分是由于调度器的存在,调度器需要决定哪些任务可以去运行,于是在FreeRTOS中任务具有4种状态,分别是就绪态、运行态、阻塞态和挂起态,它们之间的转化关系如下:
4个状态的含义如下:
就绪态:已经可以运行,等待调度器的切入
运行态:正在占用CPU运行
阻塞态:等待某个事件的到来,定时或者同步
挂起态:退出调度系统,调度器不可见,只能使用vTaskSuspend()挂起和vTaskResume()唤醒后进入就绪态
第5种是僵尸态,指在任务被删除后,其TCB控制块扔保留一段时间,等待内核检查和回收资源,在内核没有处理之前,任务其实并没有被完全删除,但是再也不能被调度器调度,这称为僵尸态,在Linux下的进程是存在僵尸态的,而从FreeRTOS的API中就可以看出,FreeRTOS的任务也存在僵尸态。
tick时钟和调度器
调度器本身也是一段程序,任务需要调度器安排执行顺序,那么调度器本身就需要被执行,这个执行由一个称为心跳时钟(tick)的中断触发,tick时钟的频率需要在FreeRTOSConfig.h文件中配 ...
嵌入式
未读freertos简介
简介
FreeRTOS(Free Real-Time Operating System)是一个免费的实时操作系统内核,专为小型、资源受限的嵌入式系统设计。它非常适合应用于微控制器(MCU)和物联网(IoT)设备上,因为这些设备通常具有有限的计算能力和内存资源。
以下是一些关于FreeRTOS的关键特性:
轻量级:FreeRTOS内核非常小巧,可以根据具体的应用需求进行裁剪,使得它能够在非常有限的硬件资源上运行。
开放源代码:FreeRTOS的源代码是公开的,这允许开发者查看并修改代码以适应特定的需求。
可移植性:FreeRTOS可以被移植到多种不同的微控制器架构上,这增加了它的适用范围。
任务管理:FreeRTOS支持创建和管理多个任务,即用户定义的函数,这些任务可以并发运行。系统负责调度这些任务,确保它们按照优先级顺序得到执行。
任务间通信:提供了多种任务间通信机制,包括信号量、消息队列和互斥锁等,帮助协调不同任务间的资源共享和同步。
定时器:软件定时器功能允许任务在指定的时间间隔后自动唤醒执行。
免费:相比于一些商业RTOS,Fre ...
准备工作
工具介绍
软件
keil5 : 用于代码编译调试
不多介绍,应该大家都知道。
cubemx : 代码生成
STM32CubeMX 是 STMicroelectronics(意法半导体)为简化其 STM32 微控制器系列的项目创建与初始化配置而开发的一款免费软件工具。STM32CubeMX 提供了图形化的用户界面,使得开发者可以快速地进行项目搭建,并且支持多种主流的 IDE(集成开发环境)。
vscode : 代码编辑(我喜欢的工具,万能ide)
Visual Studio Code(VSCode)是一款跨平台的轻量级源代码编辑器,以其高性能和丰富的功能受到开发者欢迎。它内置了 Git 支持,提供了智能代码补全与导航,以及强大的调试功能。VSCode 还拥有一个活跃的插件市场,支持高度定制化的用户界面,并且能够处理多种编程语言。此外,它还支持实时协作和内置终端集成,使其成为一个全面且灵活的开发工具。
modbus poll && slave
用于观察调试写的程序功能是否正常。
FreeModBus源码下载
github https://gi ...
Freemodbus
简介
这是 armink 大神移植的 Freemodbus 协议栈。同时支持主机和从机的功能。
FreeModbus 是一款开源的 Modbus 协议栈,但是只有从机开源,主机源码是需要收费的。同时网上也没有发现比较好的开源的 Modbus 主机协议栈,所以才开发这款支持主机模式的 FreeModbus 协议栈。本版 FreeModbus版本号更改为V1.6,特性如下:
新增加的主机源码与原有从机的风格及接口保持一致;
支持主机与从机在同一协议栈运行;
支持实时操作系统及裸机移植;
为应用提供多种请求模式,用户可以选择阻塞还是非阻塞模式,自定义超时时间等,方便应用层灵活调用;
支持所有常用的Modbus方法。
文件结构
源文件
描述
FreeModbus\modbus\mb.c
给应用层提供Modbus从机设置及轮询相关接口
FreeModbus\modbus\mb_m.c
给应用层提供Modbus主机设置及轮询相关接口
FreeModbus\modbus\ascii\mbascii.c
ASCII模式设置及其状态机
FreeModb ...
四足机器人软硬件架构
🤦♀️飞书画的感觉不咋地
四足机器人硬件(所有连接仅供参考,任何问题与本人无关)
电池
🐱👓请一定用万用表检测一下正负极是否和pcb接口对应以及电压是否正常,理论上来说2s~4s锂电池都可以接入
【淘宝】http://e.tb.cn/h.gKCOp83eZ0tq1GN?tk=drWN3hhtbwJ HU9196 「电动玩具枪锂电池7.4V充电器四驱越野遥控车充电电池挖掘机软弹枪」
点击链接直接打开 或者 淘宝搜索直接打开
需要购买一套电池
降压模块
👀保证至少可以过3A电流。
【淘宝】限时满20减2 http://e.tb.cn/h.gKaxrAQtpJIKUid?tk=qcLp3hhDj74 MF7997 「MP1584EN 3A 5A可调降压电源模块板稳压航模24V-12V 9V转5VDC-DC」
点击链接直接打开 或者 淘宝搜索直接打开
需要购买1块降压模块
NodeMcu 8266开发板
🤷♀️这个神板因该人手一个,不过现在乐鑫已经推出esp32c3了,新神板来了
【淘宝】限时官方立减0.73元 http:/ ...
解读环形队列-C语言实现
环形队列(Circular Queue)是一种特殊的队列数据结构。与普通的线性队列不同,环形队列在物理存储上表现为一个首尾相连的环状结构,在逻辑上则仍然遵循先进先出(FIFO, First In First Out)的原则。
特点
循环利用空间:当队列中的元素被删除后,原来的空间可以被重新使用,从而避免了普通队列中即使有空闲空间也无法使用的现象。
队头队尾指针:通常环形队列会使用两个指针来标识队列的头部和尾部,分别称为head(队头指针)和end(队尾指针)。
队满与队空判断:由于是环形结构,判断队列是否已满或为空需要特殊处理。一种常见的方法是在数组大小为N的情况下,预留一个位置不使用,这样当end + 1 == head时,表示队列已满;而当end == head时,则表示队列为空或满(取决于具体实现方式)。
动态调整:在一些实现中,可以通过动态调整数组大小来适应不断变化的数据量,但这不是环形队列特有的性质,也可以应用于其他数据结构。
应用场景
环形队列因其循环利用空间的特点,在某些应用场景中非常有用,例如:
缓冲区管理:在网络编程或者硬件驱动程序中, ...