- 博客(143)
- 资源 (2)
- 收藏
- 关注
原创 Makefile学习(四) - 自动链接依赖文件
本文介绍了如何通过修改Makefile确保.h文件内容变更时能触发重新编译。原Makefile在修改头文件后不会重新加载内容,改进方案是使用-MMD选项自动生成依赖文件(.d),并通过-include指令引入这些依赖文件。关键点包括:1)使用-MMD生成用户自定义头文件依赖;2)将-include指令放在all目标之后避免解析错误;3)依赖文件记录了源文件与头文件的关联关系。修改后的Makefile能正确感知头文件变化,解决了头文件修改不触发重新编译的问题。
2025-09-25 14:48:51
1004
原创 Makefile学习(三)- CFLAGS和LDFLAGS
摘要:Makefile中的CFLAGS和LDFLAGS分别用于控制编译和链接阶段。CFLAGS包含编译参数如-I(头文件路径)、-Wall(警告)、-O2(优化)等;LDFLAGS包含链接参数如-L(库路径)、-l(链接库)等。二者分工明确:CFLAGS处理源文件到目标文件的编译过程,LDFLAGS处理目标文件到可执行文件的链接过程。通过合理设置这些参数,可以优化构建过程,控制编译警告级别,指定依赖库路径等。文章通过具体示例演示了这些参数的使用场景和效果差异。
2025-09-19 15:12:23
1063
原创 Makefile学习(二)- 语法(变量、伪目标)
本文介绍了Makefile的核心语法规则,包括通配符%、自动变量($@、$<等)、多种变量赋值方式(=、:=、?=、+=)以及伪目标的使用。通过示例展示了如何优化编译规则,提高Makefile的简洁性和可维护性。还特别说明了all伪目标的作用,以及使用@抑制命令回显的方法。这些语法特性可以帮助开发者更高效地管理项目构建过程。
2025-09-18 17:50:45
980
原创 Makefile学习(一)- 基础规则
Makefile是自动化编译C/C++项目的工具,通过定义文件依赖关系和编译规则实现高效构建。它支持增量编译(仅重编修改文件)和统一管理编译过程,避免手动输入冗长命令。示例中展示了如何用Makefile编译a.c和b.c:先分别生成a.o和b.o,再链接成可执行文件test。修改单个源文件时,Makefile智能识别需重编的目标。默认执行首个规则目标,清除文件需显式调用"make clean"。相比直接使用gcc命令,Makefile显著提升大型项目管理效率和编译速度。
2025-09-18 15:15:23
985
原创 君正T31学习(九)- Hello World
本文介绍了在T31开发板上运行第一个"helloworld"程序的完整流程。首先讲解了交叉编译工具链(toolchain)的概念,重点分析了gcc编译器与不同C标准库(glibc和uClibc)的特性差异。通过实际操作演示了程序编写、编译(使用mips-linux-uclibc-gnu-gcc)、NFS挂载运行的全过程,并对比了glibc与uClibc编译结果的兼容性问题。文章特别指出嵌入式开发中工具链必须与目标系统C库匹配的重要性,解释了动态链接失败的原因,并提供了静态编译的解决方案(
2025-09-10 14:16:20
1044
1
原创 君正T31学习(八)- 搭建NFS
本文介绍了如何在WSL2下的Ubuntu 20.04系统中搭建NFS服务,实现与T31开发板的文件共享。主要内容包括:1)安装配置NFS服务端,创建共享目录并设置权限;2)配置WSL网络使T31能访问NFS服务;3)在T31上挂载Ubuntu共享目录进行文件传输测试。通过NFS共享,可避免频繁使用TF卡拷贝文件,提高开发效率。文中详细说明了NFS配置参数、常见问题解决方法(如rpcbind服务、nfsd模块加载等),并提供了完整的操作步骤和验证方法。
2025-09-09 13:50:19
1141
原创 配置WSL2的Ubuntu接受外部设备访问
WSL2默认采用NAT网络模式,使Ubuntu通过Windows主机访问互联网,但外部设备无法直接访问WSL2实例。本文介绍在Win10环境下为WSL2配置桥接网络的方法:1)创建网桥连接WSL与本地网卡;2)手动设置Ubuntu的静态IP与网关;3)通过脚本实现重启后自动配置固定IP。该方法解决了外部设备访问WSL2的需求,适用于NFS等应用场景。
2025-09-05 18:31:10
1551
原创 君正T31学习(7)- 启动流程
本文详细介绍了T31芯片的启动流程,从硬件上电到应用启动的全过程。系统启动分为多个阶段:首先由BootROM加载uboot,uboot初始化硬件并加载内核;内核启动后挂载system和rootfs分区,执行init进程;init进程通过inittab和rcS脚本启动系统服务和应用程序。各分区分工明确:uboot负责初始引导,tag存储启动参数,kernel提供核心功能,system和rootfs分别存放系统程序和用户数据。整个流程展现了嵌入式系统从底层硬件到上层应用的完整启动机制。
2025-09-04 17:24:19
1109
原创 君正T31学习(六)- 系统分区编译
在前面的章节中,介绍了T31的分区,这里回顾一下。分区名大小简介boot0.25M存放Bootloadertag352K存放系统启动参数kernel4M-5M存放内核镜像uImagerootfs2M-3M存放根文件系统recovery2M-2.5M存放系统资源,例如字体库、图片资源等system4512K存放配置信息等临时数据config512K存放recovery_os,用来升级设备或者恢复损坏的文件系统。
2025-09-03 11:37:17
888
原创 君正T31学习(五)- 启动卡TFTP烧录
本文详细介绍了君正T31芯片通过TF卡烧录固件的完整流程。首先需准备TF卡并格式化为FAT32格式,在WSL环境下使用fdisk工具进行分区操作。重点说明了如何将uboot固件烧录至TF卡17KB偏移处,以及如何通过启动卡烧录完整固件或分区固件(包括boot、tag、kernel等分区)。操作步骤包含进入uboot模式、清空存储、加载文件到内存、擦除并写入NorFlash等关键指令。特别强调了设备节点确认的重要性,误操作可能导致数据丢失风险。该方法适用于量产环境,解决了USB烧录可操作性低的问题。
2025-09-01 16:26:39
989
原创 ubuntu如何识别windows的USB设备(WSL2)
本文介绍了在WSL2环境下使用USB设备的解决方案。由于WSL2无法直接识别Windows下的USB设备,需要通过USB/IP工具实现共享。具体步骤包括:在Windows端安装usbipd-win工具,在Ubuntu中安装相关依赖;使用PowerShell列出并绑定目标USB设备;在Ubuntu中验证设备识别情况;使用完毕后断开连接。该方法适用于Win11或Win10 21H2以上系统,实现WSL2对USB设备的临时访问。
2025-08-29 15:30:51
641
原创 君正T31学习(四)- MT7682+VLC出图
本文介绍了使用MT7682 WiFi芯片和VLC播放器实现高效视频传输的方法。首先说明MT7682在T31系统中注册为以太网卡驱动,需通过编译指令加入其驱动并烧录固件。配置时需通过串口设置WiFi名称和密码,重启后自动联网。在T31终端加载驱动后,将carrier-server工具拷贝到TF卡并挂载执行。最后在VLC软件中输入MT7682的IP地址即可成功拉取视频流,解决了之前SD卡播放效率低的问题。
2025-08-28 17:57:27
743
原创 君正T31学习(三)-IMP库使用
本文介绍了如何验证君正芯片SDK(ISVP和Zeratul)的基本功能。重点包括:1)在sample-common.h中添加传感器宏定义(如GC2063);2)编译生成sample程序并拷贝至FAT32格式的TF卡;3)开发板挂载TF卡后运行sample-OSD程序;4)将生成的stream视频文件拷贝回PC验证,成功显示带时间戳和绿框的画面。注意事项:ISVP和Zeratul的IMP库不能混用,且需确保TF卡格式正确。
2025-08-28 15:15:32
980
原创 君正T31学习(二)- USB烧录
本文介绍了君正T31开发板的USB烧录方法。首先需要准备开发板和micro USB数据线,安装USBCloner软件并手动添加驱动。烧录时选择编译好的ZRT_CAMERA_FW.bin文件,按住bootsel按键上电开始烧录。文章还列举了常见烧录异常情况,并详细说明了如何单独烧录各个分区(如uboot、kernel等),包括分区文件选择、offset设置等注意事项。调试时可选择分区烧录以节省时间,首次生产才需全芯片烧录。
2025-08-25 10:50:14
944
原创 君正T31学习 (一) - 环境搭建
本文介绍了基于君正T31芯片的电池类IPC开发平台Zeratul的搭建与使用。首先说明了Zeratul与ISVP平台的关系,指出Zeratul是在ISVP基础上针对电池类IPC开发的扩展平台。详细介绍了SDK结构、系统分区设置及各分区功能,包括boot、kernel、rootfs等关键分区。重点讲解了交叉编译工具链的安装配置方法,包括环境变量设置和工具包解压。最后提供了完整的编译流程,包括环境设置、SOC类型选择、依赖工具安装以及固件编译步骤,并说明了分区脚本的调用关系和注意事项。
2025-08-22 16:36:59
879
原创 WSL的Ubuntu如何改名字
本文介绍了在Windows系统下修改已安装Ubuntu子系统名称的两种方法。第一种使用wsl --rename命令直接重命名,适用于较新版本的WSL(Win11或Win10 21H2以上);若版本过低,需先通过wsl --update升级。第二种方法通过导出、删除原系统后重新导入实现:先使用wsl --export备份系统为.tar文件,再用wsl --unregister删除原系统,最后用wsl --import以新名称导入。操作前需确保系统处于停止状态(wsl --terminate),修改后通过wsl
2025-08-21 16:51:25
942
原创 win10下安装WSL
WSL(Windows Subsystem for Linux)是Windows系统上运行Linux环境的解决方案,无需虚拟机。WSL2相比WSL1具有完整Linux内核和更好的性能,推荐用于嵌入式开发。安装需Windows 10/11特定版本,通过PowerShell启用功能后,可从微软商店或手动下载安装Ubuntu。WSL与Windows文件系统互通,可通过资源管理器访问Linux文件。推荐使用Windows Terminal管理多个终端窗口,提升开发效率。
2025-08-21 15:16:31
1765
原创 GCC-C语言“自定义段”
在 C 语言及相关的编译系统中,一个程序通常会被划分为多个段(Section),每个段用于存储特定类型的数据或代码。常见的段包括.text段(用于存储程序的可执行代码)、.data段(用于存储已初始化的全局变量和静态变量)、.bss段(用于存储未初始化的全局变量和静态变量)等。而自定义段则是开发者根据自身需求创建的、不属于这些标准段的段,用于存储特定的数据或代码。链接器脚本负责定义可执行文件的内存布局,需要在链接器脚本文件(通常扩展名为.ld)中对自定义段进行配置SECTIONS {/* 标准段 */
2025-04-30 14:46:53
1336
原创 使用VSCODE连接远程代码
在VSCODE的资源管理中,搜索ssh,安装Remote - SSH。安装结束后,在资源管理中会多出这样一个插件。
2025-04-27 15:39:50
1139
原创 虚拟机如何使用物理机的公私钥
使用如下指令生成生成RSA公私钥ssh-keygen生成EdDSA公私钥Windows目录linux会直接生成在当前目录下。
2024-12-12 16:37:23
673
原创 RTThread-Nano学习三-线程管理
将线程的状态更改为就绪状态,并放到相应优先级队列中等待调度。如果新启动的献策会给你优先级比当前线程优先级高,则立刻切换到高优先级线程。可以看到,任务1和任务2是在交替运行,各自运行设置的20tick时间片,运行后会进行任务切换。可以看到,任务1执行的时间变长为40tick了,而任务2还是20tick。如果使用动态创建的方式,需要在rtconfig.h中打开动态内存设置项。这里创建了两个线程,优先级相同,时间片相同,各自打印日志。这里创建两个线程,运行各自的内容。,创建任务时使用静态的方式,可以节省空间。
2024-10-19 16:04:56
1318
原创 RTThread-Nano学习一-基于MDK移植
关于RTThread-nano的介绍,这里不做过多解释,官方文档已经介绍的非常详细了,有兴趣的可以参考如下文档
2024-10-14 19:10:22
1698
原创 Windows bat脚本学习五(函数)
使用bat脚本时,经常要使用函数,而函数的传参和返回值也是非常重要的,今天就总结一下bat中函数相关的使用方法。 在Bat中,使用“:函数名”来定义一个函数。 见如下代码: 结果: 这里定义了一个名叫“end”的函数。 可以看到,虽然程序中并没有调用,但是还是执行了end函数相关的内容。这是因为bat代码是顺序执行的,就算没有调用,程序也会继续往下执行。 如果把代码改成这个样子 结果:
2024-08-30 14:12:28
2994
原创 HardFault Err,无法调试,错误定位
在平时开发的时候,经常会遇到程序报错的情况。对于来说,的方式进行定位问题。但是对于系统来时,很多MCU/SOC是的,此时,如果系统报错,我们就需要根据系统的报错信息来定位到出问题的问题点。不可在线调试,参考本文章。
2024-06-17 17:31:09
705
原创 VSCODE gcc运行多个.c文件
任务类型,有3个可选值,shell(执行shell)process(运行进程)cppbuild(C++程序编译构建)。其中前2个事VSCODE安装后即可提供的。cppbuild是安装C++扩展之后支持的。代表在什么系统上运行。
2024-05-24 16:50:37
2890
原创 C语言:__attribute__((packed)) 与 #pragma pack()
在使用结构体的时候,经常要。但是按照C语言的规则,会对不同类型的数据类型进行。有时候就会造成一些问题,如果不需要使用自动对齐的功能,就需要使用到本章的关键字。
2024-05-08 16:37:24
1250
原创 蓝牙学习九(定向广播 ADV_DIRECT_IND)
广播类型有如下:可连接的非定向广播,表示当前设备。可连接的定向广播,设备。的非定向广播,仅发送广播数据,而。设备。的,设备。即可以发送广播数据,也可以响应扫描发送回应数据,但。本章主要介绍。
2024-04-03 16:11:51
3580
原创 nRF Sniffer 在Wireshark中的使用
使用nRF Sniffer在wireshark中抓包是经常使用的。但是每次抓包会获取到,数据量非常大。而对于开发人员而言,。此时就需要掌握数据的。
2024-03-21 09:49:25
1768
1
原创 nRF Sniffer在wireshark下的环境搭建
进入nrf_sniifer_for_bluetooth--》extcap文件,按住shirft,右键,选择打开shell窗口。运行成功后,如果此时nrf sniffer插在电脑上,就可以看到sniffer的。(2).将nrf_sniffer_for_bluetooth文件夹下的extcap的一些信息。(4).将nrf_sniffer_for_bluetooth文件夹下的。而Pyserial是安装在3.7版本下的。将下载的nrf_sniffer包解压。打开wireshark的extcap文件夹。
2024-03-20 15:55:16
2767
3
原创 windows下不同python版本切换
有时候在windows环境下会安装很,但是在运行一些特定环境时,又需要特定的python版本。于是就需要。
2024-03-20 15:12:25
2705
1
原创 C语言-数组指针与指针数组
对于使用C语言开发的人来说,指针,大家都是非常熟悉的。数组,大家也同样熟悉。但是这两个组合到一起的话,很多人就开始蒙圈了。这篇文章,就详细的介绍一下这两个概念。 指针数组和数组指针,听起来非常像,但是两者是完全不同的概念。从名字上就可以知道,一个是数组,一个是指针。 那如何区分呢? 最简单的方法,就是根据语句中符号的优先级来。 优先级关系:( ) > [ ] > *。 有了这个概念后,我们再来看如下两个定义: *a[4
2024-02-23 19:39:10
2856
STM32F103ZET6 IAP串口下载
2018-05-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅