
c
文章平均质量分 63
_沧浪之水_
一个爱阅读的嵌入式菜鸟,不定期更新博客
展开
-
C 快速切入看懂项目
查看单元测试(Unit Tests)、集成测试(Integration Tests)和端到端测试(E2E Tests),了解各个模块的功能。寻找程序的启动文件(如 main.py、index.js、App.java 等),从入口点开始追踪代码执行流程。找出实现主要功能的模块或类。如果有代码评审(Code Review)会议,积极参与,了解代码的设计决策。向项目负责人或资深开发者请教,了解项目的背景、技术选型和设计思路。查看注释:代码中的注释可能包含关键信息,比如函数的作用、参数说明和调用逻辑。原创 2025-04-16 16:16:02 · 250 阅读 · 0 评论 -
C 语言宏定义的新用法
GPIO_SET_OUT(PT_SPK_EN, PB_SPK_EN) 和 GPIO_SET_HIGH(PT_SPK_EN, PB_SPK_EN) 是底层硬件操作函数。这种宏定义的写法之所以可行,是因为它利用了 C 语言的预处理机制,将复杂的硬件操作封装为简单的函数式调用。GPIO_SET_OUT(PT_SPK_EN, PB_SPK_EN):将指定的 GPIO 引脚配置为输出模式。GPIO_SET_HIGH(PT_SPK_EN, PB_SPK_EN):将该引脚设置为高电平,从而开启电源。原创 2025-04-14 14:09:47 · 305 阅读 · 0 评论 -
Visual Studio无法打开源文件解决
文件管理原创 2025-03-02 18:19:11 · 417 阅读 · 0 评论 -
C 注释编写模版
编写清晰、有用的注释是提高代码可读性和可维护性的关键。良好的注释不仅能帮助他人理解您的代码,也能在未来您自己或其他开发者需要维护或扩展代码时节省大量时间。下面提供了一些常见的注释模板和最佳实践,适用于不同的编程语言和场景。头部文件注释:用于描述文件的用途、作者信息、版本历史等。解释函数的目的、参数、返回值及其可能抛出的异常。原创 2025-03-02 17:49:56 · 297 阅读 · 0 评论 -
C 数据类型转换那些事
在C语言中,数据类型转换(也称为类型铸造或类型转换)是一个重要的概念,它允许你将一种数据类型的值转换为另一种数据类型。然而,在进行类型转换时,有一些关键点和注意事项需要牢记,以避免潜在的错误和不正确的结果。浮点数转化为小数会把小数部分全部截断,然后小数部分省略掉。示例:结构体成员访问(无直接转换)示例:浮点转整数(精度丢失)示例:指向不同类型指针的转换。等小整型会被自动提升为。示例:整数常量默认类型。原创 2025-02-20 16:35:17 · 212 阅读 · 0 评论 -
C 位域的作用
如果在代码中存在多个类似的操作(例如设置不同的位),使用统一的位移操作格式可以使代码更加一致和易于维护。比如,若你需要设置第1位,则可以使用 (1 << 1),对于第2位则使用 (1 << 2) 等等。:即使左移0位不改变值,这种写法可以增加代码的可读性和明确性,表明你有意将第0位设置为1。这对于理解代码的人来说是一个清晰的信号,即该位是有意被设定的。也就是说,1 << 0 的结果还是1。,即1字节 = 8位)。本例中共有8个1位成员,正好占满1字节。本例中共有8个1位成员,正好占满1字节。原创 2025-02-19 18:48:57 · 622 阅读 · 0 评论 -
C ASCII字符表示
在程序中通常会出现这样的写法,A对应的ASCII字符表示的含义是65,一直往后到95获得的支付是B是66,然后Z对应的是90,这种写法表示的任务和含义是。这种格式化方式特别适用于需要固定宽度输出的情况,比如时间显示(小时和分钟)、日期显示月份和天数,等场合,确保了输出的一致性和对齐性。sprintf中的格式化字符串:将字符转换为对应的格式,输出到一个buf中进行存储,以下简单的解释一下这个字符的作用与含义。......这个含义与上面的具体上是类似的,然后A5表示的是一个固定的格式可能是相关数据帧。原创 2025-02-19 17:37:29 · 690 阅读 · 0 评论 -
C 获取特定位数的值
获取对应位数的数字,适应开发过程中的各种操作,具体的代码演示案例如下所示。(范围:0~99999),代码将逐位提取其数字,并存储到数组。:需确保输入值在合理范围内,并根据需求处理前导零和溢出问题。:不足5位时高位自动补零,需根据需求决定是否保留。:将最多5位的整数按万位→个位顺序分解到数组中。:固定位数显示(如数码管、LCD显示数值)。),高位计算结果可能不符合预期。),代码将截断高位。原创 2025-02-19 16:37:41 · 300 阅读 · 0 评论 -
C 数据类型定义
基于项目开发过程中的数据类型定义,为什么要这样做,数据类型的定义可以增强代码的可读性,在嵌入式的底层开发中,数据类型的定义是一种常见的方法,现在对这种方法进行优化。原创 2025-02-19 15:17:04 · 395 阅读 · 0 评论 -
C extern在函数声明中的作用
所以,原创 2025-02-19 14:42:30 · 406 阅读 · 0 评论 -
sprintf 格式化字符串说明符
sprintf 是 C 语言标准库中的一个函数,用于将格式化的数据写入字符串。它与 printf 类似,但不是将输出打印到控制台或终端,而是存储在一个字符数组中【将字符存储到一个字符数组中】。解释说明:1.0 char *str: 这是目标字符串的指针,格式化后的结果将会被存储在这里2.0 const char *format: 格式化字符串,包含文本和嵌入的格式说明符(如 %d, %s 等)3.0 ...: 可变参数列表,这些参数将根据格式化字符串中的说明符进行解释并插入到相应位置。原创 2025-02-18 19:07:10 · 1123 阅读 · 0 评论 -
C 单片机存储器修饰符xdata
这种存储器类型的指定有助于优化资源利用和性能,比如当你需要访问大量数据或希望释放内部数据存储器的空间时,就可以考虑使用 xdata 来定义变量。在单片机编程中,尤其是针对像8051这样的架构,使用不同的存储器修饰符可以指定变量存放在特定类型的存储器中。在单片机编程中,特别是使用C语言进行嵌入式开发时,xdata 是一种存储器类型修饰符,主要用于指定变量存储在特定的内存区域。由于8051架构的特性,程序存储器与数据存储器是分开的,因此使用code修饰符可以节省数据存储器的空间。,适用于需要按位操作的变量。原创 2025-02-18 09:50:31 · 461 阅读 · 0 评论 -
C 指针和整数的加减法运算
合法且有意义,用于计算两个指针之间的元素个数。原创 2025-02-17 15:13:22 · 348 阅读 · 0 评论 -
strstr字符串解析
为了更好地理解如何使用 strstr 函数来解析字符串,并解释为什么需要找到第一个逗号的位置,然后再基于这个位置继续搜索后续字符,这里提供一个具体的示例。我们将模拟一个AT命令的响应,并展示如何从中提取特定的信息。原创 2025-02-13 14:40:53 · 885 阅读 · 0 评论 -
Sprintf函数的用法
即使 g_BrgInfo.devAPN 实际上更长,但因为最大长度被限制为 C_DEVICE_APN_LENGHT,所以只会使用前 C_DEVICE_APN_LENGHT 个字符。因此,这段代码确实可以有4个参数,并且它们的作用分别是目标缓冲区、格式化字符串、字符串的最大长度和要插入的实际字符串。第三个参数 (U16)C_DEVICE_APN_LENGHT 指定了要插入的字符串的最大长度(精度)。表示宽度或精度是由函数调用中的额外参数指定的,在这里是指定字符串的最大长度。解读一下这个函数的用法。原创 2025-02-10 15:38:04 · 379 阅读 · 0 评论 -
C 移位运算符
1 << (n):这是位移操作符。它将数字 1 左移 n 位。例如,如果 n 是 3,那么 1 << 3 就是将二进制的 1(即 00000001)左移 3 位,结果是 00001000,也就是十进制的 8。宏定义 #define GET_BIT(n) ((1 << (n))) 用于生成一个整数,该整数在第 n 位上是 1,其余位都是 0。在这个例子中,GET_BIT(3) 展开后变为 (1 << 3),然后计算出的结果是 00001000(二进制),也就是十进制的 8。原创 2025-02-08 16:25:47 · 512 阅读 · 0 评论 -
C 枚举类型定义与用法
这行代码声明了一个静态变量 l_PWRONMODE,其类型是 l_PWRONMODE_e。这意味着 l_PWRONMODE 可以存储上述枚举类型中的任何一个值(即 PWRON_IDLE, PWRON_VOLT, PWRON_STABLE, PWRON_FACETORY, 或 PWRON_ZERO)。l_PWRONMODE_e 是你定义的一个枚举类型,它包含了一系列标识不同电源开启模式(Power On Mode)的枚举成员(如 PWRON_IDLE, PWRON_VOLT, 等等)。原创 2025-02-07 09:52:51 · 166 阅读 · 0 评论 -
51拓展数据类型定义
在嵌入式系统编程中,尤其是在使用8051架构的微控制器时,存储器模型和存储器类型的选择对于程序的性能、可靠性和资源利用效率至关重要。U8_X, U8_P, U8_D, 和 U8_C 这样的宏定义是为了简化对不同存储区域(xdata, pdata, data, code)中变量声明的过程,同时也为了提高代码的可读性和可维护性。这是一种特殊的外部数据存储器访问方式,通过页选通来实现更高效的访问。综上所述,这样的宏定义不仅简化了代码编写过程,还提高了代码的可维护性和灵活性,是嵌入式开发中一种有效的实践方法。原创 2025-02-06 17:39:57 · 375 阅读 · 0 评论 -
5-2 LED特定图标显示
这段代码的目的是在LED矩阵显示缓冲区中设置或清除一个特定的图标(在这个例子中可能是重量图标),具体取决于 isDisplay 参数的值。让我们逐步解析这段代码,理解其作用和逻辑。显示指定图标和隐藏指定图标的代码。原创 2024-12-25 16:01:06 · 564 阅读 · 0 评论 -
5-1 C/C++编译兼容程序
【代码】5-1 C/C++编译兼容程序。原创 2024-12-25 10:26:01 · 366 阅读 · 0 评论 -
4-4 循环右移数组内容
假设我们有一个数组 nums = {1, 2, 3, 4, 5, 6, 7} 和要右移的次数 k = 3,我们将逐步展示 rotate 函数如何工作。最终结果是数组 {1, 2, 3, 4, 5, 6, 7} 循环右移了3次,变成了 {5, 6, 7, 1, 2, 3, 4}。处理大 k 值:使用 k % numsSize 来确保即使 k 大于数组长度,也能正确计算实际需要右移的次数。这个方法不仅有效而且高效,因为它只涉及三次翻转操作,时间复杂度为 O(n),其中 n 是数组的长度。步骤1:完全翻转数组。原创 2024-12-24 15:58:53 · 461 阅读 · 0 评论 -
4-3 MCU中ARM存储器的作用
在讨论单片机中的“ARMZ”时,看起来可能存在一些混淆。通常情况下,我们不会直接提到“ARMZ”作为单片机存储内容的描述。可能你指的是某种特定的存储器或寄存器,或者是关于ARM架构下的某种概念。为了更准确地回答你的问题,我将分别解释几个相关的概念。原创 2024-12-24 11:15:59 · 492 阅读 · 0 评论 -
4-2 结构体枚举比较
整数类型的位字段(bit-field)是指在C语言中,可以在结构体中定义一个成员变量,并指定它所占用的比特(bit)数量。这允许你更精细地控制内存使用,特别是当处理多个标志或状态时,可以将它们紧凑地存储在一个更大的整数类型内。位字段通常用于优化内存使用或者与硬件寄存器进行交互,其中某些位表示特定的功能或状态。例如,你可以用2个比特来表示三种不同的图标显示状态(熄灭、常亮、闪烁),因为3种状态可以用2比特表示(00, 01, 10)。如果只用单个布尔值(通常是8比特),则会浪费更多的空间。原创 2024-12-24 10:51:43 · 852 阅读 · 0 评论 -
4-1 结构体作为函数参数
函数 esp_err_t ls_display_data_send(STRU_LsDisplayData_t* pstruDisData);这意味着调用该函数时,你需要传递一个 STRU_LsDisplayData_t 结构体变量的地址给它。请注意,实际的 STRU_LsDisplayData_t 结构体定义可能会有所不同,取决于你的具体应用需求。上述代码仅作为说明用途。为了更具体地理解 STRU_LsDisplayData_t 结构体包含什么数据,我们需要查看其定义。原创 2024-12-24 10:03:28 · 155 阅读 · 0 评论 -
3-9 结构体成员变量命名(m_前缀)
在结构体成员变量前加上m_前缀是某些编程风格指南中推荐的一种命名约定,这种约定通常用于表示成员变量(member variable)。这种做法的主要目的是为了区分类或结构体的成员变量与局部变量、全局变量以及其他类型的变量。可读性:当阅读代码时,m_ 前缀可以让开发者立即识别出这是属于某个类或结构体的成员变量,而不是局部变量或其他类型的变量。这有助于提高代码的可读性和理解速度。维护性:当调试或维护代码时,m_ 前缀可以帮助开发者快速定位到成员变量的定义和用法,从而更容易理解和修改代码。原创 2024-12-24 09:47:24 · 553 阅读 · 0 评论 -
3-6 extern用于函数声明
对于函数声明来说,extern 关键字实际上是可选的,因为默认情况下,所有函数声明都是外部链接的(即它们可以被其他文件中的代码调用)。声明会出现在头文件(.h 文件)中,以便多个源文件可以包含同一个头文件并访问相同的全局变量或函数。通过这种方式,你可以确保不同源文件之间的正确协作,同时保持良好的模块化设计。这样编译器就知道这些符号是在其他地方定义的,而不是当前文件。原创 2024-12-23 15:52:26 · 581 阅读 · 0 评论 -
3-7 C和C++混合编程
这样做后,当 mylib.h 被C++代码包含时,extern "C" 确保了C++编译器不会对这些函数名进行名称修饰,从而保证了C++代码可以正确调用这些C语言函数。如果 mylib.h 被C代码包含,extern "C" 部分将被忽略,因为C语言本身不需要这样的声明。假设有一个C语言编写的库 mylib.h,其中包含了多个函数声明。这段代码是C和C++混合编程中常见的条件编译指令,用于确保C++编译器正确处理C语言风格的函数声明。原创 2024-12-23 10:50:18 · 463 阅读 · 0 评论 -
3-5 C常用的字符串库函数
编译器在处理字符串时,会自动的在数据末尾添加ASCI码“0对应十进制0,便于程序对字符串解析。strlen()函数用于返回字符串的长度,不包括结尾\0。原创 2024-12-05 15:47:24 · 249 阅读 · 0 评论 -
3-4 C字符串的本质
字符串是一种特殊的数据,是一些ASCI码字符的集合,包含在””里:注意:要和ASCII码字符区别开,A'表示的是一个字符。原创 2024-12-05 15:37:21 · 418 阅读 · 0 评论 -
3-3 C结构体指针与动态内存
【代码】3-3 C结构体指针与动态内存。原创 2024-12-05 14:12:07 · 170 阅读 · 0 评论 -
3-2 C指针与动态内存
基于本人回顾与思考撰写,仅供学习参考......原创 2024-12-05 13:57:01 · 933 阅读 · 0 评论 -
3-1 C指针与数组
基于本人回顾与思考,仅供学习参考。原创 2024-12-05 11:39:18 · 498 阅读 · 0 评论 -
2-8 C函数指针实例
基于本人回顾理解,仅供学习参考定义:函数指针的概念,函数指针就是指向函数的指针,当一个函数作为一个参数传递给另一个函数,指针指向它所对应的函数时就称之为函数指针。原创 2024-12-03 14:23:47 · 332 阅读 · 0 评论 -
2-7 C函数指针与回调函数
对函数指针与回调函数知识回顾,仅供学习参考...目录1.0 函数指针2.0 函数指针变量3.0 函数指针与指针函数4.0 函数指针类型5.0 卡点。原创 2024-12-02 22:47:00 · 1057 阅读 · 0 评论 -
2-6 C浮点数指针运算案例
如何转换为float类型数值并打印?float f= 1.2f:如何将它对应的4个字节地址空间的数值以十六进制打印出来?数据在所有计算机中都是以二进制形式存储的,定了数据类型去解释这些二进制数据。,为了有效的组织管理这些数据,对于计算机硬件系统,原创 2024-12-02 17:22:50 · 452 阅读 · 0 评论 -
2-5 C指针与结构体
基于本人对相关知识的回顾,仅供学习参考...目录1.0 结构体指针访问2.0 结构体指针成员访问3.0 运算符优先级4.0 指针实质5.0 程序运行。原创 2024-12-02 14:13:13 · 682 阅读 · 0 评论 -
2-4 C指针变量运算
指针变量运算的步长及其规则,对于指针变量和普通变量不同的运算规则。原创 2024-12-02 11:49:52 · 355 阅读 · 0 评论 -
2-3 C指针访问寄存器
基于个人的理解与回顾,仅供学习参考。原创 2024-12-02 10:39:20 · 390 阅读 · 0 评论 -
2-2 指针变量参数
基于本人对相关知识的回顾撰写,仅供学习参考。原创 2024-12-02 10:12:54 · 343 阅读 · 0 评论 -
2-1 C指针的工作原理
本人对相关知识的回顾与思考,仅供学习参考指针是C语言的灵魂,不掌握指针相当于没有掌握C语言,C语言之所以能够很好的兼容硬件是因为C语言能够通过指针直接对内存进行操作,学好指针对嵌入式开发而言非常重要。原创 2024-12-01 21:09:49 · 417 阅读 · 0 评论