- 博客(207)
- 资源 (2)
- 收藏
- 关注
原创 RK3588 Linux 系统GPIO功能分析
硬件原理图中使用的是GPIO1_C4,按照RK3588的计算方法(GPIO0_C4:32 x 0(GPIO0) + 2(C) x 8 + 4(C4) = 20)去配置GPIO。上述设备树中配置了20号GPIO(RK_PC4)的用法,通过compatible = "gpio-keys";如果不在设备树中配置GPIO的用途,系统启动后在/sys/class/gpio中配置指定的GPIO。如果需要指定GPIO的用途,比如需要绑定中断,就需要额外的驱动去实现,首先在设备树中配置GPIO。
2025-05-21 13:53:30
307
原创 高云FPGA-新增输出管脚约束
在原来的代码基础上新增加一个gpio输出,绑定到25管脚上。重新打开FloorPlanner出现了新增加的约束。打开工程文件夹中的cts文件,新增gpio的绑定。
2025-05-15 14:49:30
235
原创 EDITPLUS配置CTags实现函数跳转
后续执行run ctags命令时,会在当前源码目录中产生该文件,其中*.c指定c文件产生ctags文件。执行Run Ctags后会在在源码目录中产生tags文件,配置tag对话框中选择该tags文件。解压下载的压缩包,将ctags.exe拷贝到editplust安装目录。配置EditPlus。
2025-05-10 16:32:00
163
原创 Openwrt 编译树莓派4B固件
解压img.gz文件,用树莓派镜像烧录器,将img文件烧录到sd卡中。make menuconfig 选择树莓派4B处理器。make 编译后生成img.gz文件。文件系统增加iperf3。
2025-04-21 17:02:24
285
原创 优化iproute2中的tc流控规则下发机制
tc守护进程是在tc进程外面套一个壳,增加一个socket 服务端,用来接收业务程序发送的tc 配置规则。业务程序通过system方式调用tc,当并发用户量比较大时,业务进程会fork出大量tc,影响系统性能。优化的思路是用一个tc守护进程代替并发的多个tc,业务程序通过socket将配置参数发送给tc手机进程。上面的tc 是一个配置工具,本身是一个应用程序,tc后面的参数通过应用程序参数形式传递给tc工具。
2024-03-27 17:22:23
285
原创 解决linux系统网卡加载慢的问题
第一步先确认是不是第一时间挂载到PCI总线上了,在ath10k_pci_probe函数中添加调试信息,另外查看/sys/bus/pci/drivers/ath10k_pci/确认系统启动后已经识别到PCI设备。这个阻塞时间可以通过/sys/class/firmware/timeout设置,开发板默认用的是60s,总共有5个bin文件,所以阻塞了5分钟左右的时间。方法1,查看源码发现网卡firmware,没有添加到指定的路径中,所以没有找到固件。方法2,有阻塞和非阻塞方式,目前开发板默认用的阻塞模式。
2024-03-20 17:21:19
824
原创 C语言几个比较实用的宏定义
这里介绍几个比较使用的宏,把编译时间加入到执行文件中,然后再通过日志或者printf打印出来,这样运行版本的时候就能知道编译的时间了,可以作为版本号的辅助手段。最近同事远程调试设备,为了定位问题临时发布了好几个版本,有些版本号改了有些没改,结果调试完,准备备份版本的时候,忘了哪个版本是最新的了。__FUNCTION__:打印当前函数名。__LINE__:打印当前源码所在的行。__FILE__:打印当前源码文件名。__DATE__:打印编译日期。__TIME__:打印编译时间。另外几个在调试代码时非常实用。
2024-03-14 10:22:22
647
原创 BSP-串口乱码问题
联想笔记通过UART转串口调试设备,发现出现乱码,检查串口波特率、编码等配置项都没问题,最后接上笔记本电源就正常了,估计应该和接地有关。
2024-01-22 16:02:08
417
原创 xilinx平台如何确认EMIO GPIO序号
MIO GPIO 序号是0-53,所以EMIO GPIO 基础序号是54,W_o_lcd[0]中的0代表EMIO GPIO的序号,所以LCD_RESET的GPIO序号即为54+0.vivado工程文件中找到管脚约束文件XDC,在xdc文件中找到A3引脚对应的变量O_LCD_RESET。在.v源码文件中找到变量O_LCD_RESET定义的地方。确认原理图中LCD_RESET对应的引脚。
2024-01-17 08:58:08
655
原创 BSP-设备树
/sys/firmware/devicetree/base里面是以目录结构呈现设备树,base是设备树根节点/sys/firmware/fdt 原始dtb文件/proc/device-tree -> /sys/firmware/devicetree/base 链接 文件 指向设备树内核中设备树信息linux-xlnx\Documentation\devicetree\bindings设备树加载之后,内核会自动把设备树节点转换成 platform_device这种格式,同时把名字放到of_node这个地
2023-06-15 10:37:46
1232
原创 BSP-浅谈Linux驱动到设备模型再到设备树
1.最初Linux驱动架构 Linux驱动会在初始化函数中向内核注册file_operations结构体,结构体里面就包含一些基本的open,close函数。Linux驱动中也会去实现这些函数。并且相对应的硬件信息也在这个驱动中。以LED为例,驱动程序中会将LED的引脚地址映射成虚拟地址,然后在open函数里面进行写操作。 当APP调用open函数的时候,就会通过一系列转换,最后调用到驱动中的open函数。(这边就不具体描述APP怎么调用到驱动中的open函数)。弊端: 可以发现这
2023-06-15 10:35:50
1003
原创 Xilinx BSP开发流程
1.打开vivido工程中的xpr文件2.生成bit文件Flow->Generate Bitstream3.接仿真器,找到设备PROGRAM AND DEBUG->Open hardware Manage4.烧录选中hardware中的7z020芯片右击,选择Programe Device 选择bit文件目录点击Program 烧录,烧录成功LED灯亮了...
2022-07-05 15:38:21
880
原创 Vim开发环境搭建
目录基本配置函数跳转函数预览拷贝、复制选中分屏sudo vi /etc/vim/vimrc显示行数:set nusudo apt-get install exuberant-ctags代码目录中执行:ctags -R光标指向指定的函数后ctrl+] 跳转到函数定义之处,ctrl+t 返回原处:ptag write_char:pclosev + y + pShift + *1,输入命令tmux使用工具2,上下分屏:ctrl + b 再按 "3,左右分屏:ctrl + b 再按 %4,左右分屏:ctrl +
2022-06-23 17:36:49
711
原创 Vivado 生成BOOT.BIN
1 创建fsbl打开xilinx SDKFile->New->Application ProjectFinish后,系统编译在工程目录的DEBUG文件夹下生成elf文件2 合成BOOTBIN文件SDK菜单选择Xilinx->Create Boot ImageADD 添加要合并的文件,第一个是fsbl的elf文件,Partition type 为bootloader,后面几个文件按顺序分别是.bit u-boot.elf,Partition type都是datafile...
2022-06-14 15:25:59
3298
2
原创 python+wget快速搭建文件下载环境
1.在工作目录中创建一个待下载文件a.gz2.python搭建一个http serverpython -m http.server3.wget http://192.168.31.133:8000/a.gz
2021-04-26 19:27:06
575
原创 Redis服务启动过程中用到的几个系统函数(非常有用)
1.setlocale(LC_COLLATE,""); //地域信息设置2.tzset(); /* Populates 'timezone' global. */ //时区设置3.srand(time(NULL)^getpid());//随机数种子
2021-01-28 17:07:24
234
原创 用代码语言描述UML中两个类之间的几种关系
泛化extends子类继承父类实现implements 一种类与接口的关系,类实现接口中的方法关联成员变量,A可以是B的成员变量,B也可以是A的成员变量共享聚合成员变量,与关联的区别是,共享聚合中的成员变量可以单独使用,A是B的成员变量,A可以单独使用组合集合成员变量,组合是关联中的一种,关联可以试双向的,组合一般是单向的A组成B依赖局部变量、方法的参数或者对静态方法的调用。依赖是一种调用关系,使用的时候才会用到...
2021-01-13 16:48:29
236
原创 Redis 定时处理机制实现流程
int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) /* Types and data structures */typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);typedef int aeTimeProc(struct aeEventL...
2020-12-17 14:40:28
2568
原创 BITMAP几种使用场景
使用bitmap优势就是降低资源,比如将两个小于16的值存放到一个字节的高四位和低四位中,这样即节省了存储空间,通信是又节省了带宽。降低网络带宽下图第一张是IP头部结构,第二张是TCP头部,都有BIT的用法。另外bitmap还能用来做数值标记,数值标记可以用来做排序,也可以用在大数据的场景中,比如打卡、签到。排序做排序就是将待排序数列中的每个数值对应的bitmap置位,然后从bitmap的低位或者高位开始检查,如有下面一组数,将其从左向右对应到bitmap中【4、8、3、1、2、
2020-12-11 15:20:16
1774
原创 Localtime函数导致的内存泄漏及性能下降的问题
今天发现项目用C写的采集端程序性能始终跑不上去,看代码发现取时间用了localtime函数,这个函数有两个大坑:第一个坑是它返回的指针是固定的;第二个坑是它内部有个锁。第一个坑是多次调用的时候虽然指针变量不一样,但是地址一样,所以前面的调用会被最后一次调用的值给覆盖掉,但如果每次调用都是返回不同的地址那问题就更大了,会导致内存泄漏。第二个坑是在并行处理的程序中调用会存在锁等待的问题。今天就是遇到这个坑了。redis代码里面有个无锁版的localtime,换上之后问题解决void nolocks
2020-12-10 17:59:13
1221
原创 Android设备导致个别蓝牙音箱死机的问题
调用MediaPlay对象播放语音时,间隔不能大于3s,否则会导致蓝牙A2DP协议频繁终端,导致个别蓝牙音响死机或者中断。
2020-12-04 16:56:26
531
原创 Android 系统启动入口
启动入口文件system\core\init\init.c当Android系统启动时候,会解析init.rc文件,然后根据里面的定义,启动各种服务,如netd、zygote、servier_manager等等init.rc中对服务做了分类,在service section里面有一个’class’标签,指明了该服务所属的类。如:service surfaceflinger /system/bin/surfaceflinger class core //所属类为‘core’ u...
2020-12-04 16:26:59
482
原创 C语言在一块共享内存上实现多个程序间共享的容器类型,如链表、HASH等操作
在单个应用程序中,hash、链表等结构通过指针来串接节点,但是在多个程序间因为地址空间不同,无法通过指针来定位。我们利用共享内存地址连续的特点,将连续的共享内存看做是一个节点数组,然后通过数组下表来定位节点。这样就能实现在多个程序间利用共享内存实现链表、HASH等数据结构。C语言实现的容器类型如链表、HASH、队列等,一般都是通过指针将多个节点链接起来。如HASH结构一般如下定义:typedef struct hash_node{ int value; struct has.
2020-11-30 16:31:38
696
原创 C语言实现的通用链表
大部分C实现的链表(包括教材上的实例)都是将链表结构和链表节点的值写在同一个结构体中,如下typedef struct mlist_node{ int value; struct mlist_node *next; struct mlist_node *prev;}mlist_node_t;很显然这样代码无法通用性,换一个功能value可能就是char或者结构类型了。为了实现通用性,节点可以这样定义,将节点的value定义成指针类型,他可以指向任意值typed
2020-11-25 15:42:32
442
1
原创 linux基础之-sysrq-trigger
1.立即重新启动计算机echo "b" > /proc/sysrq-trigger2.立即关闭计算机echo "o" > /proc/sysrq-trigger3.导出内存分配的信息echo "m" > /proc/sysrq-trigger4.导出当前CPU寄存器信息和标志位的信息echo "p" > /proc/sysrq-trigger5.导出线程状态信息echo "t" > /proc/sysrq-trigger6.故意让系统崩溃echo
2020-11-25 14:19:11
1041
原创 Linux C 几种异常问题解决方法
段错误1.gdb调试https://blog.youkuaiyun.com/oria_2006/article/details/80982704?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160612186719725225060985%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160612186719725
2020-11-24 09:07:59
2009
原创 一种能够提升CS架构中服务端性能的方法
服务端并发处理数据目前基本都是在数据处理阶段采用并发技术,这主要有两个原因:第一,一般情况下瓶颈都卡在数据处理阶段,比如磁盘读写;第二,实现不了并发接收数据,因为服务端口,比如WEB服务80端口,只能绑定到一个socket上。对于有些使用场景,比如客户端向服务端推送大量数据包,这时候如果接收端不能并发处理可能会存在丢包丢数据的情况。为了能够实现并发接收数据,可以为服务端绑定多个服务器端口。但是标准的端口号只有一个,比如WEB服务80端口,绑定的其它扩展端口,网络中的其它客户端是不知道的,客户端只
2020-11-23 16:36:16
572
原创 Socket 安全读和写(read/write)
接手的一个小程序,因为原本已经在线上运行了一段时间,本着能不动就不动的原则,没有调整源码。但是看到源码中读写还是直接调用的read和write的,还是忍不住把这块改了int myRead(int fd, char *buf, int count){ ssize_t nread, totlen = 0; while(totlen != count) { nread = read(fd,buf,count-totlen); if (nread == 0)
2020-11-23 16:22:21
268
原创 Socket KeepAlive问题
最近接手的一个C/S架构的小程序,据说一直有个小问题:运行一段时间后三个socket中的一个就无法send数据,PRE环境正常,PRD环境才会出现该问题。前两天又被我遇到了,看了一下代码send的时候对链接状态都做了判断,看了socket状态也是ESTABLISHED。分析原因可能是该socket长时间没数据,然后中间设备超时导致的。增加keepalive验证了几天,就没再出现问题。keepalive代码直接用的redis中的源码:/* Set TCP keep alive option
2020-11-19 16:15:31
417
DB2数据库网络协议分析报告
2020-11-24
基于GO语言雪花算法库
2020-11-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人