
C
文章平均质量分 59
C语言笔记
duapple
这个作者很懒,什么都没留下…
展开
-
记录一个FreeRTOS堆栈溢出的问题
针对单片机平台,在函数体实现中,如果要分配大容量的内存,最好是使用堆上分配的方式。原创 2025-02-11 10:56:21 · 181 阅读 · 0 评论 -
letter-shell 移植适配GHS工具链
letter-shell移植适配GHS工具链原创 2023-07-24 18:41:02 · 403 阅读 · 0 评论 -
hexview 命令行操作使用说明
hexview工具常用命令原创 2023-06-07 15:24:18 · 5844 阅读 · 0 评论 -
RT-Thread SPI使用教程
使用RT-Thread Studio IDE创建芯片级的工程。创建完成后,可以直接编译下载进行测试。完成bmp280的读取Device ID的代码编写,添加到文件中。这里我使用的CS Pin是PB12,注意attach接口参数。SPI从机设备使用的是BMP280温湿度大气压传感器。中被完成,注册到了ops中。工程创建完成后,在RT-Thread Studio的。实验环境使用的是正点原子的潘多拉开发板。完成后,SPI的驱动就算是添加完成了。中打开需要使用的那一路SPI的宏。完成配置后,还需要在。原创 2023-02-19 19:45:02 · 3203 阅读 · 1 评论 -
rt-thread 移植调试记录
这里移植仅仅是利用rt-thread源码目录已经移植好的文件,组建自己的工程,不需要自己编写汇编完成底层移植。我这里的基础文件是通过RT-Thread Studio创建的基础工程,直接复制使用的。根据我们使用的芯片架构,进行移植。完成上述添加,基本上就是添加了我们需要的纯rtt内核了,没有使用到rtt的组件。参考RT-Thread Studio IDE的工程,就能够发现,主要的移植工作就在libcpu目录中,主要为。再次编译,没有报错,稍留程序,LED灯点亮,串口输出正常,输出字符串“test”。原创 2023-02-11 15:22:28 · 1359 阅读 · 0 评论 -
STM32 Bootloader开发记录 3 固件签名校验
为bootloader添加验签功能原创 2022-11-18 19:13:24 · 3426 阅读 · 1 评论 -
STM32 Bootloader开发记录 2
在《stm32 bootloader开发记录.md》文档中,已经实现了Bootloader下的升级功能。可以在Bootloader启动时,进入升级模式,使用串口传输数据,来下载固件到flash中。但是,在实际应用中,一般是在应用运行过程中进行升级,而不是在Bootloader中进行升级。一般只有在开发阶段才需要在Bootloader中进行升级。所以,接下来,我将实现在app中进行升级操作,并且添加签名验签功能,保证升级过程中固件的安全性和完整性。原创 2022-11-13 16:38:01 · 1398 阅读 · 0 评论 -
STM32 Bootloader开发记录
编写一个基础的Bootloader,记录一下开发过程及遇到的问题。原创 2022-10-17 20:41:15 · 6348 阅读 · 7 评论 -
sscanf参数强制类型转换出错
sscanf参数强制类型转换出错 当使用sscanf时,需要对多个变量进行输入时,格式串一定要按照输入内容进行设置。 下面代码会出现位置错误uint16_t x = 0;uint16_t y = 0;uint8_t str[20] = "22,33";sscanf(str, "%d,%d", &x, &y);上述代码放到工程中编译时编译器会报错,因为输入参数类型...原创 2020-03-21 14:26:02 · 1418 阅读 · 0 评论 -
C语言实现16进制数与10进制数的转化
C语言实现16进制数与10进制数的转化这里有两种情况:①第一种情况:如果我得到的是一个16进制数,我通过肉眼看到的就是16进制显示(这里看到的肯定打印结果),比如85,我知道这个数是16进制,但是代码里面却不是,在内存空间里却是按照int类型10进制进行存储的。需要将它在内存空间里面也转化为16进制的存储。#include <stdio.h>#include <stdin...原创 2020-04-09 10:41:19 · 14751 阅读 · 0 评论 -
判断IP地址是否合法(C语言)
C语言判断IP地址是否合法IPv4地址是由四个0~255的整型数,中间以’.'隔开的字符串,最大为长度为15。通过以上特征来鉴别是否是IPv4地址。整个字符串只能是由09的数字和’.‘组成,不能有其它字符。资格整数间嵌入了三个’.’,每个整数的范围都在0255,在整数0出现以后,后面只能是’.’,不能是数字了。如192.168.01.1。#include <stdio.h>#include <string.h>#define MAX_SIZE_IP_NUM 12#def原创 2020-06-15 16:58:48 · 8934 阅读 · 1 评论 -
将一个文件夹下的.c文件打包成静态库
一个使用示例:文件夹内容:然后创建一个简单的makefile在当前目录下:INCLUDE = -I/usr/local/ssl/includesrc = $(wildcard *.c)obj = $(src:.c=.o)libgsoap.a:$(obj) ar -rc $@ $^ %.o:%.c gcc -c $(INCLUDE) $< -o $@.PHONY: cleanclean: rm *.o运行$ make...原创 2020-08-20 23:21:32 · 843 阅读 · 0 评论 -
解决静态库之间相互依赖的问题(对‘*‘未定义的引用)
解决两个静态库之间相互以来的问题两个静态库之间相互依赖:在静态库liba.a中声明了某些函数,但是实现在libb.a中,此时a库依赖于b库;然后在静态库中libb.a中,某些结构体或者变量在liba.a中声明的,此时b库依赖于a库。然后链接的时候,会出现两个库之间的相互依赖问题。链接涉及到顺序问题,当先链接a库时,会出现函数未定义的情况,先链接b库是,也一样。查了一下,可以交叉链接,比如:gcc -la -lb -la,大概是这样,但是经过我尝试任然不行(最后通过gcc -la -lb -la -l原创 2020-08-23 01:13:06 · 6122 阅读 · 0 评论 -
二维数组 二级指针 参数传递
二维数组不能作为二级指针参数进行传递,无法强制转换。即:void fun(char **p);char str[2][6] = {"hello", "world"};fun(str);这样的调用会出错。但是数组指针可以转化为二级指针。如:void fun(char **p);char *str[6] = {"hello", "world"};fun(str);这样调用就OK。...原创 2020-08-24 09:27:11 · 2958 阅读 · 0 评论 -
如何在进程进程终止时执行函数
通过Linux系统调用来完成这个操作,atexit( )和on_exit( )。atexit( )函数原型:#include <stdlib.h>int atexit (void (*function)(void));示例:#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <signal.h>static void my_handler (void原创 2020-09-03 13:31:04 · 871 阅读 · 0 评论 -
jansson库使用
jansson库使用1. 将结构体转化为json字符串(解决jansson转化字符串失败)写了一个转换测试程序,发现运行个20多次后,就一直转换失败了。先后测试free(),json_object_clear() 和 json_decref()。发现只有json_decref()这个好使。估计是内存泄露导致的。uint32_t mydata_oildrop_item_to_json(mydata_oildrop_item_t *item, char *buff, size_t len){ .原创 2020-11-30 12:16:18 · 3754 阅读 · 0 评论 -
C语言面向对象的通用链表实现
面向对象的通用链表实现将接头体看做类似C++中的类,在里面声明数据和方法。其中包括一个链表所必须的数据和操作链表所必须的方法,再定义一个接口用于创建链表。使用指针的原因是防止局部变量被释放掉。typedef struct node_t Node;struct node_t{ void *data; Node *next;};typedef struct { void (*user_data_free)(void *data);原创 2021-05-18 09:04:54 · 317 阅读 · 1 评论 -
gsoap 远程调用举例
gsoap 远程调用举例gsoap生成Web Service框架代码。这里通过gsoap官网**Example XML SOAP server ©和Example XML SOAP client ©**例子来实现sgoap生成框架,并实现远程调用。gsoap官网例程:https://www.genivia.com/dev.html#server-c1、SOAP服务器将gsoap安装路径下的import和custom文件夹,stdsoap2.h和stdsoap2.h拷贝到需要生成文件的路径中。利用原创 2020-05-25 17:48:01 · 594 阅读 · 1 评论 -
如何实现C语言通用链表
C语言通用链表实现C语言的数组有时候很好用,但在不知道数据有多少的时候,并且涉及到某个数据的删除时,操作起来很不方便,这个时候就需要用到链表。自己定义一个链表数据结构,然后实现它,此时这个链表仅能表示你要处理的相关数据,并不是通用的,这将导致你要使用的时候就得重新写数据结构的代码。这个时候,定义一个通用链表,用这个链表就能处理所有的数据类型了,因为是通用的,所以会有一部分代码需要在用户使用的时候自己完成。常见链表定义struct Student { char name[20]; int原创 2020-07-04 14:00:41 · 1253 阅读 · 2 评论 -
makefile管理编译工程 自动生成.h头文件依赖
makefile管理编译工程工程目录结构每一个功能模块建立一个文件夹,然后该文件夹下建立include,lib,src文件夹。include存放对外接口,lib存放编译好的静态库,src存放源码.c和.h文件。每个功能模块有单独的makefile进行编译管理。顶层路径下建立一个管理所有功能模块的makefile。这个makefile负责主函数的编译链接工作。(关于.h文件更新,则重新编译包含了该头文件的所有的文件,这条规则还没实现)Makfile实现cJSONbuild = ../buil原创 2020-08-23 11:18:59 · 5101 阅读 · 1 评论 -
Linux C语言 Zlib 实现解压zip文件
Linux C语言 实现解压zip文件因为在做嵌入式Linux,做OTA功能的时候需要加压zip升级包。所以需要用到zip文件的解压缩功能。就想着能不能用zlib来完成这个功能。在网上一通找以后,发现教程千篇一律,要么是打着解压文件的标题解压buff内容,要么是c++完成的。好不容易有两篇C语言解压缩文件的,结果并不能用。最后还是只能看英文文档,终于找到案例了。下面记录如何实现的,其实还是非常的简单,例程写得比较复杂,我只用到一个解压功能,我基本上取了一部分代码,没有太大改动。有需要的话,可以再进行精原创 2020-11-11 19:33:44 · 8553 阅读 · 1 评论 -
记录线程退出(thread_cancel)导致的死锁问题
分别创建三个线程,在线程中使用日志库分别打印不同的内容。延迟2s后取消线程并退出。反复运行上面的代码。有概率出现阻塞的情况,经分析发现是死锁。将while(1)中的延时函增加,加到一定程度后,基本不会出现阻塞卡死的情况。原创 2022-09-18 17:38:44 · 575 阅读 · 0 评论 -
记录fork子进程执行execl阻塞卡死的问题
上面的函数是一个线程执行函数,调用这个函数,有概率会出现阻塞的情况。网上翻了一下资料,造成这个的原因是产生了死锁。因为我使用了自己的日志库,日志库里面有互斥锁用来保证输入数据的一致性。当父进程中的线程有调用日志打印函数时,会对互斥锁上锁,在还未解锁的情况,如果这时刚好fork子进程成功,并在子进程中执行日志打印函数的话,这个时候就会发生上面的所说的情况。原创 2022-09-18 16:06:02 · 801 阅读 · 0 评论 -
C语言 字符串库 strs
由于C标准库中的字符串处理函数功能太少了,因此自己参照这Go语言标准库的strings包的API的功能,用C语言写了一个。https://github.com/duapple/cstrs这里展示其中一个字符串分割的API。/** * @description: 以sep作为分隔符,分隔字符串str。需要strsFree2()释放 * @param {char} *str * @param {char} *sep * @param {int} *num 分割后的所有字符串的数量 * @retu原创 2021-11-20 22:03:10 · 1770 阅读 · 2 评论 -
KEIL 添加格式化 批量格式化
在写代码时,通常都离不开格式化更具。运用格式化工具能使我们的代码更加的美观。然而KEIL 没有内置格式化工具。因此我们需要自己为其添加格式化工具。之前我使用的是 AStyle ,效果还不错,网上一般也是建议使用这个工具。但是本人更加钟爱 vscode 的 C/C++ 格式化工具:clang-format 。这个工具可配置性更高,格式化出来的效果比 AStyle 好。比如变量定义初始化时,可以等号等起,宏定义时,可以宏定义对齐。注释也支持对齐。显然,这样格式化出来的代码更加美观。使用教程:1.原创 2021-04-22 00:48:16 · 2381 阅读 · 5 评论