- 博客(202)
- 资源 (2)
- 收藏
- 关注
原创 优化iproute2中的tc流控规则下发机制
tc守护进程是在tc进程外面套一个壳,增加一个socket 服务端,用来接收业务程序发送的tc 配置规则。业务程序通过system方式调用tc,当并发用户量比较大时,业务进程会fork出大量tc,影响系统性能。优化的思路是用一个tc守护进程代替并发的多个tc,业务程序通过socket将配置参数发送给tc手机进程。上面的tc 是一个配置工具,本身是一个应用程序,tc后面的参数通过应用程序参数形式传递给tc工具。
2024-03-27 17:22:23 193
原创 解决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 522
原创 C语言几个比较实用的宏定义
这里介绍几个比较使用的宏,把编译时间加入到执行文件中,然后再通过日志或者printf打印出来,这样运行版本的时候就能知道编译的时间了,可以作为版本号的辅助手段。最近同事远程调试设备,为了定位问题临时发布了好几个版本,有些版本号改了有些没改,结果调试完,准备备份版本的时候,忘了哪个版本是最新的了。__FUNCTION__:打印当前函数名。__LINE__:打印当前源码所在的行。__FILE__:打印当前源码文件名。__DATE__:打印编译日期。__TIME__:打印编译时间。另外几个在调试代码时非常实用。
2024-03-14 10:22:22 444
原创 BSP-串口乱码问题
联想笔记通过UART转串口调试设备,发现出现乱码,检查串口波特率、编码等配置项都没问题,最后接上笔记本电源就正常了,估计应该和接地有关。
2024-01-22 16:02:08 378
原创 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 520
原创 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 942
原创 BSP-浅谈Linux驱动到设备模型再到设备树
1.最初Linux驱动架构 Linux驱动会在初始化函数中向内核注册file_operations结构体,结构体里面就包含一些基本的open,close函数。Linux驱动中也会去实现这些函数。并且相对应的硬件信息也在这个驱动中。以LED为例,驱动程序中会将LED的引脚地址映射成虚拟地址,然后在open函数里面进行写操作。 当APP调用open函数的时候,就会通过一系列转换,最后调用到驱动中的open函数。(这边就不具体描述APP怎么调用到驱动中的open函数)。弊端: 可以发现这
2023-06-15 10:35:50 850
原创 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 675 1
原创 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 659
原创 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 2759 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 519
原创 Redis服务启动过程中用到的几个系统函数(非常有用)
1.setlocale(LC_COLLATE,""); //地域信息设置2.tzset(); /* Populates 'timezone' global. */ //时区设置3.srand(time(NULL)^getpid());//随机数种子
2021-01-28 17:07:24 199
原创 用代码语言描述UML中两个类之间的几种关系
泛化extends子类继承父类实现implements 一种类与接口的关系,类实现接口中的方法关联成员变量,A可以是B的成员变量,B也可以是A的成员变量共享聚合成员变量,与关联的区别是,共享聚合中的成员变量可以单独使用,A是B的成员变量,A可以单独使用组合集合成员变量,组合是关联中的一种,关联可以试双向的,组合一般是单向的A组成B依赖局部变量、方法的参数或者对静态方法的调用。依赖是一种调用关系,使用的时候才会用到...
2021-01-13 16:48:29 195
原创 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 2370
原创 BITMAP几种使用场景
使用bitmap优势就是降低资源,比如将两个小于16的值存放到一个字节的高四位和低四位中,这样即节省了存储空间,通信是又节省了带宽。降低网络带宽下图第一张是IP头部结构,第二张是TCP头部,都有BIT的用法。另外bitmap还能用来做数值标记,数值标记可以用来做排序,也可以用在大数据的场景中,比如打卡、签到。排序做排序就是将待排序数列中的每个数值对应的bitmap置位,然后从bitmap的低位或者高位开始检查,如有下面一组数,将其从左向右对应到bitmap中【4、8、3、1、2、
2020-12-11 15:20:16 1660
原创 Localtime函数导致的内存泄漏及性能下降的问题
今天发现项目用C写的采集端程序性能始终跑不上去,看代码发现取时间用了localtime函数,这个函数有两个大坑:第一个坑是它返回的指针是固定的;第二个坑是它内部有个锁。第一个坑是多次调用的时候虽然指针变量不一样,但是地址一样,所以前面的调用会被最后一次调用的值给覆盖掉,但如果每次调用都是返回不同的地址那问题就更大了,会导致内存泄漏。第二个坑是在并行处理的程序中调用会存在锁等待的问题。今天就是遇到这个坑了。redis代码里面有个无锁版的localtime,换上之后问题解决void nolocks
2020-12-10 17:59:13 959
原创 Android设备导致个别蓝牙音箱死机的问题
调用MediaPlay对象播放语音时,间隔不能大于3s,否则会导致蓝牙A2DP协议频繁终端,导致个别蓝牙音响死机或者中断。
2020-12-04 16:56:26 467
原创 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 432
原创 C语言在一块共享内存上实现多个程序间共享的容器类型,如链表、HASH等操作
在单个应用程序中,hash、链表等结构通过指针来串接节点,但是在多个程序间因为地址空间不同,无法通过指针来定位。我们利用共享内存地址连续的特点,将连续的共享内存看做是一个节点数组,然后通过数组下表来定位节点。这样就能实现在多个程序间利用共享内存实现链表、HASH等数据结构。C语言实现的容器类型如链表、HASH、队列等,一般都是通过指针将多个节点链接起来。如HASH结构一般如下定义:typedef struct hash_node{ int value; struct has.
2020-11-30 16:31:38 624
原创 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 397 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 974
原创 Linux C 几种异常问题解决方法
段错误1.gdb调试https://blog.csdn.net/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 1933
原创 一种能够提升CS架构中服务端性能的方法
服务端并发处理数据目前基本都是在数据处理阶段采用并发技术,这主要有两个原因:第一,一般情况下瓶颈都卡在数据处理阶段,比如磁盘读写;第二,实现不了并发接收数据,因为服务端口,比如WEB服务80端口,只能绑定到一个socket上。对于有些使用场景,比如客户端向服务端推送大量数据包,这时候如果接收端不能并发处理可能会存在丢包丢数据的情况。为了能够实现并发接收数据,可以为服务端绑定多个服务器端口。但是标准的端口号只有一个,比如WEB服务80端口,绑定的其它扩展端口,网络中的其它客户端是不知道的,客户端只
2020-11-23 16:36:16 488
原创 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 221
原创 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 357
原创 MinGW 屏蔽命令CMD窗口
源码文件增加:#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )编译时增加--subsystem,windowsg++ -o mysql_client.exe mysql_client.c -lmysql -Wl,--subsystem,windows
2020-11-18 17:02:27 562 1
原创 C语言实现的内存池
用C语言写了个插件,在第三方服务器上跑。对方基于稳定、安全性等方面的考虑,提出了各种限制条件,其中有一个要求是程序运行期间,只允许申请一次内存空间。逼着只能自己实现一个内存池。步骤1.程序启动时申请一块内存M;步骤2.封装malloc函数,该函数实现申请的内存节点都从M内存块中划分;步骤3.封装free函数,该函数实现将内存节点还给M内存块;步骤4.为了避免内存节点碎片,释放后的小内存节点需要合并成一块。相比直接调用malloc,有下面几点优点:1.提升了性能,相对于malloc调用
2020-11-18 16:40:55 410 1
原创 Socket几种使用模式
1. socket->accept->rcv(阻塞/非阻塞)->read/write(单线程\多线程)2.socket0/socket1->select/poll/epoll->accept->rcv(阻塞/非阻塞)->read/write(单线程\多线程)3.socket0/socket1->select/poll/epoll->accept->rcv(阻塞/非阻塞)->aio_read/write...
2020-11-17 16:23:53 470
原创 Linux 进程空间地址映射(smaps)说明
00400000-00404000 r-xp 00000000 08:03 803280 //文本区,如字符串参数Size: 16 kBRss: 12 kBPss: 12 kBShared_Clean: 0 kBShared_Dirty: 0 kBPrivate_Clean: 0 kBPr...
2020-11-13 17:07:42 946
原创 软件质量相关的十一个属性
性能(Performance)性能是指系统的响应能力,即要经过多长时间才能对某个事件做出响应,或者在某段时间内系统所能处理事件的个数。可用性(Availability)可用性是系统能够正常运行的时间比例。可靠性(Reliability)可靠性是指软件系统在应用或错误面前,在意外或错误使用的情况下维持软件系统功能特性的基本能力。健壮性(Robustness)健壮性是指在处理或环境中,系统能够承受压力或变更的能力。安全性(Security)安全性是指系统向合法用户提供服务的同
2020-10-10 14:58:58 1005
基于GO语言雪花算法库
2020-11-24
DB2数据库网络协议分析报告
2020-11-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人