- 博客(31)
- 收藏
- 关注
原创 Linux系统软件开发,移植里bootloader, kernel, rootfs, applications之间的相互关系
在Linux系统软件开发和移植中,bootloader、kernel、rootfs和应用程序之间有着密切的关系,它们各自负责系统的不同层面。这种分层结构和相互协作的设计使得Linux系统具有良好的可移植性和模块化,允许开发人员根据具体的需求进行系统配置和定制。
2024-02-05 22:54:20 512
原创 unsigned int 和int的区别
是 C/C++ 中的两种基本数据类型,它们之间的主要区别在于其表示的范围和存储方式。时,需要根据具体的需求来决定。如果需要表示负数,则应该使用。如果只需要表示非负数,且希望能够利用。范围外的更大数值,可以考虑使用。
2024-01-31 11:41:22 5554
原创 什么是冒烟测试
Smoke testing(冒烟测试)是软件测试中的一种最基本的测试类型,旨在验证软件的主要功能是否能够正常工作。冒烟测试的主要目的是在软件开发周期的早期阶段快速检测关键功能是否存在明显问题,以确保软件的基本构建是稳定的。这种测试不涉及深入的功能测试或详尽的测试用例,而只关注核心功能的是否正常运作。冒烟测试是一种非常早期的测试阶段,通常在每次软件构建后都进行,以及在推动软件进入更全面测试阶段之前。验证软件的核心功能是否能够正常工作。针对软件的关键路径或核心流程进行测试,以确保这些路径上的功能能够正确执行。
2024-01-30 20:56:11 475
原创 The different types of software testing
There are numerous types of software testing techniques that you can use to ensure changes to your code work as expected. Not all testing is equal though, and we explore how some testing practices differ. It's important to make the distinction between manu
2024-01-30 20:43:14 1283
原创 cpu是如何实现抢占的
在计算机系统中,抢占是指操作系统能够中断正在执行的任务,将控制权转移到其他任务,从而实现多任务(multitasking)的一种机制。在 CPU 中,抢占是通过中断(interrupt)和时钟中断(timer interrupt)来实现的。这个过程使得操作系统能够在不同任务之间进行快速切换,实现多任务的同时,确保每个任务都能够得到执行。时钟中断是最常见的触发机制,但还有其他类型的中断,如硬件中断、软件中断等,都可以导致 CPU 执行相应的中断处理程序。
2024-01-30 15:37:11 633
原创 Linux内核裁剪
通过以上步骤,用户可以对 Linux 内核进行裁剪,根据特定的应用需求选择性地包含或排除功能和驱动程序。这有助于减小内核的体积,提高系统的性能和效率。但需要注意的是,在裁剪内核时,确保保留系统所需的功能和驱动程序,以免导致系统无法正常运行。Linux 内核裁剪是通过配置内核选项来选择性地包含或排除内核功能和驱动程序,以适应特定的应用需求。在配置工具中,用户可以选择是否启用或禁用特定的内核功能和模块。如果使用引导加载程序(如 GRUB)引导系统,需要更新引导加载程序的配置文件,确保它正确引导新的内核。
2024-01-29 16:08:30 751
原创 UART与USART的区别
总体而言,UART是一个广义的术语,通常指异步串行通信,而USART是UART的一种扩展,它在同步和异步通信方面都提供了更多的灵活性。选择使用哪种通信标准取决于特定的应用需求,例如是否需要同步通信、是否需要硬件流控制等。UART(通用异步收发器)和USART(通用同步异步收发器)是用于串行通信的两种常见的通信接口标准。
2024-01-29 10:46:26 2462
原创 Linux内核的体系结构和组件/进程、线程、任务和内核线程/Linux内核进程调度/设备树/编写字符设备驱动
Linux内核中的设备树机制在支持多种嵌入式系统的同时,也为其他操作系统提供了硬件描述的一种标准化方式。这有助于实现公平的进程调度。总体而言,Linux内核通过这些调度机制来保证系统资源的公平分配,提高系统的响应性,并实现多任务操作系统的基本功能。不同版本的Linux内核可能使用不同的调度器和调度策略,但基本的调度原理通常是类似的。它用于在嵌入式系统中定义和描述硬件的结构、组件以及它们之间的连接关系,为操作系统提供硬件信息的抽象表示。就绪状态的进程可以被调度执行,而等待状态的进程正在等待某些事件的发生。
2024-01-27 17:46:34 1619
原创 设备驱动模型(Device Model)
这个模型提供了一种统一的方式,使得设备驱动程序能够与内核交互,并能够有效地管理和协调设备的注册、注销、资源分配等操作。总体而言,设备驱动模型提供了一种组织和管理硬件设备的方式,使得设备之间的关系和系统的硬件配置能够被抽象和统一表示。用户空间可以通过sysfs、udev等接口与设备模型进行交互,从而获取有关设备的信息、配置设备等。设备模型通过总线的概念来组织设备。设备模型引入了通用的设备抽象,使得不同类型的设备都能够通过相同的接口进行管理。),这个结构体包含了设备的基本信息,如设备名称、设备号、设备类型等。
2024-01-27 12:50:06 723
原创 Linux设备驱动的组成
因此,设备驱动通常需要实现文件操作接口,如打开、关闭、读取、写入等,以便用户空间程序可以通过文件描述符对设备进行访问。设备驱动通常需要与Linux内核的设备模型进行交互,这是一种用于表示和管理系统中所有设备的抽象框架。设备驱动需要注册它所管理的设备,以便系统能够识别和使用这些设备。总的来说,一个完整的Linux设备驱动需要通过这些组成部分与硬件设备进行交互,使得操作系统和用户空间程序能够有效地使用和管理硬件资源。一些设备驱动需要管理与设备相关的内存,例如分配和释放内存区域,或者将内存映射到用户空间。
2024-01-27 12:45:13 393
原创 Serial Peripheral Interface 同步串行通信协议
通常,主机的MOSI(Master Out Slave In)线和从机的MISO(Master In Slave Out)线用于数据的传输。Serial Peripheral Interface(SPI)是一种同步串行通信协议,广泛用于连接嵌入式系统中的外围设备,例如传感器、存储器、通信芯片、显示屏等。SPI 是同步通信协议,这意味着数据传输的时钟是通过协议中的时钟线(SCLK)同步进行的。通信的两端都共享相同的时钟信号。SPI 的设计使其能够实现较高的数据传输速率,适用于对通信速度要求较高的应用。
2024-01-26 11:43:29 452 1
原创 编译器优化
编译器优化是指编译器在将源代码翻译成目标代码的过程中,通过一系列的优化技术来提高程序的性能、减小代码体积或者改善程序的其他方面的行为。尽管编译器优化可以提高程序的性能,但有时候也可能引入一些意外的行为或者影响程序的调试。编译器会对整个程序进行分析和优化,以充分利用全局的信息,如整个程序的数据流和控制流。编译器会尝试合理地分配寄存器,以减少内存访问的次数,提高程序的执行速度。编译器会将函数的代码直接插入到调用该函数的地方,以减少函数调用的开销。编译器会删除不会被执行的代码,从而减小生成的目标代码的体积。
2024-01-26 10:49:28 459 1
原创 变量的作用域
在C语言中,变量的作用域指的是变量可以被访问或修改的程序区域。变量的作用域由其声明的位置决定,它影响变量的可见性和生命周期。理解变量作用域对于编写可维护且无错误的C程序非常重要,因为它有助于防止命名冲突,并确保变量在适当的上下文中使用。// 错误:x在这里不可见。int x = 10;
2024-01-25 20:22:53 324
原创 静态变量(Static Variables)
由于其生命周期的延长,静态变量的值在函数调用之间得以保持。都会重新初始化为0,因此无论调用多少次,输出始终是 "Count: 1"。这失去了静态变量的状态保持功能,因为每次函数调用都会重新开始计数。静态变量在整个程序的生命周期内存在,而不仅仅存在于声明它们的作用域或函数的执行期间。静态变量具有全局性质,意味着它们在整个程序中可见,不受函数或作用域的限制。// 输出 Count: 1,因为每次调用时 count 都重新初始化为 0。被调用时递增,并且保持了其在函数调用之间的状态。是一个静态变量,它在每次。
2024-01-25 20:12:38 358
原创 关键字register的作用
关键字,程序员向编译器建议将某个变量存储在寄存器中。寄存器是CPU内部的快速存储区域,对于频繁访问的变量,存储在寄存器中可以提高程序的执行速度。关键字声明的变量,由于存储在寄存器中,通常不能取其地址。因此,对这些变量的取地址操作(&)是非法的。是一个关键字,用于向编译器建议将某个变量存储在寄存器中,以提高对该变量的访问速度。关键字的使用在现代编译器中已经被弱化,因为编译器通常能够自动地进行寄存器分配优化,忽略开发人员的建议。关键字,因为现代编译器通常能够更好地处理寄存器分配优化,而且使用。
2024-01-25 18:49:41 476
原创 进程间通信
"Inter-Process Communication"(IPC),即进程间通信,是指在计算机系统中,不同的进程之间进行数据交换和通信的机制。IPC 对于构建并发和分布式系统至关重要,确保不同进程之间能够有效地协同工作,共享信息和资源,以实现更复杂的任务。一个进程可以向另一个进程发送信号,用于通知某个事件的发生。允许一个进程的输出直接成为另一个进程的输入。用于在网络编程中进行进程间通信,也可以在同一台机器上的不同进程之间使用。进程可以通过消息队列向其他进程发送消息,从而实现进程之间的通信。
2024-01-25 18:08:04 327
原创 TensorFlow
然而,它现在已经扩展到支持各种机器学习和数值计算任务,包括图像识别、自然语言处理、语音识别等。TensorFlow提供了高级API(例如Keras)和低级API,使得开发者可以根据任务的复杂性和需求选择适当的抽象层次。它提供了一个灵活的工具集,使开发者能够构建和部署各种机器学习模型。TensorFlow的名称来源于"tensor"(张量)和"flow"(流动),表示在模型中使用张量(多维数组)来表示数据流动的计算图。它在学术界和工业界都得到了广泛的应用,并成为深度学习领域中最流行的框架之一。
2024-01-25 11:20:37 360
原创 同步和异步的区别
在实际编程中,同步和异步操作常常用于描述对于IO操作、网络通信、事件处理等的处理方式。同步操作适用于简单的、顺序执行的场景,而异步操作则更适用于需要同时处理多个任务、提高系统并发性能的场景。同步(Synchronous)和异步(Asynchronous)是用来描述不同的操作和通信模式的概念。这两者之间的主要区别在于程序的执行方式和任务完成的通知方式。
2024-01-24 17:08:16 410
原创 数据帧包括哪些部分
这些部分的具体格式和长度可能会根据使用的通信协议而变化。以太网协议(Ethernet)和串行通信协议(如RS-232、RS-485)是两个常见的示例,它们在数据帧的构成方面有一些不同之处。在每个协议中,这些字段的设计都是为了确保有效的数据传输和网络可靠性。数据帧是在通信网络中传输数据的基本单位,它通常包括一系列字段,每个字段承载特定类型的信息。
2024-01-24 17:05:32 753
原创 临界区,信号量,锁
这些同步机制的选择取决于应用程序的需求和设计。在多线程编程中,锁和信号量是常用的同步工具,而在多进程编程中,信号量通常更适合协调进程之间的资源访问。临界区则是一种更为抽象的概念,通常通过锁和信号量来实现。临界区、信号量和锁都是在多线程和多进程编程中用于同步和协调访问共享资源的机制。它们的主要目标是避免竞态条件(Race Condition)和确保对共享资源的安全访问。
2024-01-24 16:53:40 361
原创 单例模式和工厂模式的具体应用实例
在一个应用中,可能需要连接不同类型的数据库(MySQL、Oracle、SQL Server),可以使用工厂模式创建一个数据库连接工厂,根据需要创建对应的数据库连接对象。单例模式用于确保全局只有一个实例,而工厂模式用于创建复杂对象或者一组相关对象,提供更灵活的对象创建机制。// SQL Server数据库连接的具体实现。// Oracle数据库连接的具体实现。// MySQL数据库连接的具体实现。// 绘制三角形的具体实现。// 绘制圆形的具体实现。// 绘制矩形的具体实现。// 其他日志相关的方法和属性。
2024-01-24 16:34:03 1405
原创 串口通信和tcpip 通信的区别
总的来说,串口通信更适用于局部、短距离、实时性要求高的场景,而TCP/IP通信更适用于远距离、分布式、可靠性要求高的场景。选择其中一种通信方式取决于具体的应用需求和系统设计要求。
2024-01-24 16:28:03 1780
原创 工业通信的调试方式
工业通信的调试通常涉及到检查和解决硬件和软件层面的问题。通过结合这些方法,工程师可以逐步识别并解决工业通信系统中的问题,确保稳定和可靠的通信。
2024-01-24 15:12:41 379
原创 RS232和RS485区别
RS232和RS485都是串行通信标准,但它们在电气特性、信号传输方式、连接方式和应用场景等方面存在一些重要的区别。总体而言,RS232和RS485在电气特性、传输方式和应用场景上存在显著的差异,因此在选择使用哪种标准时,需要根据具体的通信需求和环境来进行合理的选择。
2024-01-24 13:45:00 481
原创 SQL注入以及预防措施
SQL注入是一种攻击技术,攻击者通过在应用程序的用户输入中注入恶意的SQL代码,试图欺骗数据库执行非授权的查询。这种攻击通常发生在未正确验证和过滤用户输入的情况下。
2024-01-23 17:40:44 413 1
原创 调用数组指针的优点(代码例程)
通过使用指针(而不是直接使用数组),函数可以直接操作传递给它的数组,而无需在函数内部复制整个数组,这有助于提高程序的效率。指针的使用允许函数修改数组的内容,而不是在函数内创建数组的副本。这对于大型数组而言,可以减少内存占用和提高性能。是传递进来的指向浮点数数组的指针。指针提供了对数组内存的直接引用,从而允许函数对数组进行操作。是一个指向浮点数数组的指针,而。
2024-01-23 14:50:33 346 1
原创 malloc(), calloc(), realloc()
calloc()函数用于在堆内存中申请nmemb个单位长度为size的连续空间,并将这块内存初始化为0,如果内存分配成功,则函数会返回一个指向这块内存的指针;如果分配失败,则函数返回NULL。malloc()函数用于在堆内存空间中申请一块用户指定大小的内存,申请成功后会返回用户一个指向这块内存的指针,用户通过这个指针就可以直接对这块内存进行读写。当申请的内存不够用时,我们可以使用realloc()函数动态调整内存块的大小。
2024-01-23 11:24:39 365
原创 print在工作中的使用注意事项
日志输出的目标是多样的,例如通过printf输出到屏幕、通过串口输出到串口调试助手、通过文件操作写入到文件等等。要通过重定义的方式,将所有的日志输出指令定义到合适的输出路径,当需要修改输出路径的时候,只要修改重定义的部分即可。2. 日志输出需要有优先级控制,例如:发生错误时的日志优先级最高,一般都要输出;b) 一定要有一个全局的开关,在不需要或者产品发布的时候,关闭输出,或者降低日志输出的频率。1. 日志输出是有代价的,特别是在嵌入式系统,或者对执行时序要求较高的应用场景。
2024-01-23 11:16:53 412 1
原创 硬链接&软链接&静态库&动态库
实际上,硬链接和源文件是同一份文件,而软连接是独立的文件,类似于快捷方式,存储着源文件的位置信息便于指向。可以对目录创建软连接,可以跨文件系统创建软连接,可以对不存在的文件创建软连接。动态库和静态库类似,但是它并不在链接时将需要的二进制代码都“拷贝”到可执行文件中,而是仅仅“拷贝”一些重定位和符号表信息,这些信息可以在程序运行时完成真正的链接过程。可重定位目标文件以一种特定的方式打包成一个单独的文件,并且在链接生成可执行文件时,从这个单独的文件中“拷贝”它自己需要的内容到最终的可执行文件中。
2024-01-23 10:50:17 428 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人