- 博客(45)
- 收藏
- 关注
原创 FreeRTOS的简易使用
模块化,写在自己的.c文件中/*** @brief LED_Task任务主体*/while (1)LED1_ON;/* 延时500个tick */LED1_OFF;/* 延时500个tick */写在main.c/* AppTaskCreate任务堆栈 *//* LED任务堆栈 *//* AppTaskCreate 任务控制块 *//* AppTaskCreate 任务控制块 *//* 创建任务句柄 *//* LED任务句柄 */
2024-09-03 13:47:38
1319
原创 内存池数据结构
这样一来,每次获取空闲块直接从表头拿就行了,时间复杂的是明确的 O(1)。被分离出的空闲块指针位指向 pool 对象本体,便于后续“物归”时找到“原主”“空闲中”**的内存块并不刚好是物理有序的前后状态。比如内存块1使用中,内存块2空闲,内存块3使用中……上述情况下,当用户需要获取一个空闲的内存块时,若是按物理连续的逻辑来找**“空闲中”内存池是由一个个固定大小的内存块组成,所以应用每次获取的内存块长度是固定的。一个池子内的所有内存块都是物理上连续的,但常常会出现**“使用中”此内存池方案参考来源为。
2024-08-09 17:41:32
573
1
原创 玩转C语言宏——宏函数与宏拼接
它的作用是将两个令牌合并成一个单独的令牌。相比较可变参数函数,宏函数的可变参数还是遵循“宏替换”原则,比如上文调用。最终返回 3,也就是可变参数的长度,很巧妙的结合利用宏替换和可变参数。因为编译阶段时(这里假定可变参数内容是 7,8,9),编译器对于。运算符时,如果传参为空,那么会去除宏调用中多余的逗号。函数传参 n=3,那么最后拼接结果是 func_3。我们可以看到,原函数的 N 对应传入的 3,所以。我们注意到,调用可变参数宏函数时的传参可以是。时,可变参数位置并不是在最后。,区别在于,当可变参数。
2024-08-09 17:38:42
920
转载 C语言 attribute
目前市面上大多数的C/C++集成开发环境(IDE)使用的编译工具链主要是GCC、Clang、ARMCC、IAR Embedded Workbench。为了使用一些高级编译器特性,我们需要了解一些编译器指令,比如GNU C的,这种指令在uboot和Linux源代码中经常被使用。
2024-08-06 16:43:52
103
原创 GNU C 链接脚本学习笔记
链接脚本是用于。它通过定义程序各个段在内存中的布局和属性,指导链接器(如 GNU 链接器)如何将输入文件(目标文件和库文件,比如.o文件)组合成一个最终的可执行文件或库。链接脚本在嵌入式系统开发中尤为重要,因为它允许开发者精确控制代码和数据在内存中的布局,以满足特定的硬件和性能要求。
2024-08-06 16:41:18
1067
2
原创 Kconfig 详述
1、你可以在不同的 Kconfig 文件或同一个文件的不同位置,重复定义一个配置选项,只要它们的名称相同。2、这种重复定义通常是为了在不同的上下文中提供不同的选项描述或依赖关系。
2024-07-30 11:01:38
785
原创 menuconfig 与 Kconfig
menuconfig 是 Linux Makefile 中的一个目标(在Makefile中,目标(target)通常指的是一个规则,描述了如何生成一个特定的文件或执行一个特定的操作。这些目标可以是编译程序、生成文档、清理临时文件等等)。是五种用于配置 Linux 源代码的类似工具之一,是编译源代码所需的必要早期步骤之一。make menuconfig 采用菜单驱动的用户界面,允许用户选择要编译的 Linux 功能(以及其他选项)。
2024-07-30 11:00:33
454
原创 Git 常用命令介绍
将一个分支的 commit 直接放到当前分支,即只将此 commit 的变动给同步到当前分支(所以cherry-pick后,两个分支文件状态不一定是完全一样)。如果当前分支与切换的目标分支的commit记录不一致,然后当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容。用于合并指定分支的更改到当前分支,默认合并策略会将远程修改、删除的内容同步修改到本地,本地新增的内容保持新增状态。合并前需要先提交本地的更改。是一个安全的操作,不会影响当前的工作环境,它只是更新本地的远程跟踪分支。
2024-07-29 11:33:27
602
原创 Linux 内核态与用户态
Linux 的内核态和用户态是操作系统中两种不同的运行模式,它们用于管理和执行计算机系统中的软件和硬件资源。所谓的**用户态(kernel mode)内核态(user mode)**只是不同权限的资源范围。与之间的切换,需要通过来完成。
2024-07-29 11:29:59
322
原创 MQTT协议详述
MQTT协议详述,包含Topic,QoS,Keep Alive, Will Message,保留消息,共享订阅(MQTT5)
2024-07-01 17:44:44
1751
1
转载 IP协议学习笔记
网际协议IP),又称互联网协议,是互联网协议包中的网络层通信协议,用于跨网络边界分组交换。它的路由功能实现了互联互通,并从本质上建立了互联网。IP是在TCP/IP协议族中网络层的主要协议,任务是仅根据数据包标头中的IP地址将数据包从源主机传递到目标主机。为此,IP协议定义了封装要传递的数据的数据包结构。它还定义了用于用源和目的地信息标记数据报的寻址方法。第一个架构的主要版本为IPv4,目前仍然是广泛使用的互联网协议,尽管世界各地正在积极部署IPv6。
2024-07-01 09:45:00
77
原创 TCP/IP 网络协议族分层
TCP/IP不单是TCP和IP两个协议,TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,当然,也包括TCP、IP协议。它将软件通信过程抽象化为四个抽象层,常视为是简化的七层OSI模型。
2024-06-29 14:02:38
623
原创 C语言 内存对齐
的整数倍的地址处,有效对齐数=min{该成员大小,编译器默认对齐数(可由。,n=1,2,4,8,16 修改) }的最小整数倍。对于结构体的各个成员,总体对齐时,字节大小是。其他成员变量要对齐到。
2024-06-16 00:15:00
343
原创 volatile关键字
volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。volatile 关键字是一种类型修饰符,告诉编译器用它声明的类型变量会被某些编译器未知的因素更改,那么编译后不应该从寄存器中读取变量的值,而是直接从内存中读取(显然,读取内存的效率会低于读取寄存器)
2024-06-15 00:40:34
410
原创 const char * 和char *const ptr的区别
即 ptr 的值(指针指向)无法修改,但是。,即 ptr 的内容值无法修改,但是。的值(指针指向)可以修改。
2024-06-15 00:38:41
453
原创 Arduino数字音频开发笔记
在音频采集中叫做采样率。由于声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率。
2024-06-02 10:00:00
1048
1
原创 Eclipse快捷键及设置
Ctrl + Shift + F :书写格式规范的代码是每一个程序员的必修之课,当看见某段代码极不顺眼时,选定后按此快捷键可以格式化这段代码,如果不选定代码则默认格式化当前文件。默认设置是输入“.” 后,才会出现提示。可以将上下两行的位置对调,也可以是选中的几行与上下一行对调,与上一行对调的快捷键是Alt+↑,与下一行对调的快捷键是Alt+↓。查找当前文件所在项目中的路径,可以快速定位浏览器视图的位置,如果想查找某个文件所在的包时,此快捷键非常有用(特别在比较大的项目中)。查找类、方法和属性的引用。
2024-06-01 16:53:45
2163
原创 Java学习笔记
如果想接收多个返回值?返回数组。方法不可以嵌套定义。同一个类的方法可以直接调用 直接上例子: Class A { public void print(int n) { System.out.println(“print()方法被调 用 n=” + n);//在这里方法print就被调 用了 } }跨类调用方法:需要通过对象名调用 public void m1(){//这个方法是A类中的 B b = new B();b.hi();
2024-06-01 16:53:16
952
原创 适用于STM32的U8G2回调函数例程
U8g2 还包括 U8x8 库。OLED其实就是一个M x n 的像素点阵,想显示什么就得把具体位置的像素点亮起来。对于每一个像素点,有可能是1点亮,也有可能是0点亮在坐标系中,左上角是原点,向右是X轴正方向,向下是Y轴正方向。
2024-06-01 06:30:00
765
原创 嵌入式模块学习小记(未分类)
LD2410B模组直接通过一个IO引脚输出检测到的目标状态(有人高电平,无人低电平)同时也可通过 串口按照规定的协议进行检测结果数据的输出,串口输出数据中包含有目标状态和距离辅助信息等模块供电电压5V,输入电源的供电能力要求大于200mA。模块IO输出电平为3.3V。串口默认波特率256000。1停止位,无奇偶校验位。一个6轴姿态传感器,测量芯片自身X、Y、Z轴的加速度,角速度参数3轴加速度计(Accelerometer)3周陀螺仪传感器(Gyroscope)
2024-05-31 17:52:50
1464
原创 网络协议学习笔记
TCP:又叫传输控制协议(Transmission Control Protocal)是一种面向连接的、端对端的、可靠的、基于IP的传输层协议。主要特点是3次握手建立连接,4次挥手断开连接。IP:又叫因特网协议(Internet Protocol),IP协议位于网络层,IP协议规定了数据传输时的基本单元(数据包)和格式,IP协议还定义了数据包的递交办法和路由选择。LwIP:又叫轻型IP协议(Light Weight IP),同时操作网络层和传输层。
2024-05-31 17:43:16
784
原创 基于51单片机的智能温室灌溉系统
*故事背景:**钧钧老家最近天气多变、阴晴不定,家里人又全都摆烂,懒得浇菜,导致钧钧的菜园已经干涸了。小丁对钧钧一家的摆烂行为看不下去了,决定研发一套智能灌溉系统,高价出售给钧钧家。**任务目标:**小丁想使用8051内核的单片机,配合其他结构或模块,实现一个智能温室灌溉系统。该系统使用各种具有显示功能的元件或者模块来进行内容展示,可通过按键等来进行自动灌溉、手动灌溉模式的调节,浇水的水量可调;并且可以控制室内温度在一稳定范围。
2024-05-31 17:42:10
732
原创 ESP32开发笔记
在普通的订阅中,每发布一条消息,所有匹配的订阅端都会收到该消息的副本。然而,当某个订阅端的消费速度无法跟上消息的生产速度时,我们无法将其中一部分消息分流到其他订阅端中来分担压力。这使得订阅端容易成为整个消息系统的性能瓶颈。因此,MQTT 5.0 引入了特性,它使得 MQTT 服务端可以在使用特定订阅的客户端之间均衡地分配消息负载。具体而言,当我们有两个客户端共享一个订阅时,那么每个匹配该订阅的消息都只会有一个副本投递给其中一个客户端。
2024-05-31 17:37:24
440
原创 TM4C开发过程记录
接收最后一个数据并不应答,然后发送停止信号,用于多字节接收的结束。:发送起始信号,从机地址,接收数据和停止信号,用于单字节接收。:发送起始信号,从机地址和第一个数据,用于多字节发送的开始。:发送起始信号,从机地址,数据和停止信号,用于单字节发送。:发送最后一个数据和停止信号,用于多字节发送的结束。:发送起始信号和从机地址,用于多字节接收的开始。:发送错误停止信号,用于多字节发送的异常终止。:发送错误停止信号,用于多字节接收的异常终止。:发送数据,用于多字节发送的中间。PD7大概不能用作IO输入。
2024-05-31 17:34:06
486
原创 向GitHub远程仓库同步文件使用经验【2】
合并仓库(这里演示把mPy-ESP32[main]合并至Smart-home[main])由于没搞懂优快云的更新文档策略,只能把新写的内容作为新文章发布了。合并分支(将demo合并至main)然后打开.gitignore文件。致命错误:拒绝合并无关的历史。将本地仓库与远程仓库同步。忽略某个目录或文件不上传。根据忽略规则在里面编写。
2024-05-31 17:28:08
1177
原创 TM4C关于PF0无法使用M1PWM4功能的解决方案
简而言之:PF0是NMI引脚(默认为此类引脚),必须解锁才能使用其复用功能。下面举出我初始化M1PWM4的代码(频率250HZ,40占空比)
2023-07-28 03:51:18
232
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人