- 博客(238)
- 资源 (5)
- 问答 (1)
- 收藏
- 关注
原创 RK3568 OH5.1 编译运行程序hellworld
代码根目录创建sample子系统文件夹在子系统目录下创建hello部件文件夹hello文件夹中创建hello源码目录及源码构建文件BUILD.gn及部件配置文件bundle.json。修改子系统配置文件添加自定义的sample子系统修改产品配置文件在产品选中加入自定义的子系统。
2025-05-30 09:46:44
296
原创 RK3568 OH5.1 解决调试串口输入乱码问题
解决办法:降低波特率,修改fiq-debugger设备树节点的rockchip,baudrate属性,将其改成115200。编译烧录,问题解决。
2025-05-28 09:16:19
289
原创 RK3568 OH5.1 镜像烧录
烧录失败,提示超过Flash大小,因为用的板子ROM只有8G,修改paramer.tx文件中userdata分区起始地址。userdata的起始地址已经超过了8G。
2025-05-27 15:33:03
239
原创 RK3568 OH5.1 源码编译及问题
安装编译器和二进制工具安装编译器和二进制工具在源码根目录下执行prebuilts脚本,安装编译器及二进制工具。使用build.sh脚本编译源码进入源码根目录,执行如下命令进行版本编译。说明:{product_name}为当前支持的产品名称,例如Hi3516DV300、rk3568等。编译所生成的文件都归档在目录下,结果镜像输出在目录下。使用hb编译执行hb set选择产品,然后执行hb build进行编译。编译。
2025-05-20 18:44:52
998
原创 RK3568 OH5.1 搭建环境及源码获取
若您使用的是Ubuntu20及以上版本,由于gcc-multilib和gcc-arm-linux-gnueabi互斥,请勿安装gcc-arm-linux-gnueabi。官方说推荐repo+ssh方式下载源码,我个人推荐站点下载,repo方式下载断断续续,下载源码过程老是出现各种错误啥。以上安装命令适用于Ubuntu18.04,其他版本请根据安装包名称采用对应的安装命令。从版本分支获取源码。可获取该版本分支的最新源码,包括版本发布后在该分支的合入。可获取该版本分支的最新源码,包括版本发布后在该分支的合入。
2025-05-20 18:42:26
902
原创 initramfs使用及bootargs(cmdline)配置
initramfs可以用busybox来制作。rdinit是一个脚本程序,可以是其他名字,不一定非得叫rdinit。脚本中内容可以自定义。此脚本先挂载了2个分区,做升级操作,然后切换到切换到真正的根文件系统。initramfs作为临时文件系统,最后肯定要切换到真正的根文件系统。
2025-05-15 11:32:43
457
原创 sshpass scp失败问题记录
当输入 “yes” 时,SSH 客户端会将该主机的公钥添加到known_hosts 文件中,这样以后连接时就不会再显示这个警告了。以前无法拷贝也是跟着提示执行ssh-keygen -f “/home/xgj/.ssh/known_hosts” -R “192.169.5.169”,在执行该语句后执行脚本还是出现sshpass scp传输文件失败问题。主机身份已知,由于第一次执行时您已经确认了主机身份,并将其添加到了 known_hosts 文件中,因此第二次执行时 SSH 客户端不再提示确认。
2024-11-01 23:44:38
417
原创 getopt_long使用详解及实例
getopt_long 是一个在 Linux 和类 Unix 系统中常用的函数,用于解析命令行参数。它支持短选项(如 -a)和长选项(如 --long-option),并且能够处理带有参数的选项。以下是 getopt_long 的详细使用方法返回值如果遇到有效的短选项或长选项,getopt_long 返回该选项的字符(对于短选项)或 val(对于长选项)。如果所有选项都已处理完毕,返回 -1。如何得带参选项的参数值。
2024-10-14 16:09:35
624
原创 Git存储库添加空目录-添加占位文件
Git本身并不会跟踪和管理空目录,它只会记录和管理文件的变化。因此,在操作空目录时,我们需要借助一些技巧来实现我们的需求。文件或添加一个占位文件,我们可以欺骗Git,并使其将空目录作为一个有效的项目组成部分进行跟踪和管理。
2024-08-22 19:53:19
522
原创 RK3568 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,6)
按独立分区镜像方式烧录RK3568镜像后系统能正常运行,如下图所示通过RK官方工具打包成update.img,如下图,烧录后系统卡住进不了命令行终端和出现Kernel panic问题。
2024-08-21 16:39:29
1039
4
原创 microcom串口调试工具使用
microcom是一个在终端中使用的串口助手,类似平常使用SSCOM一样的东西,不过是在终端中使用而已。使用的是busybox构建的文件系统-d :表示延时时间。-t :表示超时时间,超多少时间就自动退出(单位为 ms)。-s :表示传输速度,波特率的意思,这个根据自己的情况而定。-X :从 stdin 禁用 NUL 和 Ctrl-X 的特殊含义。
2023-10-20 20:09:22
3383
原创 iperf3: error - unable to connect to server: No route to host 但嵌入式Linux设备
不精通网络以及iperf3让我不得不求助百度必应,但搜出来千篇一律都是说的防火墙问题,但嵌入式设备Linux系统没有防火墙。因为脚本里设置的WIFI的IP地址是一样,抱着试一试的心态修改了IP地址,一测试可以了。导致换了一台设备用同样的IP地址无法连接AP?用STA模式的设备去连接AP模式的设备才能产生40MH带宽。来测试没问题了,要换一台设备做STA设备。需要一台设备WIFI 设置为STA模式。起初用了一台设备做STA模式设备。做测试没有问题,能正常连上AP。一台设备WIFI设置为AP模式。
2023-09-24 09:40:31
1406
原创 IAR目标代码4字节对齐
利用编译器一般定义数据变量都是4字节对齐的原理,当生成的目标代码是奇数字节,这时候就不是4字节对齐,当给目标代码最后加入一个4字节对齐的变量时,按照4字节对齐原理,最后的奇数字节后面的位置就被空出来达到4字节对齐的目的。如上图所示,在最后强加4字节后,n+1这个字节就会空出来将前面的本来的奇数字节补齐成4字节。是IAR的扩展关键字,强制编译,保证没有使用的函数或者变量也能够包含在目标代码中。无论最后是奇数是1个字节、2个字节、3个字节都是一样的,这里画演示图用3个字节。
2023-08-10 12:10:44
1650
1
原创 控制器收不到工位板的状态数据包问题(RS422)排查解决
如下图通信框图所示,控制器工位板程序通过RS422和控制器(类似网关)通信,控制器在将数据转发给Linux应用程序。一开始设备装好,整个通信是没有任何问题的。然后在很久之后,负责Linux应用开发的同事就向我们反馈问题说收不到工位板程序发送的状态包。这就很奇怪了,一开始都是好好的。
2023-08-04 09:15:20
805
原创 Linux应用程序等待工位板指令应答超时500ms左右才等到应答问题(LwIP)定位排查
从物理层面检测出现超时500ms时的控制指令和应答信号之间的时间间隔:使用逻辑分析抓取两条指令的时间间隔,发现接收到控制指令到缴费机工位板发出应答300us左右。应用程序控制缴费机工位板的指令和缴费机回复应答的时间之间不能超过500ms, 但是搞Linux应用同事测试一段时间就会出现应答发送超时的问题。控制指令数据接收和应答数据的发送都要经过控制器(类似网关)的转发,所以判断应答是控制器转发协议出现了延时。检查控制打印的出问题时间控制指令和应答的时间间隔发现控制器的发送也不存在超时500ms左右。
2023-08-03 14:02:43
477
原创 LwIP以太网在初始化过程中卡死整个程序的问题排查解决
在将程序优化等级改为不优化才很容易测出来hardfault问题,而在有优化的时候的,编译器可能优化了代码不容易出现问题,所以调试程序问题最好还是将优化等改为不优化,才更容易发现问题。
2023-08-02 09:52:34
2358
原创 LwIP RAW API TCP服务端客户端编程及问题
在测试过程中出现客户端连接上后又断开,一直在反复重连,调试很久一段时间发现是有因为没有。客户端应用程序主动调用tcp_close()终止一个TCP连接。用于服务端程序,在接收连接前必须让TCP处于监听状态。当TCP连接成功connected回调函数就会被调用。将本地的 IP 地址、端口号与一个控制块进行绑定。所以数据的处理和应用程序编写就在该回调函数中实现。TCP客户端使用该函数主动发起连接。用于服务端,处理客户端连接。客户端编程就比较简单了。
2023-06-29 13:52:41
4110
1
原创 LwIP RAW API 实现UDP多播收发
LwIP RAW API 实现UDP多播收发实现1、初始化static struct udp_pcb *multicast_pcb = NULL;static ip_addr_t mutlcast_send_ip;static ip_addr_t mutlcast_recv_ip;static void udp_recv_multicast(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16
2023-06-17 16:40:42
4033
1
原创 移远通信笔试题
B)a=b=c+1;选项 A 是错误的,因为 b = 4 的结果是 4 ,所以 a =(b = 4) = 3 等价于 a = 3 和 b = 4 ,但是在 C 语言中,赋值操作返回被赋的值,因此(b = 4) 的结果是 4。然后再将 4 赋值给 b,使得 b 的值变成了 4。这时候再把 b = 4 和 a = 3 再进行一次赋值运算,就等价于(4 = 3) ,由于左值必须是可修改的,因此会产生一个编译错误。
2023-04-21 11:55:42
3719
1
原创 NV040C语音芯片驱动调试
误以为所有地址都有声音,所以随便选择了一个地址进行调试,调试大半天都没有声音,误以为是时序问题调试了好久。后面发现是地址没有声音数据的。对于此次使用的芯片只定制了最开始的6个地址有声音,所以地址0x06及以上的都是没有声音的。动力系统项目定制的只有声音地址0x00~0x05有声音,分别对应不同报警等级。芯片某个声音地址是否有声音取决用户是否和厂家联系定制。芯片声音地址0x00-0xDF不是每个地址都有声音。
2023-02-08 11:46:39
1353
原创 RTOS多任务切换实现
* `r0、r2、r3、r12`等寄存器的值中断触发会由自动保存。* `STMDB sp!, { lr }` , 在调用`SysTick_IRQ`函数前保存LR,LR此时是个特殊值,后续通过其触发硬件自动恢复自动恢复`r0、r2、r3、r12`等寄存器的值。为什么要保存LR?因为`SysTick_IRQ`是C函数,C函数调用会破坏原来的LR值。* `Thread_Switch_Context` 函数传入LR值,此时lr值是个特殊值,通过BX r1 触发硬件自动恢复r0、r2、r3、r12等寄存器的值。
2022-12-21 17:19:50
1518
原创 ThreadX笔记
任务优先级,数值越小优先级越高该函数需要用户自己定义,ThreadX启动会自动调用该函数,用户可以在该函数中创建自己的任务。first_unused_memory,未使用的地址空间,方便用户创建自己的动态内存管理。ThreadX提供了给用户创建内存池、内存块等进行动态内存分配的功能。3、ThreadX系统没有定义空闲线程如需要空闲线程需要用户自己定义ThreadX内核没有空闲任务,那么没有任务执行的时候它都在干什么:ports/cortex_m4/gnu/src/tx_thread_sch
2022-12-06 13:42:29
1708
原创 Vscode顶部显示搜索框和前进后退箭头键位
平常都是用快捷键进行前进、后退 & 搜索,有时候只想按用鼠标点击,所以希望显示搜索框和前进后退按钮这些。如图效果:在顶部栏显示搜索框和前进后退箭头键位。顶部栏空白地方右键,勾选。
2022-11-30 15:44:10
10517
2
原创 arm-none-eabi-gcc编译RT-Thread nano STM32F429工程出现的问题
总结来说就是bin文件时按照地址信息顺序生成代码段和可加载数据段的文件,自定义的SDRAM段默认属性时LOAD,也就是可加载的。程序链接时将该段人为可加载的数据段链接进程序造成bin文件特别大。所以修改段的默认属性为NOLOAD(} > SDRAM。
2022-09-20 14:30:15
796
原创 采用arm-none-eabi-gcc交叉编译工具链 以及使用xmake构建 STM32 RT-Thread nano工程 笔记
xmake.lua 如果是其他工程拷贝过来的,可以删除.xmake文件夹和build文件夹,或者执行`xmake f -c`强制清除配置缓存,主要是.xmake缓存了上一个工程的配置信息等,会编译失
2022-09-19 19:33:55
2158
1
原创 使用xmake配合arm-none-eabi-gcc构建stm32工程
使用这种方式开发适用于所有Cortex-M的芯片,不必受限于某个芯片的专用IDE,如STM32CubeIDE只能用于STM32。所用涉及的软件全为开源免费的软件。不用编写修改Makefile,构建项目容易。可以使用任意编辑器,可以是Vscode、source insight,甚至是记事本。推荐使用Vscode,Vscode内就可以打开终端执行编译,用其他编辑器可能就要另外打开powershell或bash之类的进行编译了。由于MDK armcc工具针对性做了优化,编译出来的代码尺寸相对较小;
2022-08-20 15:25:37
3021
2
原创 lvgl v8 linux下使用xmake交叉编译移植
针对linux移植lvgl官方已经提供了移植工程,只需要根据自己板子修改frambuffer的设备节点和设备节点。1、下载移植工程源码下载下来发现lv_drivers和lvgl目录是空的,对于这个问题直接去lvgl github仓库那里。...............
2022-08-13 18:39:12
1990
原创 从0写bootloader — Bootloader重定位APP
一般情况下,不会采用APP重定位自己。假如APP程序存放在外接的SPIFlash或者SD卡上,SPIFlash和SD卡是不支持XIP的,APP代码无法执行,重定位代码也是APP代码的一部分,何谈重定位自己。此时就需要要采用Bootloader重定位APP的策略了。Bootloader重定位APP程序需要知道APP的加载地址和链接地址,但是Bootloader程序和APP一般在是不同Project的程序,无法直接得到加载地址和链接地址。...
2022-07-18 23:48:17
506
原创 从0写bootloader —— APP自重定位
使用的IDE为MDK。散列文件:Bootloader程序:APP程序:,打印数据为乱码,因为buf是全局变量,属于数据段,它的加载地址则是FLASH上,散列文件定义的数据段链接地址是 ,数据段的加载地址和链接不一致,所以需要重定位,而bootloader和APP都没有做重定位,所以打印出来是乱码。修改APP实现重定位数据段和清除BSS段: 在调用xmain之前重定位数据段 在调用xmain之前清除BSS段APP自我复制所有段实现重定位修改散列文件如下:加载地址是0x800
2022-07-13 20:35:47
442
原创 从0写bootloader — 最简单的bootloader和App
对于空间划分是人为定义的。启动文件start.s:最简单的启动,暂时不使用中断向量。如果是通过MDK设置链接地址,不勾选(不使用Target对话框的内存布局)遇到的问题:必须到导出中断向量全局可见,不然程序无法启动:链接地址通过散列文件指定: 这是创建工程默认创建的散列文件usart.c: 只使用串口打印简单的信息main.c:烧录程序上电运行,打印信息:bootloader正常运行。从自定义划分的地址看,APP开始的地址是这里为什么跳转使用的是呢?原因是STM32是Cortex-M
2022-07-09 20:12:51
1980
原创 从0写bootloader — bootoader功能知识
启动其他程序:对于单片机程序,一般不需要用Bootloader,直接就能运行APP。为什么还需要bootloader?当RAM、Flash比较小时,一般APP就在Flash烧写的地方执行,这种叫做,。APP程序去更新自己程序,那就把升级程序给覆盖,APP都执行不了了,升级失败,这种方式无法实现。当RAM比较大,可以将APP全部拷贝到RAM中执行,此时更新程序就会覆写Flash上的程序员,APP依然可以运行,但是一旦系统断电或者其他原因导致升级失败,系统复位重新上电后Flash中就没有程序可以拷贝到RAM
2022-07-09 20:11:25
1088
原创 lvgl v8 obj支持滚动但不显示滚动条以及禁用滚动条
从lvgl v8版本开始,lvgl的obj默认开启了滚动条。对于滚动条一般有三种需求:第2种obj实现: 禁用滚动条第3种obj实现:
2022-07-05 10:21:48
11211
10
原创 RTOS 多线程下hardfault问题总结
使用minIni以INI文件形式保存系统参数到littlefs多线程下读写导致的hardfault问题0、通过RT-Thread自定义hardfault处理函数打印hardfault信息,发现hardfault发生在lvgl gui线程;1、通过调试器将hardfault打印的lr寄存器地址减去5回溯地址找到发生hardfault的语句为STM32 HAL库的SPI 传输函数,按道理库函数应该没问题,无法理解2、想到hardfault问题多是指针越界或堆栈溢出导致的,增大lvgl GUI线程堆栈,再次调试发
2022-06-24 16:17:45
778
原创 minIni移植到littlefs
minIni 是一个用于读取和写入 INI 文件的库。github :https://github.com/compuphase/minIniminIni特点:1、minIni 大约是 950 行代码 (包括注释),是一个真正的 “迷你” INI 文件解析器,非常容易移植到各种嵌入式平台。2、minIni 不需要标准 C/C++ 库中的 文件 I/O 函数,且允许通过宏配置要选择文件 I/O 接口。3、minIni 仅使用 stack ,完全不使用动态内存(malloc)。有 C++ binding,
2022-06-10 12:14:11
797
2
原创 linux线程间通信支持阻塞的消息队列实现
消息队列消息队列实现并不难。消息队列主要有两种实现方式:数组实现和链表实现。此处采用链表实现。由于实现并不能难,重写浪费时间,直接参考别人的就好了。Linux下消息队列实现Linux下的线程通信没有像RTOS下支持阻塞的消息队列。想要支持阻塞的消息队列就要自己实现了。实现可阻塞的消息队列需要用到pthread中的条件变量(pthread_cond_t )和互斥锁(pthread_mutex_t )。数据结构#define LIN_MSG_MAX_LEN 4096 /* max
2022-05-26 22:40:41
1112
原创 ThreadX Levelx的移植和使用(nor flash)
LevelXAzure RTOS也就是ThreadX。Azure RTOS LevelX 向嵌入式应用程序提供 NAND 和 NOR 闪存提供实现磨损均衡的手段。由于NAND和NOR闪存都只能进行有限次数的擦除,均衡分配闪存的使用至关重要,这通常被称为磨损均衡,通过LevelX实现。这段话来自 Azure RTOS LevelX 用户手册。可以知道 Azure RTOS通过LevelX组件实现对NAND和NOR两种flash实现磨损平衡,LevelX组件只是一个组件,与任何硬件、文件系统
2022-05-07 10:40:13
3377
9
打包好的SimpleGUI单色点阵取模工具,不需要自己编译源码
2023-07-11
SimpleGUI精简字库的工具MinimumFontLib
2023-07-08
基于事件的单片机程序
2020-03-01
Vscode注释个别乱码
2023-02-21
vscode宏定义跳转层级不对的问题怎么解决?
2022-04-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人