
嵌入式linux/RTOS
文章平均质量分 65
嵌入式进阶到linux大型操作系统平台必备知识
最后一个bug
我是bug菌,一名嵌入式软硬件技术爱好者,我来csdn了~
展开
-
PCI与PCIe接口的通信架构是主从模式吗?
PCI(Peripheral Component Interconnect)总线在通信架构上本质是主从模式,但其具体实现和角色分配在不同版本(如传统PCI与PCI Express)中存在差异。若需设计PCI/PCIe设备,需明确其角色(主/从)并遵循相应的协议规范。典型应用场景 早期PC扩展卡 现代高速设备(GPU、SSD)总线仲裁 集中式仲裁器 基于信用(Credit)的流控。主设备角色 多个主设备竞争总线 根联合体统一管理。物理结构 共享并行总线 点对点串行链路。(2) 总线仲裁机制。原创 2025-04-04 16:23:28 · 203 阅读 · 0 评论 -
linux的CPU乱序问题需要考虑内存屏障
在 Linux 应用程序开发中,是否显式使用内存屏障取决于具体场景。大多数开发者不会直接操作内存屏障,而是依赖更高级的同步机制(如锁、原子操作或标准库提供的线程安全抽象)。但在某些特定场景下,内存屏障是必须的。应用开发者 极少显式使用 依赖高级同步原语(如锁、原子操作),无需关心底层细节。系统开发者 较频繁(如内核、驱动、无锁库) 需要直接控制硬件或实现底层同步机制。嵌入式开发者 中低频(依赖架构) 在操作寄存器或跨核通信时需插入屏障。(2) 示例:使用原子操作避免手动屏障。原创 2025-02-24 00:56:09 · 290 阅读 · 0 评论 -
嵌入式Linux内核底层调试技术Kprobes
Kprobes 是 Linux 内核中一种动态插桩(Dynamic Instrumentation)技术,允许在不修改内核源码或重启系统的前提下,动态监控内核函数的执行。总的来说,Kprobes 是 Linux 内核动态追踪的底层基础设施,提供了极高的灵活性,但需要谨慎使用以避免系统崩溃。对于大多数场景,推荐优先使用更高层的工具(如 eBPF 或 ftrace),仅在需要深度定制时直接使用 Kprobes。ftrace 基于函数图的静态插桩,性能开销低,适合生产环境。1.3 关键数据结构。原创 2025-02-23 22:02:07 · 576 阅读 · 0 评论 -
linux中把文件系统加载到内存中执行
在 Linux 内核中,将文件系统加载到 内部 RAM 中运行(即使用 RAM 作为根文件系统的存储介质)通常有两种方法:initramfs 和 RAM Disk(ramdisk)。通过上述方法,可以在 Linux 内核中轻松实现将文件系统加载到内部 RAM 中运行,适用于嵌入式系统快速启动或临时调试环境。它比传统 ramdisk 更轻量,无需预先分配固定大小的块设备。initramfs 是一个基于内存的初始根文件系统,内核启动时将其解压到。RAM Disk 将文件系统镜像加载到内存中的块设备(如。原创 2025-02-23 01:35:43 · 746 阅读 · 0 评论 -
stm32mp采用spi接口扩展can
在 STM32MP 系列微处理器中,通过 SPI 转 CAN 功能扩展 CAN 接口需要结合硬件设计(如使用 SPI 接口的 CAN 控制器芯片)和 Linux 驱动配置。// 片选引脚(根据硬件设计调整)实际应用中需根据硬件设计调整设备树和驱动参数,确保 SPI 时序和中断配置正确。重新编译内核或模块,部署到 STM32MP 目标板。接收 CAN 数据(终端1)发送 CAN 数据(终端2)配置 CAN 接口参数。原创 2025-02-23 00:22:35 · 661 阅读 · 0 评论 -
高性能MCU嵌入脚本语言挺需要的~
正文大家好,我是bug菌~前段时间跟大家聊过现在的MCU是越来越强了,<现在的MCU都这么强了吗?>,性能越强,当然责任也就越大,干的活自然也就要多点,随着RTOS及配套中间软件的发展,现在MCU早已经不是早期的8位单片机样子了,而更多的像MPU去掉MMU的阉割版,其实也可以看到现在MPU芯片市场受到了MCU的冲击,也纷纷提供了非MMU的裸机方案,或者带MCU的异构方案,也真是不容易呀...原创 2025-01-14 21:15:56 · 680 阅读 · 0 评论 -
从设计哲学了解linux为何如此强~
正文大家好,我是bug菌~在这个软件开源的时代,对于大部分嵌入式软件开发者来说并不需要从零去设计和编写一个软件,不管是内核包括嵌入式linux或RTOS等实时操作系统,还是一些驱动库、设计模式及框架基本都可以找到合适的开源项目,并且还存在大量的开源代码应用示例等。那么如何完美地利用这些资源来帮助我们开发项目呢?最基本的便是知道它是干啥的,提供了哪些API服务供功能使用,然而有时候并不是非常契合,我...原创 2025-01-06 21:03:35 · 761 阅读 · 0 评论 -
linux应用程序实现类似于RT-Thread的finsh
通过telnet连接到服务器并发送命令的详细步骤。这种方法将实现一个简单的服务器-客户端模型,服务器运行你的命令行解释器,客户端通过telnet连接到服务器并发送命令。原创 2025-01-16 14:32:43 · 162 阅读 · 0 评论 -
嵌入式OAT升级中的SWUpdate工具
SWUpdate 是一个用于嵌入式系统的软件更新工具,支持灵活和强大的软件更新机制。原创 2025-01-16 13:39:27 · 1169 阅读 · 0 评论 -
详细说明嵌入式linux中bootcmd与bootargs差异
bootcmd和bootargs。原创 2025-01-01 23:26:20 · 428 阅读 · 0 评论 -
linux下的/usr可不是user而是Unix Software Resource
usr 目录,这里的usr 不是 user 的缩写,而是 Unix Software Resource 的缩写。原创 2025-01-01 22:42:45 · 595 阅读 · 0 评论 -
uboot与kernel通常不位于安全secure区域
综上所述,U - Boot和内核的位置需要根据系统的具体安全需求和设计架构来确定,既可以都在非安全区域,也可以部分或全部位于安全区域,以满足不同场景下的安全和性能要求。原创 2024-12-28 17:36:23 · 1253 阅读 · 0 评论 -
学习一下USB DFU
USB DFU(USB Device Firmware Upgrade,USB设备固件升级)是一种用于在USB设备上进行固件更新的标准化协议。原创 2024-12-24 00:46:08 · 1027 阅读 · 0 评论 -
linux下各文件类型与作用
普通文件(-)定义:这是最常见的文件类型,由各种应用程序创建。它包含了实际的数据,如文本内容、图像像素数据、音频采样数据等。示例:文档文件:像使用文本编辑器(如Vim、gedit)创建的.txt文件,其中存储的是字符编码后的文本内容。例如,一篇论文、一份报告或者一篇小说等。图片文件:如.jpg、.png格式的文件。以.jpg文件为例,它使用了JPEG压缩算法来存储图像的像素信息,包括颜色、亮度等数据,这些数据是通过数码相机拍摄或者图形编辑软件生成的。音乐文件:例如.mp3、.wav格式的文件原创 2024-12-21 00:18:38 · 967 阅读 · 0 评论 -
STM32MP1linux根文件系统目录作用
/bin定义:“bin”是“binary”(二进制)的缩写。这个目录存储了一些基本的二进制可执行命令文件,这些命令是系统启动和用户在命令行中基本操作所必需的。内容示例:像“ls”(用于列出目录内容)、“cp”(用于复制文件)、“mv”(用于移动文件)等常用命令都存放在这里。这些命令可以被所有用户执行,因为它们对于系统的基本操作至关重要。重要性:如果这个目录中的文件损坏或丢失,系统的很多基本操作都将无法正常进行,例如无法查看文件列表、复制文件等基本任务。/usr/bin定义:“usr”代表原创 2024-12-21 00:11:57 · 818 阅读 · 0 评论 -
systemd中的journalctrl和-f跟踪
选项,日志查看工具通常只会显示日志文件中已经存在的内容。但是,对于正在运行的服务,这种静态查看方式无法及时捕捉到新出现的问题或者行为变化。例如,一个数据处理服务在处理大量数据时,通过跟踪日志可以观察到它是如何分配资源、处理数据块的顺序以及是否出现资源瓶颈等信息。:有些日志查看工具允许根据时间范围来查看日志,如查看过去一小时或者一天内的日志。选项的命令来查看服务日志时,工具会持续监视日志文件的更新情况,并实时显示新添加到日志中的内容。:当一个新的服务刚刚部署或者一个未知的服务出现问题时,使用。原创 2024-11-17 15:55:17 · 982 阅读 · 0 评论 -
在system d下写一个守护进程
以下是一个使用systemd创建守护进程的示例,假设我们要创建一个简单的守护进程,它每隔一定时间就将当前时间写入到一个日志文件中。原创 2024-11-17 15:32:34 · 653 阅读 · 0 评论 -
用systemd创建守护进程更加简单
它会自动处理与守护进程相关的输入输出重定向等操作,确保守护进程能够在合适的环境下运行。例如,systemd可以将守护进程的标准输出和标准错误输出重定向到系统日志,这样就避免了守护进程因为向不存在的终端输出而出现问题,同时也方便了系统管理员查看守护进程的运行信息。它会以一种更加集中和高效的方式来处理进程相关的操作。systemd本身就像是一个进程“管家”,在启动守护进程时,它会根据配置文件(单元文件)中的指令来创建进程,并且自动处理很多底层的细节,守护进程本身就不需要操心创建子进程来脱离终端之类的操作。原创 2024-11-17 15:25:00 · 299 阅读 · 0 评论 -
systemd下守护进程的pid文件的作用
在守护进程启动后,systemd会读取PID文件中的PID编号,从而将这个PID与它所管理的守护进程相关联。如果systemd发现根据PID文件中的PID编号在系统中找不到对应的进程(可能是进程因为某种原因崩溃,如遇到未处理的错误、内存不足等导致异常退出),systemd就会认为守护进程出现了问题。总之,systemd利用PID文件中的PID编号来精确地监控守护进程的状态,并且能够在守护进程意外消失时采取恢复措施,这是现代Linux系统服务管理中的一个重要机制。的守护进程可能会在启动时将自己的PID写入。原创 2024-11-17 12:16:55 · 314 阅读 · 0 评论 -
为什么守护进程需要把工作目录修改为根文件?
守护进程通常是以系统权限或者特殊权限运行的,如果它一直处于某个用户目录下,可能会带来安全隐患,比如意外地修改或访问用户的敏感文件。:根目录是文件系统中始终存在的部分,将守护进程的工作目录修改为根目录可以避免因其他目录被挂载、卸载或其他操作而导致的文件访问问题。例如,在服务器环境中,守护进程持续运行很长时间,将工作目录设置为根目录可以确保它在文件系统发生各种变化时仍能稳定地访问所需的基本资源。守护进程以根目录为工作目录后,可以更方便地访问这些系统资源,而且路径也相对更简单、更易于管理和理解。原创 2024-11-17 02:37:43 · 210 阅读 · 0 评论 -
linux守护进程与后台进程的区别
后台进程是指在操作系统后台运行的进程,它不与用户直接交互(没有连接到用户的终端)。用户在终端中启动一个程序并让其在后台运行(如通过在命令后加“&”符号),这个程序就成为后台进程。后台进程可以是任何类型的程序,比如一个长时间运行的数据处理脚本、一个持续监听网络端口的简单服务程序等。守护进程是一种特殊的后台进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些特定事件。守护进程通常在系统启动时就开始运行,一直持续到系统关闭。它主要用于为系统或其他进程提供服务,如httpd(提供网页服务)、sshd。原创 2024-11-06 22:59:24 · 540 阅读 · 0 评论 -
linux终端控制进程的前后台执行
这样,命令会立即返回终端提示符,同时脚本在后台继续执行。你可以继续在终端中执行其他命令。在执行命令时,在命令后面加上“&”,该进程就会在后台运行。例如,运行一个长时间运行的脚本。表示作业号为1的进程,如果只有一个暂停的进程,通常就是它;如果一个进程已经在运行并且被暂停(例如,使用。命令将其放入后台继续运行。暂停了一个正在前台运行的进程),可以使用。进程就会在后台运行。fg %<作业编号>原创 2024-11-06 22:04:58 · 391 阅读 · 0 评论 -
GCC编译器的`-Wall`、`-Wextra`和`-pedantic`选项解读
gcc是广泛使用的开源编译器,-Wall-Wextra和-pedantic是gcc。原创 2024-11-05 22:47:32 · 962 阅读 · 0 评论 -
32位的ARMlinux的4字节变量原子访问问题
指令支持:ARM处理器提供了对32位整数的原子操作指令,如原子加法(LDREX/STREX),这些指令能够确保在并发环境中对32位变量的访问是原子的。对齐问题:虽然小于4字节的变量可以在内存中对齐,但它们的读取和写入可能不在一个原子操作中完成,这可能会在多线程环境中引发竞态条件。内存模型:ARM的内存模型设计上支持对齐的原子访问,对于4字节的整型变量,在没有竞争条件的情况下,访问是安全的。编译器优化:编译器在优化过程中可能会改变访问顺序,尤其是在处理较小数据类型时,这可能导致未定义的行为。原创 2024-10-27 22:35:57 · 232 阅读 · 0 评论 -
linux内核的原子操作与用户态的原子操作差别
直接依赖于硬件提供的原子指令(如CAS、原子加等),通过内核提供的函数(如atomic_add()、atomic_sub()等)进行实现,确保在多处理器环境中的操作不可被打断。内核的原子操作更接近硬件层,提供高效的资源管理,而用户态的原子操作更注重多线程程序中的数据共享与安全。两者的选择依赖于具体的应用场景和需求。在多线程场景中可能会引入更多的上下文开销,尤其是在使用互斥锁等同步机制时,但使用原子操作可以减少锁的争用。提供低级的操作,允许细粒度的控制,通常涉及特定的数据结构和内核机制。原创 2024-10-27 22:21:55 · 269 阅读 · 0 评论 -
linux驱动访问的地址为虚拟地址
用户空间的应用程序无法直接访问内核空间的虚拟地址,这种保护机制确保了操作系统的稳定性和安全性。在64位系统中,内核虚拟地址范围更大,通常是从0xFFFFFFFF80000000开始,用户空间和内核空间的划分可以根据内核配置进行调整。内核空间的虚拟地址通常在每个进程的虚拟地址空间中是相同的。在Linux中,内存被划分为用户空间和内核空间。虚拟地址是由操作系统为每个进程提供的一种抽象地址,允许进程在自己的地址空间中运行,而不必知道物理内存的实际布局。在Linux内核中,内核空间和用户空间的地址是分开的。原创 2024-10-20 17:59:50 · 348 阅读 · 0 评论 -
linux的随机化处理
Linux的随机化处理是一项重要的安全措施,通过对程序的内存布局进行随机化来降低攻击成功的几率。虽然随机化处理不能完全消除所有的安全威胁,但它确实为系统提供了一层额外的防护,使得攻击者更难以利用已知的漏洞。Linux的随机化处理(或称为地址空间布局随机化,ASLR)是一种安全特性,旨在提高系统对抗攻击的能力,尤其是缓冲区溢出和代码注入攻击。通过随机化内存地址,攻击者在利用缓冲区溢出等漏洞时,无法确定恶意代码的确切位置,从而降低成功攻击的几率。共享库:程序所依赖的动态链接库在内存中的加载地址会随机化。原创 2024-10-19 15:47:19 · 554 阅读 · 0 评论 -
arm-none-linux-gnueabi-strip的作用
总的来说,arm-none-linux-gnueabi-strip 是一个非常有用的工具,可以有效优化 ARM 架构上可执行文件的大小,提高加载速度,并保护软件的隐私。去除调试信息和符号:arm-none-linux-gnueabi-strip 可以去除 ARM 可执行文件和目标文件中的调试信息、符号表和其他不必要的元数据,从而减小文件的体积。适用性:确保在针对 ARM 架构的应用程序上使用 arm-none-linux-gnueabi-strip,而不是其他平台的 strip 工具。原创 2024-10-18 21:31:57 · 575 阅读 · 0 评论 -
posix接口与system V接口及其异同
标准化: POSIX(可移植操作系统接口)是由IEEE制定的标准,旨在提供统一的API,以实现不同操作系统间的兼容性。新项目: 如果在开发新的应用程序或项目,推荐使用POSIX接口,因其标准化程度高,更易于理解和维护。遗留系统: 在维护旧有系统时,可能需要使用System V接口,特别是在与老旧代码或系统交互时。复杂性: 相比于POSIX,System V的API更复杂,使用时需要更多的初始化和管理。消息队列: 使用mq_open, mq_send, 和mq_receive。原创 2024-10-09 22:56:22 · 418 阅读 · 0 评论 -
protobuff中的required有什么用?
在 Protocol Buffers(protobuf)中,required关键字用于指定某个字段是必需的。这意味着在序列化和反序列化过程中,必须提供该字段的值,否则消息将被视为无效。原创 2024-09-28 10:10:59 · 340 阅读 · 0 评论 -
linux的repo工具的入门
repo 是一个工具,用于管理 Git 仓库的集合,尤其在 Android 开发中被广泛使用。它是 Google 为 Android 项目开发的,以简化对大量 Git 仓库的管理。原创 2024-06-16 14:35:22 · 651 阅读 · 2 评论 -
linux用户态操作GPIO首先需要export导出
通过 export 文件来导出 GPIO 是为了让内核知道用户空间程序正在使用哪一个 GPIO 引脚,从而进行必要的初始化和管理,确保资源的正确分配和安全访问。这种机制使得 GPIO 的管理更加系统化和规范化,提高了系统的可靠性和灵活性。原创 2024-06-11 22:40:18 · 1193 阅读 · 0 评论 -
显示子系统,显示子前后端,linuxfb,wayland
例如,在 Linux 系统中,显示后端通常由图形驱动程序提供,它与 DRM(Direct Rendering Manager)子系统进行交互,将图形数据传输到显示设备上。它负责接收来自应用程序或图形引擎的图形数据,并将其转换成适合显示的格式,以便发送到显示后端进行处理和输出。图形数据输出:显示后端负责将图形数据转换成适合在显示设备上显示的格式,并将其传输到显示设备上。图形数据生成:显示前端接收来自应用程序或图形引擎的图形数据,可能包括图像、文本、图形元素等,然后将其转换成适合在屏幕上显示的格式。原创 2024-06-09 23:13:47 · 979 阅读 · 0 评论 -
解读下/etc/network/interfaces配置文件
etc/network/interfaces 是一个常见的网络配置文件,通常在 Debian 及其衍生版本的 Linux 发行版中使用。auto eth0 和 iface eth0 inet static 部分配置了主要的以太网接口(Ethernet interface),通常是 eth0,采用静态 IP 地址分配方式。你的系统上的 /etc/network/interfaces 文件可能会根据网络配置的具体情况有所不同。address 指定了本机的 IP 地址为 192.168.1.100。原创 2024-06-09 18:27:16 · 1805 阅读 · 0 评论 -
linux中dd命令以及如何测试读写速度
其中,/dev/zero和/dev/null是两个常用的特殊文件,它们分别用于生成无限数量的零字节和丢弃所有写入的数据。测试写入速度时,dd命令会不断地从/dev/zero设备读取数据,并写入到指定的测试文件中,同时使用conv=fdatasync参数确保数据写入到磁盘。测试读取速度时,dd命令会从指定的测试文件中读取数据,并将其丢弃到/dev/null设备中,不写入到任何文件,从而测试读取速度。执行这两个命令后,dd命令会输出读写的速度信息,包括每次读写的数据量以及花费的时间,从而可以计算出读写速度。原创 2024-06-08 20:25:02 · 1387 阅读 · 0 评论 -
详解linux设备下的/dev/null
dev/zero是一个特殊的设备文件,它在Linux系统中通常被用来生成无限数量的零数据流。这个设备文件位于/dev目录下,它不代表任何实际的硬件设备,而是一个虚拟设备。当从/dev/zero设备中读取数据时,会得到无限数量的零字节,这些字节的值都是0。因此,/dev/zero常用于生成大量的零数据流,例如在创建文件时初始化数据、进行测试或者模拟特定场景。原创 2024-06-08 20:07:45 · 638 阅读 · 0 评论 -
stm32mp157为什么要把相同的tf-A trust烧录emmc的boot1和boot2?
安全性: TF-A是用于启动和配置系统的基础固件,其中包含了一些关键的安全功能,如Secure Monitor,用于安全启动过程的控制。通过将TF-A烧录到两个引导区域,可以增加系统的安全性,因为即使一个区域受到攻击或损坏,系统仍然可以从另一个区域启动,并保持安全性。如果其中一个引导区域发生故障,系统可以从另一个引导区域启动,提高了系统的可靠性和稳定性。综上所述,将相同的TF-A烧录到STM32MP157的eMMC的Boot1和Boot2区域是为了提高系统的冗余性、可靠性和安全性,以及便于固件更新。原创 2024-06-02 17:59:06 · 407 阅读 · 0 评论 -
详解makefile中的foreach
在这个例子中,$(foreach file, $(FILES), $(file:.c=.o)) 将会遍历 FILES 变量中的每个文件名,并将每个文件名的 .c 扩展名替换成 .o,最终得到 OBJS 变量的值为 “file1.o file2.o file3.o”。在 Makefile 中,foreach 函数用于迭代处理一个以空格分隔的列表,并针对列表中的每个元素执行相同的操作。) 将会遍历 LIBS 变量中的每个库文件名,并将每个库文件复制到 /usr/local/lib/ 目录下。原创 2024-05-28 23:50:25 · 1556 阅读 · 0 评论 -
详解make file中的notdir
在这个例子中,$(notdir $(SRCS)) 将会从 SRCS 变量中的每个文件路径中提取文件名部分,并将处理后的结果赋值给 OBJS 变量。在这个示例中,$(notdir $(wildcard $(addprefix $(VPATH)/,*.c))) 将会从 VPATH 目录下的所有 .c 文件的路径中提取文件名部分,从而得到所有的 .c 文件名。) 函数在 Makefile 中非常有用,可以帮助我们从路径中提取文件名部分,实现灵活的文件处理和路径操作。:一组空格分隔的文件名或路径。原创 2024-05-28 23:43:05 · 602 阅读 · 0 评论 -
详解makefile中addprefix
(SOURCES:.c=.o)) 将会在 SOURCES 变量中的每个文件名后面添加 obj/ 前缀,并将处理后的结果赋值给 OBJS 变量。在这个示例中,$(addprefix $(VPATH)/,file1.c file2.c file3.c) 将会在 file1.c file2.c file3.c 的每个文件名前面添加 $(VPATH)/ 前缀,从而构建出完整的路径。) 函数在 Makefile 中非常有用,可以帮助我们将指定的前缀添加到一组文件名或路径中,实现灵活的路径拼接和文件处理。原创 2024-05-28 23:39:54 · 951 阅读 · 0 评论