- 博客(82)
- 资源 (1)
- 收藏
- 关注
原创 Qt中QVariant的使用
方法:通过type函数返回数值的类型,然后通过setValue来构造一个QVariant类型的返回值。1.使用QVariant实现不同类型数据的相加。
2025-01-25 17:37:04
535
原创 Qt Desiogn生成的ui文件转化为h文件
3.在1中的工具输入uic/xx/xxx.ui-o/xx/xxx.h即可得到结果。2.查找到ui文件以及要转化为的h文件的路径。
2025-01-18 17:46:00
341
原创 QT中多线程使用(二)
5.将工作对象移动到创建的子线程对象中,需要调用QObject类提供的moveToThread方法。6.启动子线程,调用start(),这时候线程启动了,但是移动到线程中的对象并没有工作。7.调用工作对象的工作函数,让这个函数开始执行,这时候是在移动到的那个子线程中运行的。2.在这个类中添加一个公共的成员函数,函数体就是我们在子线程中执行的业务逻辑。4.在主线程中创还能工作的类对象(千万不要给创建的对象指定父对象)3.在主线程中创建一个QThread对象,这就是子线程的对象。
2025-01-18 17:41:52
346
原创 QT中多线程的使用(一)
在Qt中使用多线程来处理比较复杂的逻辑时,可以将这个逻辑写到一个类中。这个类继承QThread类,并且重写其中的run()方法,当调用start()方法的时候,run()方法会被自动调用。2.例子:使用多线程实现对10000个数据的排序,并通过冒泡排序和快速排序分别对二者进行排序,得到的结果显示在界面上。假设现在要生成10000个随机数,如果在主线程中直接生成,那么主界面会非常的卡顿,此时需要重新创建一个子线程。当主线程需要使用的时候,可以通过run()方法来调用这个类的处理逻辑。
2025-01-18 16:56:28
361
原创 CMAKE的使用
2.2设置C++标准,如C++11 C++14 C++17 C++20;通过CMKAE_CXX_STANDARD = 11/14/17/20。问题:add_executable中的第二个参数太长了,怎么办?6.将当前项目中的文件编译成库文件(动态库和静态库)2.3通过set给生成可执行文件设置路径,也可以在后边cmake的时候指定C++标准。通过这四个文件制作运算库,命令为。发布的时候要发布库文件和头文件。但是会出现问题:找不到头文件。指定生成的库文件的路径。7.在程序中链接静态库。将这些内容存在变量中。
2024-12-02 22:13:28
506
原创 linux-UART
UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。图中的电平分为TTL/CMOS以及RS-232电平。1.1接线:把串口的Tx和Rx连接起来。1.app发送接受数据。
2024-11-01 20:44:24
458
原创 Linux中SPI
基于平台总线设备驱动模型实现。在probe函数中除了生成spi_master,还会创建spi_device结构体。根据SCK的电平以及数据在第一个跳变沿还是第二个跳变沿传输,SPI传输总共有四种模式。spi设备也有自己的驱动程序,提供spi设备的访问能力。spi控制器有驱动程序,提供spi的传输能力。3.SPI总线设备驱动模型。4.1SPI控制器驱动程序。4.spi设备驱动框架图。4.2SPI设备驱动程序。
2024-10-30 19:59:46
541
原创 VIM的使用
修改键盘映射的方式:交换Linux中大写锁定键和Esc按键的位置。安装命令 yum-install xmodmap。7.文本对象 范围文本对象。9.设置标记,快速回跳。4.VIM学习初体验。
2024-10-30 19:35:28
340
原创 GCC及GDB的使用
(假如程序出错的时候,没有产生core文件,就要通过ulimit来设置;ulimit -c unlimited)这里还是没出来core文件,后续再排查为什么。r: 没有设置断点的时候,r会将程序运行完。5.当程序出现错误的时候,比如指针越界。6.调试一个正在运行的进程。su root之后重新查看。4.3观察某个变量的值。会产生一个core文件。1.GDB的主要功能。
2024-10-29 21:44:15
287
原创 linxu-i2c驱动-eeprom
经过排查是由于,读写之后,没有加延时,可能会导致数据的覆盖。这个程序中还存在一些小问题,不过实现了数据的传输。后续可以把这个延时时间取短点,这里直接取值2s。eeprom的地址为0x50。对driver程序进行更改。
2024-10-27 21:24:25
254
原创 linxu - I2C
I2C 协议采用双线结构传输数据,包括一个数据线和一个时钟线(即 SDA 和 SCL 线),其中 SDA(Serial Data)线用于双向数据传输,而 SCL(Serial Clock)线则用于同步数据传输的时钟信号。IIC 协议(Inter-Integrated Circuit,可简写为 I2C),是一种用于各种电子设备之间进行通信和数据交换的串行通信协议。I2C 设备的地址为 8 位,但是时序操作时最后一位不属于地址,而是 R/W 状态位。所以有用的是前 7 位,使用时地址整体右移一位处理即可。
2024-10-27 15:59:32
298
原创 9.Linux按键驱动-工作队列
1.2 在probe函数中初始化工作队列。1.1在gpio结构体中定义工作队列。1.3.在中断服务程序中调度工作队列。
2024-10-27 09:52:48
243
原创 8.Linux按键驱动-中断下半部
由运行结果可知,在驱动中检测到两次按键按压事件(tasklet函数被调用两次),由于上节中的定时器消抖,导致key_timer_expire函数只被调用了一次,故read函数只执行了一次,应用程序只能获取后一个按键值。1.1在gpio结构体中添加tasklet_struct结构体。1.2在probe函数中初始化tasklet结构体。1.3在中断服务程序中调度tasklet。应用程序和Makefile和上节一致。1.4在这个函数中执行其它任务。
2024-10-27 09:34:54
323
原创 7.Linux按键驱动-定时器
3.2在probe函数中,设置定时器,修改定时器超时时间,添加定时器。3.4在超时函数中,唤醒等待队列,执行原来中断服务程序执行的那些任务。3.1 在按键结构体中,添加timer_list成员。3.3在按键中断函数中,修改定时器超时时间。
2024-10-27 09:04:49
335
原创 6.Linux按键驱动-阻塞与非阻塞
核心在于驱动程序中的.read函数的支持。立即返回,无法读出,返回-1。默认打开文件时候是阻塞的。1.设置打开方式为非阻塞。
2024-10-26 23:37:08
323
原创 5.Linux按键驱动-fasync异步通知
当应用程序收到SIGIO信号的时候, sig_func函数就会被调用,调用read函数读取按键的值。2.2APP把自己的pid告诉驱动程序。2.1绑定信号和信号处理函数。
2024-10-26 23:02:44
276
原创 4.Linux按键驱动-poll监听文件描述符
在while循环中读取数据之前,首先调用poll函数(对应于驱动中的gpio_poll),如果产生了按键按压事件,那么 ret为1,且fds的revens为POLLIN。当产生中断时,中断服务程序中回唤醒等待队列,.poll函数会返回POLLIN | POLRDNORM。根据上述分析可知,只有当产生了按压之后,才会进入到if的第一个分支,调用read函数。那么,在这种情况下,可以去掉gpio_read函数中第87行的代码。3.在驱动程序中,添加对poll函数的支持。2.1定义文件监听描述符及超时时间。
2024-10-26 22:14:22
337
原创 3.Linux按键驱动-添加循环队列
3.在open函数中,等待条件变量。当获得条件变量时,判断条件是否为真,为真时,将数据从内核空间拷贝到用户空间。2.在中断服务程序中,记录按键值,并且唤醒等待队列。1.添加环形缓冲区的代码。
2024-10-26 21:25:43
314
原创 2.Linux按键驱动-创建字符设备,通过应用程序读取按键值
3.在中断处理函数中唤醒等待队列,然后在read函数中返回按键值。4.4在中断服务程序中,给全局变量赋值,并且唤醒等待队列。4.2 gpio_remove函数中添加对应的删除代码。4.5此时,.read函数会将数据拷贝回用户空间。4.1 gpio_probe中添加字符设备代码。1.在上一个博客的基础上,添加一个字符设备。2.在probe函数中注册字符设备。4.3 定义全局变量,等待队列。3.3Makefile文件。
2024-10-26 18:14:37
419
原创 Linux复习-C++
7.define和inline的区别。8.前置++和后置++区别。4.静态链接和动态链接。3.C与C++的区别。5.指针和引用的区别。6.类和结构体的区别。
2024-10-26 13:53:26
539
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人