解决QT在构造函数中写的控件不显示的问题 保留现场在新窗口中的构造函数中添加控件运行后却没有显示 探究原因 新建的工程师MainWindow子类工程,没有设置父窗口。 没有将控件的父窗口设置成自己定义的widget。 12345678910#include<QMainWindow> QMainWindow::QMainWindow(QMainWindow*parent) : QMainWindow(parent), 2021-11-16 Bug踩坑记录 Qt Bug
QWidget中update不执行paintEvent 保留现场手动执行update()或者repaint()都不能执行paintEvent函数。 探究原因如果是代码new出来的控件,检查是否正确显示,比如有没有加入到layout中。或者有没有设置父窗口(可能被其他空间遮挡)。 检查控件width或者height大小是否不为0。如果为0,也不会出出发paintEvent。 解决方法参考QT在构造函数中写的控件不显示 2021-11-15 Bug踩坑记录 Qt Bug
解决C++中vector声明错误expected parameter declarator 保留现场12QVector<uint32_t> buttonPins(3); 声明了一个长度为3的vector数组,编译是会报这个错误。 探究原因编译器可能无法区分这是一个成员函数声明还是一个成员变量声明,也就是产生歧义。 解决方法方法1: 12QVector<uint32_t> buttonPins = QVector<uint32_t>(3);//明确这是 2021-11-13 Bug踩坑记录 C++ Bug
解决expected identifier before ‘(’ token 保留现场比如在一个枚举类型中,会告诉你某行有这种错误。又或者,在一个宏定义语句中出现这种错误。 探究原因一般来说,出现这种情况,是语句中有些定义的名字发生了冲突。 解决方法定位错误位置,搜索是否有同名的函数,变量等等。改个名字。 2021-11-12 Bug踩坑记录 C Bug
QEMU源码分析-外设模拟(以GPIO为例) QEMU模拟外设的原理QEMU主要是实现了CPU核的模拟,可以读写某个地址。QEMU的模拟外设的原理很简单:硬件即内存。要在QEMU上模拟某个外设,思路就是: CPU读某个地址时,QEMU模拟外设的行为,把数据返回给CPU CPU写某个地址时,QEMU获得数据,用来模拟外设的行为。即:要模拟外设备,我们只需要针对外设的地址提供对应的读写函数即可。 以GPIO为例: QEMU 为GPIO内存地 2021-11-11 QEMU源码分析 QEMU GPIO
QEMU源码分析-虚拟外设创建(以GPIO为例) 一个板子上有很多硬件:芯片,LED、按键、LCD、触摸屏、网卡等等。芯片里面也有很多部件,比如CPU、GPIO、SD控制器、中断控制器等等。 这些硬件,或是部件,各有不同。怎么描述它们? 如何描述硬件每一个都使用一个TypeInfo结构体来描述。 对于KVM有这样的结构体 123456static const TypeInfo kvm_accel_type = { .name = 2021-11-09 QEMU源码分析 QEMU
解决一台电脑配置两个GIT账户 公司的也在用git,但是账号和地址肯定都不同,需要配置两个不同的提交环境。 生成两个Key生成第一个Key如果电脑上已经在用Git了就无需重新生成key,用当前的就可以。key保存在~/.ssh文件夹内。 如果第一次使用,就使用以下命令重新生成: 1234➜ .ssh ssh-keygen -t rsa -C home_pcGenerating public/private rsa key pa 2021-10-30 Git
C语言复杂声明 C语言常常因为声明的语法问题而受到人们的批评,特别是涉及到函数指针的语法。C语言的语法力图使声明和使用相一致。对于简单的情况, C语言的做法是很有效的,但是,如果情况比较复杂,则容易让人混淆,原因在于, C语言的声明不能从左至右阅读,而且使用了太多的圆括号。在C中,声明的形式为(dcl是declaration的简写): 12345dcl: optional *'s direct-dcl( 2021-10-22 C
C语言共享内存实现CyclicBuffer循环缓冲区 完整代码详见GitHub CyclicBuffer。 什么是循环缓冲区 循环缓冲区通常应用在模块与模块之间的通信,可以减少程序挂起的时间,节省内存空间。 如图所示,蓝色箭头表示读取指针,红色表示写入指针。写入指针可以在缓冲区有剩余空间时不中断地写入数据,读取指针可以在循环缓冲区有数据时不停读取。 如何设计循环缓冲区为了方便两个进程之间的通信,我们在共享内存中创建循环缓冲区。基本原理如图: 结构体 2021-10-21
解决gcc编译后fflush失效 保留现场使用scanf()获取输入时,因为涉及键盘缓冲区的问题,每次输入后想要把缓冲清空,但是在gcc编译后,使用fflush无法清空缓冲区。 探究原因C标准(ISO/IEC 9899:1999 standard)规定fflush(stdin)操作是未定义的<参看《ISO/IEC 9899:1999 standard》p270>;。也就是说不一定能实现刷新功能,但有的编译器可能不遵循标 2021-10-21 Bug踩坑记录 C Bug