- 博客(120)
- 问答 (2)
- 收藏
- 关注
原创 cmake多个预头文件多个-include被优化成一个导致编译错误的解决方法
用target_precompile_headers就行了,国产ai+cmake真的蠢到家了。
2025-11-11 15:40:14
82
原创 微雪ESP32-S3-Touch-LCD-2.8-Test编译成功方法esp-idf vscode
2.把工程下的.vscode文件夹删除(因为里面的配置是其他人的路径),再在vscode里打开文件夹,安装了cmake会默认打开时运行,会出错,不管他,等cmake加载完后直接删除生成的build文件夹。3.芯片选s3,然后直接构建即可,第一次有点慢是正常的,build成功完后会弹出size。1.首先安装好环境,直到可以编译例程通过可以烧录为止。
2025-11-04 17:38:25
267
原创 cmake使用makefile和ninja的一个区别BYPRODUCTS
如果ninja有一些add_custom_command 文件依赖规则,如果依赖的文件需要其他的target隐式生成(比如command) ,为了保证不会在这些target执行前就判断该文件依赖规则,需要使用BYPRODUCTS对这些target的副产品文件进行显示表示,这样顺序才会正确,makefile不知道可不可以自动判断,但是反正使用ninja时不会自动判断,要手动显示副产品。
2025-09-29 15:37:06
141
原创 vscode cortex-debug 调试boot+app的情况下
同时烧录多个hex文件调试多个elf的方法。使用这两个替代executable项就行了。使用方法参考eide的。
2025-09-19 16:34:54
200
原创 单片机MCU编译时.h文件预编译宏定义无效导致报错
看看是不是.S文件include的,.S文件include的时候不会默认带预编译宏定义的宏定义,可以在汇编选项里重新定义一下。
2025-07-08 17:05:19
180
原创 Embedded IDE导致跳转出问题的情况,跳转定义只能搜索到声明
这个配置表示使用eide插件提供的索引,删掉然后手动配置c_cpp_properties.json就行了,不知道是不是插件更新导致的,原来导入工程没有这个东西,而且现在突然调试的target也要自己设置了。在workspace文件找一下看看有没有这个配置。
2025-07-03 16:04:31
245
原创 蓝牙BLE ATT PDU GATT的简单理解
属性这个词理解起来好像更像电量或者和心率这种有实际意义的值,实际上属性还包含很多抽象的类型(UUID),这些类型用来组成服务和特征这两个概念,服务和特征是属于GATT的,而ATT只是定义了属性格式内容和客户端/服务器的交互方式(属性协议)很遗憾我找了很久都没找到服务属性的描述,可能是网站改了到别处了。2.类型(2或16字节,怎么区分不用管后面会说):属性类型就是UUID,UUID有些特殊的值在协议里定义了用来识别属性,可以自定义。GATT是在ATT上加了服务框架的上层,定义了服务,特征,描述符的概念。
2025-07-02 11:11:04
454
原创 IIC的SDA一直是低电平或者没有数据波形
可能是因为主机意外错误导致SDA线被从机控住了,可以SCL发几个时钟过去让从机把剩下的数据发完就从机会释放SDA了,如果是单主机的强烈建议用软件去做,因为没有碰撞仲裁的没必要用硬件,硬件有很多坑。
2025-06-20 13:46:11
258
原创 Embedded IDE下载及调试
芯片名称配置的都是自动生成的,在eide.json的这里改为你jflash芯片包的设置。点旁边的小齿轮可以进去修改对应调试选项的各种设置路径,注意这几项就好。调试里也会自动生成一个cortex_debug的调试选项。我这边用jlink烧录,其他的根据你自己的来。安装cortex_debug插件。jlink路径在左下角齿轮设置里。
2025-05-29 16:21:14
308
原创 vscode的Embedded IDE创建keil项目找不到源函数或者无法跳转
里面的name是keil里工程的虚拟文件夹(只用于展现在左栏,实际文件夹不存在) 而"file":"path"是该文件真正的路径,将所有的"file":"path"添加到c_cpp_properties.json里的”configuration“:"browse":"path"数组里,没有"browse":"path"就自己建。然后再在eide.json中找到inclist,注意targets下面的那一层目录,对应着keil里面的target。打开eide.json ,找到folders,
2025-05-27 15:21:11
852
原创 cortex-debug怎么提取添加.svd文件进行外设查看
找到厂家提供的keil的pack包,改后缀成zip以压缩文件打开,把svd文件移出来,添加"svdFile"项。
2025-05-15 15:26:53
314
原创 cortex-debug无法断点,无法调试,暂停时无法定位代码段,定位代码段错误等问题可能的解决办法
arm-none-eabi-objdump -S your_firmware.elf # 检查反汇编结果是否包含源码行号。launch为下载程序后启动调试,attach为直接调试,直接调试就可能出现代码段的问题。我用的6.70c的jlink版本和1.12.1版本的cortex-debug。使用 nm -l test.elf 查看是否有符号与源码行号的关联。launch.json中cortex-debug的配置。
2025-05-15 15:14:39
527
原创 单片机代码打断点显示ffffffff dcd 0xffffffff
可能是前面的某些代码擦除了单片机这片区域的片flash导致的,擦除完就全是FF了。
2025-04-21 13:27:38
195
原创 安装完芯片包.fml后jflash能识别下载但是keil找不到相关芯片
keil的jflash和你自己装的jflash是两个独立的,参考上面连接。不过可以不用直接安装,只把jflash里的JLinkDevices.xml(选项列表文件)和你需要的驱动芯片文件夹(里面是.flm文件)复制粘贴到keil的jlink对应文件夹去。比如直接把fmsh文件夹移过keil的jflash/Devices去。
2025-03-03 19:18:26
483
原创 VSCODE添加c/c++头文件路径
这会打开一个图形化界面,并自动生成或修改。,输入头文件所在的目录路径(支持通配符。(Windows/Linux)或。(macOS),打开命令面板。(Linux/macOS)或。(例如 OpenSSL 库)
2025-02-25 14:10:53
3611
原创 linux c 读写锁pthread_rwlock
当持续不断的有新的线程获取读锁又释放,就可能会出现一个现象,因为读读允许,所有可能会很长时间一直有不同的线程正在读,这样写入线程一直无法获取到写锁,这就是写饥饿,可以通过初始化设置将该读写锁设置为:有线程在写阻塞时新的读锁获取也阻塞。这样就不会有新的线程获取读锁,等当前存在的读锁都释放后写线程就得以运行。一个线程获取了读锁,另一个线程再获取写锁时将阻塞,反之亦然。在其他线程没获取写锁时,任意数量的线程都可以获取读锁。写写互斥,读写互斥,读读允许,同线程读写死锁。//定义且初始化互斥量。
2025-02-14 14:15:53
536
原创 Linux c pthread互斥量
pthread_mutex_timedlock(&mutex) //扩展:阻塞一段时间无法获取则不再阻塞,返回超时。mutex做全局变量,不需要函数初始化,初始化等于PTHREAD_MUTEX_INITIALIZER即可。pthread_mutex_trylock() 尝试获取互斥量,无法获取不阻塞立刻返回。pthread_mutex_lock(&mutex) 获取互斥量,未获得则一直阻塞。thread_mutex_unlock(&mutex) 释放互斥量。
2025-02-13 19:59:17
230
原创 通过内网穿透ssh实现远程对家里的linux进行终端操作和编程
/.ssh 目录为ssh服务的秘钥目录,里面的authorized_keys文件即是允许登录的ssh公钥,通过cat 公钥 >> authorized_keys在当前秘钥文件authorized_keys后添加新的公钥。官网登录后在左侧"状态"栏可以看到我们的已经连接上隧道(127...是本机地址,如果是本机的windows安装我估计是本机地址处填写虚拟机的网络地址和ssh端口22,可能虚拟网卡会要修改成桥接模式)ssh连接就输入公网地址端口,虚拟机登录时的用户名和密码即可。我是ubuntu虚拟机,在。
2025-02-13 10:15:07
487
原创 linux使用有名管道mkfifo
include "sys/stat.h"//文件属性和mkfifo管道相关。mode:权限,同open O_CREAT时的第三个参数。根据代码,发送端发送end,回车后结束。建立一个可以以文件接口访问的有名管道。path:管道路径,可当一个文件看待。可以看到该管道文件已创建,类型为p。编译后打开两个终端运行这两个程序。return: -1为失败。接收的代码fifo_r.c。管道已经被unlink。发:fifo_w.c。
2024-12-08 16:02:08
489
原创 linux 进程间通信:匿名管道pipe()
输入一个2个元素的int数组地址,生成单向匿名管道,调用后该数组[0]为读取描述符,[1]为写入描述符,默认打开,使用前需要关闭另一通道,然后直接调用系统调用函数write open来进行读写。运行,分别输入10字节以上和10字节以下的数据看看。进程间内存独立且相互不可见,进程间通信需要特殊方法。匿名管道pipe()
2024-12-07 16:40:38
259
原创 linux通过fork()和execve()调用其他程序在子线程中运行
可以通过echo $PATH获取当前终端的环境,字符串格式为格式为"name=value" 和__argv类似,数组结尾必须是NULL。可以看到环境和参数都被输入到子程序中,由父程序调用,且父程序也执行了自己的程序。__path :待执行文件路径,可以通过pwd查询当前路径,再加上文件名。execve的作用为:让当前进程内容销毁大部分,重新执行一个程序。(猜想用于结束,类似于 while(argv!*__argv[] :一个由字符串指针组成的数组,编译子程序,再编译父程序,并且运行父程序。
2024-12-04 18:53:40
403
原创 linux C fork()和系统调用文件
fork()的意义是在当前进程中创建一个子进程,之后的代码在当前进程和子进程中都执行,也就是相当于执行两次,两个代码的资源相同,唯一不同的是在fork后返回的子进程号pid,看执行结果可以发现这个pid变量在子进程中为0,而在父进程中为真实的子进程号。注意到这里一个打开的文件执行了两次关闭,父进程关闭后子进程仍然能写,事实上是fd对应的结构体中有一个调用位,表明此文件有几个地方打开,父子进程都打开了,这个值为2,等父子进程都关闭该文件,该值会为0,此时才真正关闭该文件。
2024-12-01 15:25:07
383
原创 linux 文件权限,修改权限,系统调用
每一类用户的权限有3个,用二进制的每一个位表示,3位2进制也就是8进制的每一位代表一个权限。后面3*3位分别表示所有者用户,同组用户,其他用户的读(r),写(w),执行(x)权限。100 r-- 对应二进制为4。110 rw- 对应二进制为6。111 rwx 对应二进制为7。ls -l 查看当前目录文件的权限。一共有三个权限类型所以三个数字。比如777就是权限全开的意思。
2024-11-29 20:06:29
470
原创 vs编译编辑参数修改无效,按回车只会输入lf,无法更改,每次改成crlf回车就变成混合
其实是你github clone下来的的代码以前可能已经有.editorconfig强制定义过编码了,修改/删除该文件即可。
2024-11-22 08:59:24
246
原创 重新安装VMware tools为灰色,linux无法安装VMware tools
udo apt-get install open-vm-tools-desktop 即可。其实是新版vm不再自带vm tools了,自行安装即可。
2024-11-09 15:10:44
634
1
原创 VS ssh连接linux无法运行的问题 GDB 的解决方法
Unable to start debugging. Program path ... is missing or invalid. GDB failed with message:/home/zsy/projects/是一个目录。把这个将解决方案和项目放在同一目录中勾选。
2024-11-09 14:33:04
354
一个关于lwip硬件连接层low_level的问题
2022-01-26
一个关于c语言三目运算符的问题
2022-01-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅