- 博客(262)
- 资源 (27)
- 收藏
- 关注
原创 找文心一言问了几个嵌入式软件开发的问题
百度终于通知我可以试用文心一言了,试验了一番,总体满意,记录几个文心一言回答的问题。1. 我是一个嵌入式软件开发者,你能帮我做什么工作以提高我的开发效率?
2023-04-14 16:41:09 1722
原创 随想009:读书
小时候写题目,写到不会的,从来不解决,错了就错了,也不更正。导致错误永远都在,你写 1 张,10 张,100 张卷子看起来好像很努力,其实都一个样,你只是把会做的做了,不会做的,错的永远还在那里,没有解决。我们天生喜欢享受,谁不想轻松些呢,所以遇到困难的事情,我们会下意识想逃避,然后我们就会烦躁、就会想睡觉。这是读书的目的,也是读书的本质所在。读书就是要选对书籍,克服难点,理解作者表达的内容,提升自己的理解力。等到对细节了解到一定程度后,就会有豁然开朗的一刻,而此时你醍醐灌顶,见识也上升到新的高度。
2023-03-22 11:57:57 532
原创 随想008:烂摊子
我看到过很多离谱的现象。比如:程序 代码重复、命名随意、逻辑混乱、甚至对齐都不一致,当我询问代码为什么这样写时,他们告诉我:我接手时就是这样!原理图参数错误、器件老旧,甚至原理都不合理,当我询问电路为什么这样设计时,他们告诉我:我接手时就是这样!PCB 布局不合理、CPU 引脚扇出不合理、布线不合理、甚至在 PCB 上硬连线(原理图上没有这些器件),当我询问 PCB 为什么这样画的时候,他们告诉我:我接手时就是这样!我知道他们接手了一个烂摊子。
2023-03-17 18:20:33 704 2
原创 CSDN Marddown 编辑器语法备忘
CSDN博客 Markdown 编辑器语法备忘本文在官方文档的基础上对其二次加工,增加渲染样式、补充例程、添加未收录的常用语法。
2023-02-15 16:27:55 823 1
原创 VS Code 用作嵌入式开发编辑器
使用 Keil MDK 进行嵌入式开发时,Keil 的编辑器相对于主流编辑器而言有些不方便,比如缺少暗色主题、缺少智能悬停感知(比如鼠标停在一个宏上,能自动展开最终的宏结果)、代码补全不好用等等,所以推荐使用 VS Code 来代替 Keil 的编辑器。,而有些代码和头文件会使用这些宏,在使用 VS Code 的时候就会找不到这些宏,从而导致语法错误。中,填入需要的宏(注意:我这里使用的是 Keil MDK 的 ARMCLANG编译器),缺少这个头文件,VS Code 识别不了代码中的。
2023-02-14 15:07:39 5520
原创 FreeModbus RTU 移植指南
FreeModbus是一个免费纯 C 语言支持 Modbus RTU/ASCII支持 Modbus TCP本文介绍 Modbus RTU 移植。裸机Keil MDK 编译器Cortex-M3 内核芯片(LPC1778/88)1.体系架构相关项目描述INLINE宏,编译器相关,内联指令或关键字宏,按照 C 代码编译宏,进入临界区和退出临界区BOOLUCHARCHARUSHORTSHORTULONGLONG数据类型TRUEFALSE。
2023-02-09 13:57:05 3537
原创 随想007:模块化代码
你一定不止一次的听说过模块化代码。理想的模块化代码高内聚低耦合、逻辑清晰、经过严格测试,易于复用它被描述的像是无所不能,仿佛只要使用了模块化代码,你就可以节省大把开发时间,项目就能化腐朽为神奇。以至于有些人了解模块化代码的优点后,惊喜的发现找到了一个可以无视人员素质又节省开发时间的终极方法:强制所有开发人员使用模块化代码
2023-02-07 20:15:50 1238
原创 使能中断与禁止中断策略比较
本文描述的内容仅适用于架构、Keil MDK编译环境下。在阅读 RT-Thread 源码和 FreeRTOS 源码时,发现二者使能中断和禁止中断方式不同,再加上 CMSIS 也提供了使能中断和禁止中断的函数,这些代码何处不同,各自的方法有什么优势所在?特记录如下。
2023-02-04 16:10:46 1383
原创 Windows 环境下的 Socket 编程 5 - 套接字的可选项
套接字的可选项是指在进行网络编程时,套接字(Socket)的一些参数和设置,这些参数和设置可以根据实际需要进行配置。
2023-02-03 20:42:59 553
原创 ADS1120 备忘
ADS1120 是一个小型、低功耗、16-bit、ΔΣ 模数转换器(ADC):- 内置 PGA(1~128)- 内置参考基准(2.048V)- 内置温度传感器- 内置 2 个已配对的可编程电流源- SPI 通讯接口,使用 `模式 1` ,通过 4 个寄存器配置
2022-12-08 16:50:38 2762
原创 Windows 环境下的 Socket 编程 4 - 基于 UDP 的服务器/客户端
在 TCP 中,套接字之间应该是一对一的关系。若向 10 个客户端提供服务,则除了守门的服务器套接字外,还需要 10 个服务器端套接字。但在 UDP 中,不管是服务器端还是客户端都。
2022-12-01 19:11:23 1322
原创 lwIP 细节之七:ARP 相关知识
IP 广播设备出现 ARP 风暴。局域网中有几十台 IP 广播系统,此外还有若干人员定位系统、安全监控系统。现场反馈,只要 IP 广播系统的主机断网(拔网线或者禁用网卡),局域网中的设备有很大概率全部会断网,疑似交换机瘫痪。交换机厂家去了现场捕获到了数据,发现 IP 广播大量发送 ARP 请求数据包,造成了交换机瘫痪。在查找 IP 广播为什么会大量发送 ARP 请求数据包的过程中,发现了一个异常点:IP 广播在连着上位机时,应该每隔 19 分钟向上位机发送一次 ARP 请求,但是抓包数据表明,这个时
2022-11-28 14:11:07 1204
原创 Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端
基于 TCP 的服务器端-客户端函数调用关系。客户端只能等到服务器端调用。
2022-11-20 19:04:08 1451 1
原创 测试驱动的嵌入式开发 002:VSCode + CMake + Unity 环境搭建
本文是对《测试驱动的嵌入式 C 语言开发》第二章的实践。
2022-10-27 16:50:26 2001 3
原创 测试驱动的嵌入式开发 001:VSCode + CMake + CppUTest 环境搭建
本文是对《测试驱动的嵌入式 C 语言开发》第二章的实践。对资源受限的嵌入式项目如何进行测试驱动开发的所有疑问,都因为本书第二章最开始的一句话而消解,当我读到这句话时,感觉脑袋里有闪电经过。
2022-10-27 13:36:37 2455 1
原创 LwIP IP 层常用函数和宏
这个函数与 Socket 编程中的 inet_aton类似。成功时返回1,失败返回0。可以看出已经转换为网络字节序(H:主机字节序,N:网络字节序)2.将字符串形式的 IP 地址转化为 32 位网络字节序整数。1.将 4 字节数据组成 IP 地址。
2022-10-17 22:10:41 2148
原创 仿真软件 LTspice XVII 操作方法
可以指示节点是输入、输出或双向类型的端口。这些端口类型将以不同的方式绘制,但对网络表没有意义。指示端口类型可以使电路更具可读性。全局节点的绘制方式也有所不同,因为在名称周围绘制了一个框。与其它软件不同,LTspice XVII 软件先选择动作,然后选择对象。比如要移动一个元件时,首先选择。命令,然后单击一个元件或框住一系列元件。程序会保持移动模式,直到单击鼠标右键或者按下 Esc 键。标记节点常常用于给电源起一个别名。):元件连接的线也会带到新位置。如果你给一个节点起一个以字符。,则这个节点时全局的。
2022-09-30 16:35:44 4769
原创 随想006:帮忙的时机
于是我暂停当前的问题,告诉他们这里存在代码重复,为了引起他们的注意,我会告诉他们重复的危害,以及改正方法。就像我进行的代码审查,因为他们不能理解其中的重要性,所以不愿做,最后变成了我指出一个地方,新人修改这个地方,就这么软抗拒。在审查的过程中,如果我发现了BUG,他们会很积极的修改,但如果是提升代码质量的重构,比如要求用宏来替换魔法数、用函数封装重复代码等,他们就会开始找理由、找困难,他们开始抗拒。当我过几天查看他们的代码时,在不同的时候,不同的人身上,而担心时,跟他谈代码质量,他们不需要,也不关心。
2022-08-30 14:34:14 415 3
原创 Windows 环境下的 Socket 编程 2 - 地址族与数据序列
可以方便的填写端口号和 IP 地址信息。由于 IPv4 的地址信息只有端口号和 IP 地址,所以预留了 8 字节的。数组中十分麻烦,因为端口号是 16 位数据, IP 地址是 32 位数据,需要将它们转换成字节流。数组,IPv4 协议族并不使用,只是为了保持和结构体。的地址信息,因而它的地址信息预留了 14 字节内存。本节重点在于 IPv4 协议族的地址信息表示。可以看到,将端口号、IP 地址这些信息写入。,常见协议族有:IPv4 协议族(函数为例,看一下结构体。)、IPv6 协议族(.........
2022-08-15 20:27:51 304
原创 Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数
版本占用 2 字节,高 8 位为副版本,低 8 位为主版本,比如 V1.2 版本,则传递 0x0201。Windows 严格区分文件 I/O 函数和 SOCKET I/O函数,而Linux只有文件 I/O 函数。编译:菜单 Terminal > Run Build Task ,或者快捷键 Ctrl+Shift+B。编译:菜单 Terminal > Run Build Task ,或者快捷键 Ctrl+Shift+B。其次,当程序结束之前,需要调用。版本,并初始化相应版本的库。函数,设置程序中用到的。....
2022-08-14 21:34:11 4125
原创 基于Windows 的 VS Code C/C++ 编译环境搭建
Linux 环境下可以使用 GCC 编译器,macOS 环境下可以使用 Clang 编译器。在 Windows 环境下,可以安装 MinGW C++ 工具,它是一款流行的免费工具集,包括编译器和调试器。这里给出的下载链接是清华大学开源软件镜像站,MSYS2 官网访问速度太慢。VS Code 首先是一个编辑器,C/C++ 插件不包括 C/C++ 编译器或调试器。文件时,将可以使用插件提供的语法高亮、代码智能补全、智能悬停感知及实时错误检查功能。调试使用gdb,需要设置gdb的路径。选择菜单**Run **>.
2022-08-12 21:18:03 2729
原创 lwIP 操作系统模拟层
contrib2.1.0给出了一个lwIP的操作系统模拟层,使用的操作系统为 FreeRTOS。这个宏用于启用协议栈锁定功能,是通过互斥量实现的,要求互斥量具备优先级继承机制。注1除非特别说明,以下内容针对lwIP2.0.0及以上版本。注2操作系统使用FreeRTOS。...........................
2022-07-26 14:57:58 1448
原创 随想005:调试的思考
任何的 BUG,都可以用以下步骤来解决:很多 BUG 很难解决,在第一步时就撞了个头破血流。总有人试图走些捷径,选择跳过这一步。无源之水、无本之木、万丈高楼浮空起结果自然是反反复复、来来回回,“攻关”之后接着“攻关”,然后公关。................................................................................................
2022-07-14 08:43:02 521
原创 稳压二极管数据手册参数补充
稳压二极管(zener diode)工作在反向击穿状态时,它的工作电流在很大范围内变化而其两端的电压基本不变。数据手册符号解释:下面给出一款稳压二极管数据手册的电气特性部分:可以看出稳定电压越低,其泄漏电流 IR 越大。对于低于 6V 的稳压管,其电压低,PN 节薄,击穿方式是齐纳击穿,很少电压就产生很大的 IR ,伏安特性曲线中的拐点部分比较缓慢;一般大于 6V 的稳压管,PN 节厚,击穿方式是雪崩能量击穿,需要达到一定的雪崩能量才急剧崩溃,所以在拐点之前的电压产生的 IR 很小,伏安特性曲线的拐点部分很
2022-07-09 14:44:32 4528 1
原创 INA226 备忘
访问和需要先编程。步骤为:校准值 按照公式计算:VAL=0.00512Current_LSB∗RSHUNTVAL = \frac{0.00512} {Current\_LSB * R_{SHUNT}}VAL=Current_LSB∗RSHUNT0.00512校准寄存器在编程前,电流寄存器和功率寄存器保持为 0 。支持 16 个地址。地址位 7 位,为bit1~bit7,bit0 为读写标志, 表示写, 表示读。......
2022-06-27 11:52:27 2895
原创 lwIP 细节之二:协议栈什么情况下发送 RST 标志
一次网络故障,抓包发现设备不停的发送 标志,为了探索 lwIP 协议栈什么情况下发送 标志,就有了这篇笔记。 标志是通过函数 发送的。这个函数声明为: 函数发送 TCP 数据包(带有 标志的空帧),用于中止连接或者向对方表明你指定的数据接收者查无此人(接收到的数据帧没有匹配的本地连接)。 函数可以单独使用,可以由以下函数调用:1.本地连接接收端已经关闭,但仍收到数据,调用 函数,发送 标志,通知远程主机并非所有数据都被处理。简化后的代码如下所示:这个代码也能看出,如果报文中包含有效数据,指
2022-06-14 16:56:41 1858
原创 lwIP 细节之一:TCP 最大链接数
lwIP 协议栈为每个 TCP 连接分配不同的 控制块。然而 lwIP 能分配的 TCP_PCB 控制块最大数目是编程人员指定的。宏 指定了 lwIP 能分配的tcp_pcb 最大数量,即同时有效的 TCP 连接个数。宏 在 文件中定义,默认 TCP 连接个数为 5。如果需要更改这个宏,需要在 文件中重新定义该宏:对于某个应用程序,如果当前的 TCP 链接数已经达到宏 指定的数目,此时再有一个客户端申请连接,lwIP 如何处理?在 TCP 服务器模式下,负责处理连接接入的是监听(lis
2022-06-13 15:05:42 3856
原创 lwIP 2.1.x 主要更新详情
修改网络接口 netif 的标志为管理标志。标志不再具有以前的“IP4 地址有效”含义,现在,如果一个网络接口 netif 没有设置标志,则用户不能在这个网络接口上收发数据!即便是使用 DHCP,在启动 DHCP 客户端之前,也要将 netif 设置为状态。这与lwIP 1.4.1版本不同。可以从两个版本的函数注释上看出来:通过调用函数,将指定的netif设置为状态。代码如下:可以看到将网络接口设置为状态是通过为字段增加标志实现的。做什么?具体怎么控制?协议栈通过一个软件标志,就可以把应用层发送和接收拿捏
2022-06-11 16:40:12 1599 4
原创 printf 日常使用指南
格式化适用场景调试输出LCD显示内容格式化函数的一般格式格式化输出函数printf、fprintf、sprintf和snprintf在格式化处理部分是相同的,本文以printf为例,说明此类函数的用法。printf函数的调用格式为:printf(“<格式化字符串>”, <参量表>);比如:printf("The Value %d.\n", 500); //输出数字这句代码产生如下输出:The value 500.格式化字符串在上面提到的 pri
2022-05-21 22:35:23 2813 1
原创 Wireshark 日常使用指南
过滤器捕获过滤器 (CaptureFilters)决定将什么样的信息记录在捕获结果中。点击如图所示图标,设置捕获过滤器规则。在弹出的“捕获选项”界面中,选择合适的接口,然后在 Capture filter for selected interfaces 输入框中输入捕获过滤器表达式。捕获过滤器表达式语法:滤波器表达式由**一个或多个原语(primitive)**组成多个原语之间使用逻辑操作符连接原语由一个或多个限定符组成。限定符有三类,分别是:协议、方向和类型常用的捕获滤波表达式
2022-05-21 22:22:32 14361 1
原创 Keil MDK下如何设置非零初始化变量 - 基于Arm Compiler 6
1. 编译器的自作主张ANSI C标准规定:未明确初始化的静态数据(static data),会被初始化为0。因此,默认情况下,编译器会将零初始化(zero-initialized)和未初始化(uninitialized)的数据放入相同数据段(data section),在运行时由C库的初始化代码将这些数据段域填充数字0。数据段可以是RW数据段(.data),也可以是ZI数据段(.bss)。定义一个全局变量int test1 = 0;,则变量test1是零初始化变量;定义一个全局变量int tes
2022-05-21 22:01:53 2847
原创 二级指针在链表中的应用
重读了两本书:Stephen A.Maguire的《编程精粹:Microsoft编写优质无错C程序秘诀》和David R. Hanson的《C语言接口与实现:创建可重用软件的技术》。两本书都有对链表的操作。假设有如图所示的链表,链表节点的pb成员指向一个缓冲块,删除节点函数根据缓冲块的首地址,找到节点并删除节点:《编程精粹》使用一个变量pbiPrev来保存前一个节点位置,并且要处理删除的是第一个节点A这种边界条件:void FreeBlockInfo(byte *pbToFree){ block
2021-01-27 21:27:48 1588
原创 Cortex-M3/M4内核处理器一次中断事件可能产生两次中断问题
平台:LPC1788中断源:外部中断1(红外接收)现象:红外解码失败。正常情况下一次红外遥控按键应该产生16次外部中断。诊断代码却显示执行了32次外部中断服务函数,也就是说一次中断事件,产生了两次中断。以下将这种问题简称为中断执行异常问题。期间排除掉红外遥控硬件电路、软件配置、红外遥控头输出波形、CPU勘误等可能性。最后看到Keil官网知识库中一篇文章ARM: Cortex-M3/M4 Interrupts Happening Twice?,才确定问题所在。这篇文章给出了以下信息:所有C.
2021-01-20 13:14:49 1939
原创 STM32F103芯片中断优先级以及FreeRTOS优先级设置
STM32F103芯片中断优先级设置CM3中,优先级数值越小,优先级越高。STM32F103只用了4个位来表达优先级,因此最多支持16级的可编程优先级(0~15),15为最低优先级。然而这16级可编程优先级并不一定都是抢占优先级,它会被优先级组分成两类:抢占优先级和亚优先级。NVIC中有一个寄存器是“应用程序中断及复位控制寄存器”(内容见表7.5),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB所在的位段(左边的)对应抢占优先级,而L
2021-01-18 11:21:31 5622 1
原创 代码运行时间测量结果的准确度测试
测试硬件STM32F103RC主频24MHz测试方法示波器测试引脚电平翻转(100M示波器)逻辑分析仪测试引脚电平翻转Keil+J-LINK在线仿真测试perf组件测试1.测试代码如下:DEBUG_GPIO_SET_H();handle_collect_data(); xEventGroupSetBits(get_event_group_handle(), TASK_BIT_HANDLE_DATA);DEBUG_GPIO_SET_L();使用示波器测得用时:8.6us
2021-01-13 12:59:16 1224 1
原创 keil5编译器退出调试时卡死
更新到keil5版本V5.25之后,目前一直到V5.29版本,都存在一个问题:退出调试模式时,有可能会卡死!此时需要在任务管理器中结束掉进程才能强制关闭keil工程。在Openedv论坛,正点原子解答网友帖子关于Keil_5.25版本Debug会卡死无法退出问题!!!时给出一种解决办法:解决方法: 工程路径不要有任何中文。这个方法对我的工程是有用的。我也查找了一些资料,均没有给出导致卡死的具体原因。恰好我有几个同事在升级到keil5 V5.29版本时也遇到了相同的问题。于是我向他们推荐了正点
2020-12-17 20:53:21 12577 14
原创 C 海拾珠
NULL 在头文件<stddef.h>、<stdlib.h>、<stdio.h>、<string.h>、<time.h>、<wchar.h>、<locale.h>中定义,只要编译器不能识别NULL,就应该在源文件中包含**<stddef.h>**头文件。
2020-12-17 12:50:40 720
原创 Git提交信息格式
什么情况需要提交每当完成了一个新功能、修复了一个错误、重构一个模块或者调整格式时,都应该提交一次代码,以便版本工具记录这次修改。规定:不能将不相关的修改一块提交,混合不同的功能会使得以后的问题查找或者其他成员浏览历史变得困难。提交信息格式<type>: <subject>//空一行<body>type:用于说明本次提交的类别,规定为以下几种:feat:新功能fix:修复错误refactor:重构代码style:调整代码格式(不影响代码运行
2020-11-23 10:16:03 4972 8
真正的《基于 S3C2440的触摸屏驱动程序实现》强新建、田泽、刘天时
2009-10-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人