编辑
2025-03-03
记录知识
0

一、使用惯例

1.1 使用QTimer实例实现可重复定时器

#include <QTimer> #include <QCoreApplication> #include <QDebug> int main(int argc, char** argv) { QCoreApplication app(argc, argv); //创建事件循环,用于分发QTimerEvent超时事件 auto timer = new QTimer; //新建定时器 //以QT信号-槽方式设置超时回调函数,这里槽的为lambda函数 QObject::connect(timer, &QTimer::timeout, [timer] () { static int cnt = 0; //定时器重复次数 cnt++; qDebug() << "当前定时器超时/重复时间(豪秒):" << timer->interval(); if(cnt > 4) timer->stop(); //停止计时器 }); timer->start(1000); //启动定时器,超时时间1000毫秒 return app.exec(); //进入事件循环,分发处理超时事件 }

1.2 使用QTimer::singleShot实现一次性定时器

#include <QTimer> #include <QCoreApplication> #include <QDebug> int main(int argc, char** argv) { QCoreApplication app(argc, argv); //创建事件循环 //创建一次性定时器,超时时间2000毫秒,并指定超时回调函数(lambda匿名函数) QTimer::singleShot(2000, [](){ qDebug() << "SingleTimer timeout!!"; }); app.exec(); //进入事件循环 return 0; }

二、QTimer注意事项

2.1 只能在QTimer所属线程中启动(thread() == QThread::currentThread())

2.2 在启动时QTimer所属线程必须具备事件循环(d->threadData->hasEventDispatcher())

主线程:在构建QCoreApplication对象之后

副线程:执行QThread::start完并进入run函数之后(此时线程才真正创建完成)

2.3 QTimer所属线程进入事件循环后才能触发超时信号。

主线程:执行QCoreApplication::exec

副线程:执行QThread::exec

三、 QTimer基本原理

借助QTimerEvent事件实现,当启动(QTimer::start)一个定时器时Qt调用底层操作系统接口注册一个定时器给当前线程,当线程接收到超时信号时会构造一个QTimerEvent事件发送会给QTimer对象,QTimer接收到该事件后会调用QObject::timerEvent函数,QTimer类通过覆盖(override)该虚函数,触发QTimer::timeout信号。

四、QTimer实现源码

https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qtimer.cpp.html
编辑
2025-03-03
记录知识
0

一、工具简介

Qt 提供了一个打包工具,叫做 deployqt,可以将应用程序所依赖的库文件都提取出来。在 Windows 系统叫 windeployqt,在 Linux 系统叫 linuxdeployqt,在 Mac 下叫 macdeployqt。

二、linuxdeployqt 源码下载与编译

2.1 源码下载地址 :

git clone https://github.com/probonopd/linuxdeployqt.git

2.2 Qt环境:

本工程在172.25.130.130服务器chroot环境下,Qt环境是配好的,因此这里不需要配置Qt的环境变量。

image.png

2.3 安装patchelf

sudo apt install patchelf

该工具的作用:patchelf是一个用于修改ELF(可执行和链接格式)二进制文件的工具。它可以更改二进制文件中的符号表、动态段、程序头等部分,以便在运行时重新定位或修改它们。这对于动态库加载、插件系统和其他需要自定义运行时行为的场景非常有用。

工程中使用如下:

image.png

2.4 源码编译:

linuxdeployqt/main.cpp 去掉glibc判断

image.png

  • linuxdeployqt/share.cpp中修改变量copyCopyrightFiles 默认值为false
  • bool copyCopyrightFiles = false;//不拷贝版权文件

进入工程目录下:

image.png

因为这是qt工程,我们可以qmake 生成makefile 文件 ,再make编译(网上有使用cmake教程,其实大可不必)

编译有报错:

image.png

可以把这些打印全注掉,make clean&& make。

编译完成,把这个可执行文件扔进/usr/local/bin目录,这样,我们就可以在其他目录访问了。

通过命令查看可执行程序的信息:

image.png

2.5 工具的使用:

在需要打包的文件夹下执行 linuxdeployqt xxx(应用程序名)-bundle-non-qt-libs即可。

三、制作成deb包

这里可以参考新人文档如何使用编译deb包。

编辑
2025-03-03
记录知识
0

在网络负载非常重的情况下,对于文件服务器、高流量Web服务器这样的应用来说,把不同的网卡IRQ均衡地绑定到不同的CPU核心上,将会减轻单个CPU的负担,提高多CPU、多核心的整体处理中断的能力。对于数据库服务器这样的应用来说,把磁盘控制器绑到一个CPU核心,把网卡绑定到另一个CPU核心上,将会提高数据库的响应时间,达到优化性能的目的。合理地根据自己的生产环境和应用的特点来平衡IRQ中断有助于提高系统的整体吞吐能力和性能。这里介绍一下网络设备的绑核操作。

一:中断的affinity

在proc文件系统中,为中断提供了smp_affinity和smp_affinity_list接口,允许给指定的IRQ源绑定目标的CPU,而在/proc/irq/default_smp_affinity中,通过掩码的方式指定了IRQ的默认配置掩码。一般是ff,也就是所有CPU(0-15)。主要示例如下:

# cat /proc/irq/default_smp_affinity ff # cat /proc/irq/1/smp_affinity ff # cat /proc/irq/1/smp_affinity_list 0-7

二:实践绑核

2.1 查看硬中断号

# cat /proc/interrupts | grep eth1 110: 69925 0 0 0 0 0 0 14520 GICv3 259 Level eth1 111: 0 0 0 0 0 0 0 0 GICv3 258 Level eth1

2.2 smp_affinity_list设置

echo 7 > /proc/irq/110/smp_affinity_list echo 7 > /proc/irq/111/smp_affinity_list

这里意思为将110和111中断绑定在CPU序号为7上

2.3 smp_affinity 设置

如smp_affinity_list已经设置,则smp_affinity 可无需设置

smp_affinity 按照CPU掩码计算,如下

cpu0 0001 0 1 cpu1 0010 1 2 cpu2 0100 2 4 cpu3 1000 3 8 cpu4 10000 4 10. cpu5 100000 5 40 cpu6 1000000 6 80 cpu7 10000000 7 100

如果绑定为第8个CPU,则设置

echo 100 > /proc/irq/110/smp_affinity echo 100 > /proc/irq/111/smp_affinity

2.4 测试

ping 测试

$ ping -I eth1 0.0.0.0 PING 0.0.0.0 (172.25.80.124) from 172.25.80.124 eth1: 56(84) bytes of data. 64 bytes from 172.25.80.124: icmp_seq=1 ttl=64 time=0.064 ms 64 bytes from 172.25.80.124: icmp_seq=2 ttl=64 time=0.035 ms

查看中断

# cat /proc/interrupts | grep eth1 110: 69925 0 0 0 0 0 0 17112 GICv3 259 Level eth1 111: 0 0 0 0 0 0 0 0 GICv3 258 Level eth1

这里确定已经绑定成功了

编辑
2025-03-03
记录知识
0

如果工作机器是windows,在windows上需要跨系统进行系统开发,往往按照之前的办法是通过设置samba来共享工作目录,本地通过source insight工具来进行软件开发。但是缺陷是

  • 1.si是收费软件
  • 2.samba需要配置好固定的工作目录,工程目录需要自行配置和加载。

也就是每次配置都比较麻烦。针对此问题,vscode + ssh remote + clangd 可以提供更好的交互效果。这里介绍一下vscode 的配置步骤

一:安装工具

1.1 服务器端

apt install bear apt install clangd

这里注意clangd需要是llvm11及以上的二进制

1.2 客户端

vscode下载

https://code.visualstudio.com/Download

vscode插件配置

必要插件

Clangd Remote SSH

可选插件

C/C++ C/C++ Extension Pack C/C++ Snippets DeviceTree Rainbow Highlighter Arm Assembly Hex Editor Markdown All in OneMarkdown Preview Enhanced

1.3 ssh密钥配置

在windows默认目录 C:\Users\XXX.ssh 内拿到公钥id_rsa.pub

将其传入服务器上,并运行如下

cat id_rsa.pub >> ~/.ssh/authorized_keys

验证ssh可以通过 cmd 上运行 ssh xxxxxxx 可自动免密进入即可

二:使用步骤

2.1 ssh连接

vscode如下点击

image.png

在SSH右端可点击添加host,输入连接命令即可创建远程连接,这里图片连接了 172.25.130.130 172.25.130.31

2.2 打开目录

vscode打开工程目录和普通方式一样,只不过这里打开的是远程的目录文件

2.3 为remote host添加扩展

点击设置--->扩展-→为remote安装

扩展选择clangd即可

image.png

2.4 生成compile_commands.json文件

如果是内核代码,可以通过如下命令

scripts/clang-tools/gen_compile_commands.py

如果是自己的工程,可以如下

bear make

如果是ninja工程,可以如下

ninja -t compdb > compile_commands.json

2.5 查看clangd生效

在工程界面,状态栏如果显示clangd插件已经加载即可。

image.png

接下来就能正常的支持跳转了

2.6 快捷键

输入文件名打开文件: Ctrl + P 跳到某行: Ctrl + G + 行号 打开文件并跳到某行: Ctrl + p 文件名:行号 列出文件里的函数 : Ctrl + Shift + O,可以输入函数名跳转 函数/变量跳转: 按住Ctrl同时使用鼠标左键点击、F12 前进: Ctrl + Shift + - 后退: Ctrl + Alt + - 列出引用 : Shift + F12 查找所有引用 : Alt + Shift + F12 切换侧边栏展示/隐藏: Ctrl + B 打开命令菜单: Ctrl + Shift + P 手动触发建议: Ctrl + Space 手动触发参数提示: Ctrl + Shift + Space 打开/隐藏终端: Ctrl + `(Tab上方的那个键) 重命名符号: F2 当前配置调试: F5 上/下滚编辑器: Ctrl + ↑/↓ 搜索/替换 : Ctrl + F/H 高亮文字:shift + alt + z 取消高亮:shift + alt + a
编辑
2025-02-18
记录知识
0

地址范围

image.png 根据图片,我们可以知道

  • 如果虚拟地址在0x0000000000000000到0x0000FFFFFFFFFFFF则使用ttbr0_elx
  • 如果虚拟地址在0xFFFF000000000000到0xFFFFFFFFFFFFFFFF则使用ttbr1_elx

根据linux内核的内存划分我们可以知道
前256TB是提供给user space的
后256TB是提供的kernel space的

有效位

va的最高有效位决定了ttbrX的使用,如下

  • 如果va的bit63是0,则使用ttbr0
  • 如果va的bit63是1,则使用ttbr1