![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式学习日记
文章平均质量分 82
努力的小阳同学
研二/通信/努力学习的小阳同学
展开
-
小阳同学嵌入式学习日记-QFile读写文件
在Qt中,QFile是一个用于文件I/O操作的类。它提供了一种方便的方式来读取和写入文件内容,以及获取有关文件的信息。QFile类提供了许多函数,用于打开、关闭、读取和写入文件。open(): 打开文件,可以指定打开方式(只读、只写、读写等)和打开模式(文本模式、二进制模式等)。close(): 关闭文件。read(): 读取文件中的数据。write(): 向文件中写入数据。seek(): 设置文件指针的位置。size(): 获取文件的大小。exists(): 检查文件是否存在。原创 2024-04-16 19:42:18 · 723 阅读 · 0 评论 -
小阳同学嵌入式学习日记-_stdcall 和 _cdecl
都是 Windows 平台下函数调用约定(calling convention)的一种。在 Windows 平台下,默认情况下,C 和 C++ 函数使用。如果需要显式地声明函数的调用约定,可以使用相应的关键字进行声明。调用约定,而 Win32 API 函数和 COM 组件使用。是两种不同的函数调用约定,在参数传递和栈清理方面有所不同。原创 2024-04-12 09:15:28 · 412 阅读 · 0 评论 -
小阳同学嵌入式学习日记-extern “C“
用于声明C语言风格的函数接口,这意味着函数名称不会被C++的名称修饰机制修改,也就是不会进行函数名称的重命名(名称修饰)。这样声明的常量是一个声明而非定义,编译器在编译时不会为它分配存储空间,而是将其作为一个标识符,用于在其他文件中访问已定义的常量。时,这个函数的名称在链接时会按照 C 语言规则进行修饰,因此在 C 代码中可以直接引用这个函数而不需要使用 extern。声明告诉编译器这些函数是用C语言编写的,而不是C++。声明,只是告诉编译器该变量是在其他文件中定义的,而不是在当前文件中定义的。原创 2024-04-12 08:55:05 · 883 阅读 · 0 评论 -
小阳同学嵌入式学习日记-setStyleSheet( )和.qss文件
Qt中的QSS(Qt Style Sheets)文件是一种用于定义界面样式的文件格式。类似于CSS(Cascading Style Sheets),QSS文件允许您定义Qt应用程序中的各种UI元素的外观和样式,包括按钮、标签、文本框等。这个方法允许您以类似CSS的方式为控件指定样式,并且这些样式可以在运行时动态修改。通常情况下,对于简单的样式需求或者需要动态修改样式的情况,可以选择使用setStyleSheet()而对于复杂的样式需求、需要设计与逻辑分离或者需要样式重用的情况,可以选择使用.qss文件。原创 2024-04-10 14:24:21 · 1646 阅读 · 0 评论 -
小阳同学嵌入式学习日记-自定义信号槽
在Qt中,可以通过在自定义的类中声明信号来创建自定义信号。通常情况下,自定义信号应该在类的signals部分声明,并且不需要提供实现,Qt会在需要时自动生成相应的代码。Q_OBJECTpublic:signals:// 声明了一个自定义信号,无返回值,无参数// 槽函数,用于接收信号在这个示例中,我们创建了一个名为MyClass的类,它继承自QObject。在类的 signals部分声明了一个名为 mySignal的自定义信号,它没有返回值也没有参数。原创 2024-04-08 15:54:30 · 905 阅读 · 0 评论 -
小阳同学嵌入式学习日记-Qt信号与槽机制
Qt 信号与槽机制是一种用于处理对象间通信的机制,它是 Qt 中最重要的特性之一。通过信号与槽机制,一个对象可以向另一个对象发送信号,而另一个对象可以在接收到信号时执行相应的槽函数。这种机制极大地简化了对象之间的通信,使得代码的组织和管理更加灵活和清晰。信号(Signal):信号是一个对象的特殊成员函数,用于发出通知或事件。当对象的状态发生变化或特定条件满足时,它会发出一个信号,通知其他对象。槽(Slot):槽是一个普通的成员函数,用于接收信号并执行相应的操作。原创 2024-04-08 14:43:33 · 855 阅读 · 0 评论 -
小阳同学嵌入式学习日记-条件变量
条件变量(Condition Variables)是一种线程同步的机制,用于在多线程编程中实现线程之间的协作。它通常与互斥锁(Mutex)一起使用,用于在线程等待某个条件成立时暂停执行,并在条件满足时恢复执行。条件变量允许线程在等待某个条件成立时进入阻塞状态,以避免忙等待(busy-waiting)的情况,从而有效地利用系统资源。等待(wait):一个线程可以调用等待操作来阻塞自己的执行,直到某个条件被满足。当某个线程在条件不满足时调用等待操作时,它会释放持有的互斥锁,并进入阻塞状态等待条件成立。原创 2024-04-07 12:20:13 · 1231 阅读 · 0 评论 -
小阳同学嵌入式学习日记-互斥锁
互斥锁(Mutex,全名为 Mutual Exclusion)是一种线程同步的机制,用于保护共享资源,确保同一时间只有一个线程可以访问共享资源,从而避免多个线程同时修改共享资源导致的数据不一致性和竞态条件。互斥锁的基本操作包括两个主要函数:锁定(Lock)和解锁(Unlock)。当一个线程要访问共享资源时,首先会尝试获取互斥锁,如果互斥锁已经被其他线程获取,则当前线程会被阻塞,直到获取到互斥锁为止。获取到互斥锁后,线程可以安全地访问共享资源,执行完操作后,需要释放互斥锁,以允许其他线程继续访问共享资源。原创 2024-04-03 16:42:44 · 740 阅读 · 0 评论 -
小阳同学嵌入式学习日记-线程同步
线程同步是指在多线程编程中,通过各种机制来协调和控制多个线程的执行顺序和访问共享资源的行为,以确保程序的正确性和一致性。线程同步的主要目的是避免竞态条件(Race Condition)和其他并发问题,确保多个线程能够按照既定的顺序和方式进行协作和合作。使用互斥锁(Mutex)来保护临界区,确保同一时间只有一个线程可以进入临界区执行操作,避免多个线程同时访问共享资源导致数据不一致的情况。使用条件变量来实现线程的等待和通知机制,允许线程等待某个条件的发生并在条件满足时被唤醒,以便有效地进行线程间的协调和通信。原创 2024-04-03 16:21:10 · 863 阅读 · 0 评论 -
小阳同学嵌入式学习日记-守护进程
守护进程(Daemon Process)是在操作系统后台运行的一种特殊类型的进程。它们在后台运行,通常独立于任何用户会话,并且没有控制终端。守护进程通常被设计用来执行一些系统级的任务或服务,例如作为服务器后端运行、定期执行某些任务、监控硬件或网络设备等。守护进程在后台持续运行,通常不受用户会话的影响,不需要用户交互。守护进程通常不与任何控制终端相关联,因此不接收用户输入,也不向终端输出。守护进程通常在系统启动时启动,并在系统关闭时终止,与用户登录和注销无关。原创 2024-04-01 20:59:55 · 868 阅读 · 0 评论 -
小阳同学嵌入式学习日记-什么是进程组?
组长进程是指进程组中的第一个进程,其进程ID(PID)等于进程组ID(PGID)。在创建进程组时,创建的第一个进程会成为进程组的组长进程。在操作系统中,进程组(Process Group)是一组相关联的进程的集合,它们共享同一个组ID(PGID)。进程组通常由一个或多个相关联的进程组成,这些进程通常是由同一个父进程创建的,并且它们可以相互之间进行通信和协作。每个进程组都有一个进程组领导者(Leader Process),它的进程ID(PID)等于进程组ID(PGID)。)来加入到另一个进程组中。原创 2024-04-01 19:50:42 · 407 阅读 · 0 评论 -
小阳同学嵌入式学习日记-进程状态
如上图所示,便是一个进程从出生到死亡的全过程。原创 2024-03-31 17:17:18 · 1047 阅读 · 0 评论 -
小阳同学嵌入式学习日记-创建进程中的fork( )和vfork( )
总的来说,如果需要创建一个新的子进程来执行一个新的程序,并且这个新程序会立即执行,那么vfork()但是如果子进程需要修改父进程的地址空间,或者需要在创建后独立运行一段时间,那么fork()之后,操作系统会复制父进程的所有资源(包括内存、文件描述符等),然后将复制的资源分配给子进程。是一个系统调用,用于创建一个新的进程,新进程称为子进程,而调用fork()下面是一个简单的例子,演示了fork()返回的是子进程的PID,而在子进程中,fork()是另一个创建新进程的系统调用,但与fork()原创 2024-03-31 16:22:08 · 1091 阅读 · 0 评论 -
小阳同学嵌入式学习日记-fork( )创建子进程
后,父进程和子进程会执行相同的代码,但它们拥有不同的内存空间。需要注意的是,子进程是父进程的副本,但是它们有各自独立的内存空间,因此在它们的内存空间中做出的更改不会影响对方。因此,如果在父进程中打开了文件,子进程也会继承这些打开的文件。另外,如果子进程的父进程提前结束,而子进程还在运行,那么子进程会变成孤儿进程,这时候可以将其重新绑定到 init 进程,即通过。调用后,父进程和子进程的执行路径会分开,它们可以并行执行不同的任务。被用于创建一个新的进程,然后在新的进程中执行不同的程序,这个过程称为进程创建。原创 2024-03-29 09:59:34 · 636 阅读 · 0 评论 -
小阳同学嵌入式学习日记-终止进程中的exit( )和_exit( )
是用于函数内部返回值并结束当前函数的执行。都是用于终止程序的函数,但它们有一些区别。函数用于立即终止程序,不进行任何清理工作。是用于终止整个程序的执行,而 return。函数用于正常终止程序并执行清理工作,而。函数用于异常终止程序,直接返回操作系统。函数用于正常终止程序并执行清理工作,而。语句来结束程序的执行,但建议使用。函数中,可以使用 return。函数来明确表示程序的结束。原创 2024-03-27 20:50:59 · 768 阅读 · 0 评论 -
小阳同学嵌入式学习日记-进程与程序
在实际开发中,正常终止是我们期望的结果,而异常终止则是程序发生问题时的一种应对方式。在这种情况下,程序会返回给操作系统一个退出码(通常是0),表示程序成功地执行完成。:有时候,操作系统或其他软件可能会强制终止程序的执行,例如在内存不足时操作系统会终止一些程序以释放资源,或者用户手动结束程序的执行。:程序执行过程中可能会包含一些条件,当满足这些条件时,程序会自行决定终止执行。简而言之,程序是静态的代码集合,而进程是程序的执行实例,是动态的执行过程。程序结束的方式通常取决于程序的设计和执行环境。原创 2024-03-27 17:17:55 · 267 阅读 · 0 评论 -
小阳同学嵌入式学习日记-标准 I/O和文件 I/O
是两种不同的输入输出方式,用于在程序中读取和写入数据。做大做强,再创辉煌!原创 2024-03-27 15:58:06 · 151 阅读 · 1 评论 -
小阳同学嵌入式学习日记-进程和线程
进程(Process)是计算机中运行的程序的实例。它是操作系统进行资源分配和调度的基本单位,包含了程序的代码、数据和程序执行时所需的系统资源。程序代码:进程包含了要执行的程序代码,即程序的指令集合,定义了程序的逻辑和功能。数据:进程还包含了程序所使用的数据,包括变量、数组、对象等。这些数据在进程执行过程中会被程序读取、修改和存储。堆栈:每个进程都有自己的堆栈空间,用于存储函数调用、局部变量和函数参数等信息。堆栈的大小通常是固定的,并且会在程序执行时动态地分配和释放。资源。原创 2024-03-27 08:53:35 · 753 阅读 · 1 评论 -
小阳同学嵌入式学习日记-竞争冒险和原子操作
假设有一个共享的计数器变量,多个线程同时对该计数器进行读取和递增操作。在没有同步控制的情况下,可能会发生竞争冒险。初始时,计数器的值为 0。线程 A 读取计数器的值为 0。线程 B 同时也读取计数器的值为 0。线程 A 将计数器的值加 1,并将结果写回计数器,使其值变为 1。线程 B 也将计数器的值加 1,由于此时线程 B 读取的是旧值 0,所以它也将旧值加 1,并将结果写回计数器,使其值变为 1。原创 2024-03-26 16:36:47 · 687 阅读 · 0 评论 -
小阳同学嵌入式学习日记-空洞文件、 O_APPEND 和 O_TRUNC 标志
相反,空洞文件使用一种称为“洞”的特殊标记来表示其中的一些部分是未使用的或者空的。如果文件已经存在,那么文件的当前偏移量会被设置到文件的末尾,这样所有的写操作都将在文件末尾追加数据。如果文件已经存在,那么文件中的所有数据都将被删除,并且文件的大小将变为0。这个标志通常与写入文件操作一起使用,以确保写入的数据覆盖现有的文件内容,而不是追加到文件末尾。在许多操作系统中,创建空洞文件的方法是通过在文件中创建大量的空洞(使用特殊的系统调用或者文件操作),而不实际写入数据。做大做强,再创辉煌!原创 2024-03-26 13:41:39 · 277 阅读 · 0 评论 -
小阳同学嵌入式学习日记-open()、write()、read()、close()、lseek()
在文件操作中,关闭文件描述符通常是一个很重要的操作,特别是在程序需要打开大量文件时,及时关闭不再需要的文件描述符可以避免资源浪费和系统资源耗尽的问题。函数,程序员可以打开已存在的文件或者创建新的文件,并且可以通过返回的文件描述符进行文件的读写操作。函数,程序员可以实现文件的随机访问,读取或者修改文件的任意位置内容。函数返回值是调整后的文件偏移量,如果操作成功,则返回新的文件偏移量;函数返回一个文件描述符,如果操作成功,则返回新打开文件的文件描述符;函数返回值是整数型的,如果操作成功,则返回。原创 2024-03-25 18:16:30 · 672 阅读 · 0 评论 -
小阳同学嵌入式学习日记-文件描述符
在Linux系统中,文件描述符(File Descriptor)是一个用于标识打开文件、套接字、管道和其他 I/O 设备的非负整数。Linux系统遵循了Unix哲学中“一切皆文件”的概念,因此文件描述符不仅仅用于表示普通的文件,还可以表示其他的I/O资源,比如管道、套接字等。原创 2024-03-25 16:15:42 · 561 阅读 · 0 评论 -
小阳同学嵌入式学习日记-应用编程与裸机编程、驱动编程有什么区别?
主要关注于开发操作系统中用于管理和控制硬件设备的驱动程序。是三种不同的软件开发方式,它们的主要区别在于所针对的。主要关注于在硬件上直接编程实现特定功能,而。主要关注于开发功能丰富的应用程序,原创 2024-03-25 15:10:08 · 340 阅读 · 0 评论 -
小阳同学嵌入式学习日记-什么是系统调用?
在系统调用的过程中,用户程序通过将参数传递给特定的系统调用函数或者指令,然后通过软中断或者其他机制将控制权转交给操作系统内核。系统调用是用户空间程序与内核之间的接口,它允许用户程序通过一组预定义的函数或者指令,向操作系统发出请求以执行特定的操作。系统调用是操作系统提供的重要功能之一,它为用户程序提供了访问操作系统功能的标准化接口,同时也是操作系统内核实现功能的核心部分。当用户程序需要执行特权操作(例如创建进程、读写文件等),或者访问受保护的资源时,就需要通过系统调用来委托操作系统来完成这些任务。原创 2024-03-25 14:28:47 · 499 阅读 · 0 评论