<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Projectsauron 的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/Teminator_</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; Teminator_]]></copyright><item><title><![CDATA[FreeRTOS task 源码解析]]></title><link>https://blog.csdn.net/Teminator_/article/details/143577664</link><guid>https://blog.csdn.net/Teminator_/article/details/143577664</guid><author>Teminator_</author><pubDate>Mon, 11 Nov 2024 15:52:19 +0800</pubDate><description><![CDATA[FreeRTOS 本质上就是有很多的 List 组成，所以学习之前最好要对 FreeRTOS 中的链表要有所了解，可以参考：FreeRTOS 列表 List 源码解析

源码都在 task.c 中

一、基本结构和变量
1、TCB_t
首先来看一下一个任务的结构：

typedef struct tskTaskControlBlock    
{]]></description><category></category></item><item><title><![CDATA[BLE 协议之 GATT]]></title><link>https://blog.csdn.net/Teminator_/article/details/143526226</link><guid>https://blog.csdn.net/Teminator_/article/details/143526226</guid><author>Teminator_</author><pubDate>Thu, 07 Nov 2024 16:11:20 +0800</pubDate><description><![CDATA[GATT）：通用属性， 低功耗蓝牙的设备之间的通信协议。GATT 使用 ATT 协议， 定义了一套服务框架，用于发现、读写、通知、广播信息的配置。角色的定义Client：主要向服务器发送命令和请求，接收服务器的响应Server：接收命令和请求，发送响应Service服务是完成特定功能或特性的数据和相关行为的集合。在 BLE 从机中，通过有多个服务，例如电量信息服务、系统信息服务等，每个service中又包含多个特征值。每个具体的特征值才是 BLE 通信的主题。]]></description><category></category></item><item><title><![CDATA[BLE 协议之 ATT]]></title><link>https://blog.csdn.net/Teminator_/article/details/143470144</link><guid>https://blog.csdn.net/Teminator_/article/details/143470144</guid><author>Teminator_</author><pubDate>Tue, 05 Nov 2024 18:44:25 +0800</pubDate><description><![CDATA[ATT) ，BLE 属性协议，它是处于L2CAP协议层与GATT之间的一层属性操作协议，用于在一对蓝牙设备之间发现、读取、写入属性。这一层的关键词是Attribute属性一个属性就是一条数据，属性是 BLE 数据提供单元，也是蓝牙空中传播数据的最上层，BLE 开发过程中接触最多的就是这一层。属性协议允许称为服务器的设备向称为客户端的对等设备公开一组属性及其相关值。服务器公开的这些属性可以被客户端发现、读取和写入，并且 可以由服务器指示和通知。属性类型，通过UUID表示属性类型指定属性表示什么含义。]]></description><category></category></item><item><title><![CDATA[Git 查错记录]]></title><link>https://blog.csdn.net/Teminator_/article/details/142994358</link><guid>https://blog.csdn.net/Teminator_/article/details/142994358</guid><author>Teminator_</author><pubDate>Sun, 03 Nov 2024 20:18:13 +0800</pubDate><description><![CDATA[本文记录本人了最近在 Git 开发遇到的一些问题。]]></description><category></category></item><item><title><![CDATA[【STM32】通过 DWT 实现毫秒级延时]]></title><link>https://blog.csdn.net/Teminator_/article/details/143446544</link><guid>https://blog.csdn.net/Teminator_/article/details/143446544</guid><author>Teminator_</author><pubDate>Sat, 02 Nov 2024 11:03:57 +0800</pubDate><description><![CDATA[在 FreeRTOS 中，SysTick被用于作为调度器的一部分进行任务调度，那么如果我需要使用软件模拟通信，例如软件 I2C，需要使用 delay，就无法使用 SysTick 实现的 delay。因此，这里提供一种基于 DWT 实现的 delay。]]></description><category></category></item><item><title><![CDATA[BLE 协议之 L2CAP]]></title><link>https://blog.csdn.net/Teminator_/article/details/143226262</link><guid>https://blog.csdn.net/Teminator_/article/details/143226262</guid><author>Teminator_</author><pubDate>Fri, 01 Nov 2024 18:49:31 +0800</pubDate><description><![CDATA[一条是无连接的广播通道，天高任鸟飞另一条是基于连接的数据通道，是一个点对点（）的逻辑通道。广播通道暂且不提，这个数据通道（后面简称逻辑通道，只有一条，而要利用它传输数据的上层应用却不止一个（例如上图中的 ATT 和 SMP），怎么复用？所能传输的有效 payload 长度最大只有 251bytes，怎是否意味着上层应用每次只能传输少于这个长度的数据？（显然不能！仅提供了简单的应答和流控机制，如果传输的数据出错怎么办？协议信道复用（]]></description><category></category></item><item><title><![CDATA[BLE 协议之传输层]]></title><link>https://blog.csdn.net/Teminator_/article/details/142795039</link><guid>https://blog.csdn.net/Teminator_/article/details/142795039</guid><author>Teminator_</author><pubDate>Fri, 25 Oct 2024 08:42:04 +0800</pubDate><description><![CDATA[该图展示了两个设备之间的数据传输路径。Host 通过HCI Driver和Controller硬件上的交换数据和命令，这就是 HCI 的功能。HCI提供了一种统一接口用来访问，控制Controller，传输层是透明的，独立于底层传输技术，并且无需关系Host传输给Controller的数据是什么内容.在HOST与Controller之间，以Command与Event命令方式进行传输。Host发送Command信息到ControllerController将和Params以Event的形式返回给Host。]]></description><category></category></item><item><title><![CDATA[STM32 调试之栈回溯和 CmBacktrace 的使用]]></title><link>https://blog.csdn.net/Teminator_/article/details/143177973</link><guid>https://blog.csdn.net/Teminator_/article/details/143177973</guid><author>Teminator_</author><pubDate>Thu, 24 Oct 2024 00:35:16 +0800</pubDate><description><![CDATA[上图将通用寄存器分为 low register 和 high registers 就是根据指令集来说的，对于 Thumb 指令，是 16 位的，只能访问到 low register，也就是 R0-R7，而对于 32 位的 Arm 指令，是所有的指令都可以访问到。在不同的模式下，R0-R12、SP、LR 是各有一份的，所以这样算下来，总共是 32 个寄存器，但是在不同的模式下，并不能完全看到这 32 个寄存器的状态，只能看到其中的一部分。栈中数据和前面提到的寄存器是对应的，现在 SP 指针指向了地址。]]></description><category></category></item><item><title><![CDATA[动态链接过程分析]]></title><link>https://blog.csdn.net/Teminator_/article/details/143167189</link><guid>https://blog.csdn.net/Teminator_/article/details/143167189</guid><author>Teminator_</author><pubDate>Wed, 23 Oct 2024 09:12:52 +0800</pubDate><description><![CDATA[静态链接得到的可执行程序，被操作系统加载之后就可以直接执行。因为在链接的时候，链接器已经把所有目标文件中的代码、数据等 Section，都组装到可执行文件中了。并且把代码中所有使用的外部符号（变量、函数），都进行了重定位（即：把变量、函数的地址，都填写到代码段中需要重定位的地方），因此可执行程序在执行的时候，不依赖于其它的外部模块即可运行。这里的前提是可执行文件是可写的。而对于动态链接来说，在编译阶段，仅仅是在可执行文件或者动态库中记录了一些必要的信息。]]></description><category></category></item><item><title><![CDATA[静态链接过程分析]]></title><link>https://blog.csdn.net/Teminator_/article/details/143127425</link><guid>https://blog.csdn.net/Teminator_/article/details/143127425</guid><author>Teminator_</author><pubDate>Tue, 22 Oct 2024 12:18:54 +0800</pubDate><description><![CDATA[这样，通过两个重定位操作，main.c的两个外部符号就解决了地址重定位问题。中间圈出的两个数据和前面计算的是一样的！以上就是静态链接过程中地址重定位的基本过程，与动态链接相比，静态链接还是相对简单很多。]]></description><category></category></item><item><title><![CDATA[ESP32-IDF 非易失存储 NVS]]></title><link>https://blog.csdn.net/Teminator_/article/details/143078891</link><guid>https://blog.csdn.net/Teminator_/article/details/143078891</guid><author>Teminator_</author><pubDate>Mon, 21 Oct 2024 00:18:18 +0800</pubDate><description><![CDATA[NVS（，非易失存储），意思是掉电后能依然能持久化保存数据。在我们应用 NVS 时，一般用于存储一些配置数据、状态数据等，一般不会用来存储存放大量的数据量。在嵌入式系统中，NVS 主要是在 Flash 进行键值对的存储。举个例子，假设我们要把东西存到 Flash 中，按照底层的操作习惯，我们要先指定一个地址，然后对这个地址执行擦除操作，然后才能写入；读取的时候也需要根据这个地址，然后指定读取长度。如果我们要存的项比较多，又在代码中比较分散，我们对 Flash 的地址就很难管理。]]></description><category></category></item><item><title><![CDATA[ESP32-IDF 分区表]]></title><link>https://blog.csdn.net/Teminator_/article/details/143067754</link><guid>https://blog.csdn.net/Teminator_/article/details/143067754</guid><author>Teminator_</author><pubDate>Sun, 20 Oct 2024 08:18:19 +0800</pubDate><description><![CDATA[使用时要添加头文件。每片 ESP32-C3 的 flash 可以包含多个应用程序，以及多种不同类型的数据（例如校准数据、文件系统数据、参数存储数据等）。因此，我们在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。分区表的长度为 0xC00 字节，最多可以保存 95 条分区表条目。MD5 校验和附加在分区表之后，用于在运行时验证分区表的完整性。分区表占据了整个 flash 扇区，大小为 0x1000 (4 KB)。因此，它后面的任何分区至少需要位于 (默认偏移地址) + 0x1000 处。]]></description><category></category></item><item><title><![CDATA[ESP32-IDF 通用定时器 GPTimer]]></title><link>https://blog.csdn.net/Teminator_/article/details/143039363</link><guid>https://blog.csdn.net/Teminator_/article/details/143039363</guid><author>Teminator_</author><pubDate>Sat, 19 Oct 2024 08:33:28 +0800</pubDate><description><![CDATA[*!/*!/*!/*!struct {/*!/*!} flags;/*!clk_src：时钟源direction：计数方向（如递增、递减）：计数器分辨率（工作频率），以 Hz 为单位，因此，每个计数滴答的步长等于（）秒：GPTimer 中断优先级，如果设置为 0，驱动程序将尝试分配优先级相对较低的中断 （1,2,3）flags：设置为 1，定时器中断号可以与其他外设共享：设置为 1，驱动程序会在进入睡眠模式前备份并在恢复时恢复 GPTimer 的寄存器。]]></description><category></category></item><item><title><![CDATA[ESP32-IDF USART 专题]]></title><link>https://blog.csdn.net/Teminator_/article/details/143020580</link><guid>https://blog.csdn.net/Teminator_/article/details/143020580</guid><author>Teminator_</author><pubDate>Fri, 18 Oct 2024 09:59:03 +0800</pubDate><description><![CDATA[typedef struct {
    int baud_rate;                      /*!< UART baud rate*/
    uart_word_length_t data_bits;       /*!< UART byte size*/
    uart_parity_t parity;               /*!< UART parity mode*/
    uart_stop_bits_t stop_bits;         /*!< UART s]]></description><category></category></item><item><title><![CDATA[ESP32-IDF GPIO 专题]]></title><link>https://blog.csdn.net/Teminator_/article/details/142991265</link><guid>https://blog.csdn.net/Teminator_/article/details/142991265</guid><author>Teminator_</author><pubDate>Thu, 17 Oct 2024 08:58:05 +0800</pubDate><description><![CDATA[API 参考路径。ESP-IDF由多个组件组成，组件中包含专门为 ESP 芯片编写的代码或第三方库（即第三方组件）。对于某些第三方库，ESP-IDF提供专用的包装器和接口，以简化对第三方库的使用，或提高其与ESP-IDF其他功能的兼容性。某些情况下，第三方组件将直接呈现底层库的原始 API。]]></description><category></category></item><item><title><![CDATA[CMake 教程（三）添加库的使用要求]]></title><link>https://blog.csdn.net/Teminator_/article/details/142979572</link><guid>https://blog.csdn.net/Teminator_/article/details/142979572</guid><author>Teminator_</author><pubDate>Wed, 16 Oct 2024 14:20:47 +0800</pubDate><description><![CDATA[目标参数的使用要求可以更好地控制库或可执行文件的链接和包含行，同时还能在 CMake 内部更好地控制目标的传递属性。中的代码，以使用现代 CMake 方法。我们将让我们的库定义自己的使用要求，以便在必要时将它们传递给其他目标。，并输入目标库的名称。在大型项目中，手动指定库依赖关系的传统方法很快就会变得非常复杂。请注意，使用这种技术，我们的可执行目标要使用我们的库，唯一要做的就是调用。的任何人都需要包含当前源代码目录，而。再按照上一节的方法来编译运行，效果一致。的使用要求，我们可以安全地从顶级。]]></description><category></category></item><item><title><![CDATA[CMake 教程（二）添加库]]></title><link>https://blog.csdn.net/Teminator_/article/details/142955140</link><guid>https://blog.csdn.net/Teminator_/article/details/142955140</guid><author>Teminator_</author><pubDate>Tue, 15 Oct 2024 17:45:00 +0800</pubDate><description><![CDATA[在第一节中，我们已经了解和实现了通过 CMake 来创建一个基本项目。本节我们将通过两个实例来学习如何在项目中创建和使用库。]]></description><category></category></item><item><title><![CDATA[CMake 教程（一）初识 CMake]]></title><link>https://blog.csdn.net/Teminator_/article/details/142926818</link><guid>https://blog.csdn.net/Teminator_/article/details/142926818</guid><author>Teminator_</author><pubDate>Mon, 14 Oct 2024 21:36:44 +0800</pubDate><description><![CDATA[要启动项目，我们使用project()命令来设置项目名称。每个项目都需要此调用，并且应在之后立即调用。正如我们稍后将看到的，此命令还可用于指定其他项目级别信息，例如语言或版本号。[VERBATIM]]]></description><category></category></item><item><title><![CDATA[Cortex-M 内核的 OS 特性]]></title><link>https://blog.csdn.net/Teminator_/article/details/142886046</link><guid>https://blog.csdn.net/Teminator_/article/details/142886046</guid><author>Teminator_</author><pubDate>Sun, 13 Oct 2024 13:08:07 +0800</pubDate><description><![CDATA[PendSV典型使用场合是在上下文切换时（在不同任务之间切换）。上下文切换的本质就是保存当前执行现场 A，切换到另一个任务 B 里面。切换回来时又要恢复执行现场 A（将一系列的寄存器入栈、出栈）。由于PendSV的特点就是支持缓期执行，所以 RTOS 可以利用它这个特点，进行任务调度过程的上下文切换。而为什么要使用缓期执行的特点来进行上下文切换呢？简单的说就是任何 RTOS，都需要尽量不打断外设中断。执行一个系统调用系统滴答定时器 SYSTICK 中断，触发了任务的调度。]]></description><category></category></item><item><title><![CDATA[DMA 详解]]></title><link>https://blog.csdn.net/Teminator_/article/details/142824006</link><guid>https://blog.csdn.net/Teminator_/article/details/142824006</guid><author>Teminator_</author><pubDate>Thu, 10 Oct 2024 18:35:39 +0800</pubDate><description><![CDATA[DMA，直接存储器访问）顾名思义，就是绕开 CPU 直接访问 Memory。在计算机中，相比 CPU，Memory 和外设的速度是非常慢的，因而在 Memory 和 Memory (或者 Memory 和外设)之间搬运数据，非常浪费 CPU 的时间，造成 CPU 无法及时处理一些实时事件。因此，工程师们就设计出来一种专门用来搬运数据的器件——DMA 控制器（DMAC），协助 CPU 进行数据搬运。]]></description><category></category></item></channel></rss>