在 C/C++ 编程中,readl 函数通常出现在 Linux 内核开发或底层硬件操作场景中。它的核心功能是:从内存映射的 I/O 地址(MMIO)安全读取 32 位(4 字节)数据。
关键点说明:
-
名称含义:
readl= read + l(long),代表读取 32 位数据(在 Linux 内核中,long通常指 32 位)。 -
典型使用场景:
- 操作硬件寄存器(如 CPU 外设、PCI 设备等)
- 驱动程序开发中访问硬件资源
-
内核代码示例:
#include <linux/io.h> // 必需的头文件 void __iomem *reg_addr = ioremap(0xFE000000, 4); // 映射硬件地址到虚拟地址 u32 value = readl(reg_addr); // 读取 32 位值 -
主要特点:
- 地址对齐:要求访问 4 字节对齐地址(未对齐可能触发 CPU 异常)
- 内存屏障:隐含
rmb()屏障,确保读取顺序(防止编译器/CPU 乱序优化) - 字节序:不转换字节序,直接按硬件原生顺序读取(需开发者处理端序问题)
-
用户空间替代方案: 如果在用户空间程序中使用:
uint32_t value = *(volatile uint32_t*)mmap_addr;
常见组合函数:
| 函数 | 位宽 | 作用 |
|---|---|---|
readb() |
8位 | 读取单字节 |
readw() |
16位 | 读取 16 位(半字) |
readl() |
32位 | 读取 32 位(字) |
readq() |
64位 | 读取 64 位(双字) |
注意事项:
- 仅限内核态:
readl()是 Linux 内核 API,用户态程序无法直接调用 - 安全风险:错误地址可能导致系统崩溃(蓝屏/内核 panic)
- 替代方案:用户态建议通过
/dev/mem+mmap方式操作硬件
⚠️ 重要提示:使用
readl()需深刻理解硬件工作原理,滥用可能导致系统不稳定!建议查阅内核文档:Linux Memory-Mapped I/O
Linux中readl和writel函数的使用方法
writel() 往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节)。
2019-04-26 16:22:42
C语言-内联函数、递归函数、指针函数
这篇文章介绍C语言的内联函数、递归函数、函数指针、指针函数、局部地址、const关键字、extern关键字等知识点;这些知识点在实际项目开发中非常常用,非常重要。
2022-08-14 10:03:14
复变函数的共轭和原函数的关系
复变函数的共轭和原函数的关系 复变函数的共轭与原函数之间存在着密切的关系,这是因为共轭和原函数都是复数函数中的重要概念。在数学和物理学领域中,复数函数是非常重要的,因为它们可以应用于各种重要
2023-09-07 16:43:45
C语言函数的回调函数
来源:嵌入式客栈 1 什么是回调函数?首先什么是回调呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。 如果代码立即被执行就称为同步回调
2020-09-11 09:57:19
函数指针与回调函数的应用实例
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。
2024-03-07 11:13:24
SUMIF函数与SUMIFS函数的区别
SUMIF函数和SUMIFS函数都是Excel中用于条件求和的函数,它们可以帮助用户根据特定的条件对数据进行求和。尽管它们的基本功能相似,但在使用场景和功能上存在一些差异。以下是对这两个函数的比较
2024-10-30 09:51:58
一文详解函数指针与回调函数
函数指针是指向函数的指针变量。它允许我们将函数作为参数传递给其他函数或将函数作为返回值返回。函数指针的类型与所指向的函数的类型相匹配。
2023-08-22 10:36:11
python定义函数与调用函数的顺序
定义函数与调用函数的顺序 函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。但是在 Python 中我们要注意一个关键点,就是Python不允许前向引用,即在函数
2023-10-04 17:17:00
如何查看及更改函数/函数块的调用环境
模块化设计的思想是把一些相似的功能(比如电机控制、阀控制)设计成函数或函数块,这样就可以反复调用。其优点是:使程序架构更加清晰,避免重复编写相似功能的代码。不过可能会产生一个疑惑:既然PLC的程序
2023-11-17 09:08:39
python函数与函数之间的调用
函数与函数之间的调用 3.1 第一种情况 程序代码如下: def x ( f ): def y (): print ( 1 ) return y def f (): print ( 2 )x(f
2023-10-04 17:17:00
Linux共享库的构造函数和析构函数
共享库有类似C++类构造和析构函数的函数,当动态库加载和卸载的时候,函数会被分别执行。一个函数加上 constructor的 attribute就成了构造函数;加上 destructor就成了析构函数。
2020-06-22 09:18:48
sprintf函数耗时是strcat函数的几倍呢?
我们在写代码的时候总是被领导告知**慎用sprintf函数**,这个函数占用CPU时间较多,对于字符串拼接可以使用strcat函数替代(并未所有情形都可替代)。
2023-10-26 14:28:09
什么是Lambda函数
今天来给大家推荐一个 Python 当中超级好用的内置函数,那便是 lambda 方法,本篇教程大致和大家分享 什么是 lambda 函数 lambda 函数过滤列表元素 lambda 函数
2023-10-17 11:27:48
斯坦福 DS345 函数发生器 DS345 — 30 MHz 函数/ARB 发生器
2025-09-12 16:13:40
C语言内部函数与外部函数介绍
一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。 在函数中出现的对变量的声明,除了用extern声明的以外都是定义,在函数中对其他函数的声明不是函数的定义
2023-03-10 14:36:55
虹科分享|关于阻塞函数和非阻塞函数
关于阻塞函数和非阻塞函数在CAN和LIN相关的开发库里,不可避免的会出现“收”和“发”的函数。如何快速有效的处理数据,是开发中重要的事项。
2022-07-05 14:38:43
为什么中断处理函数不能直接调用不可重入函数
1 前言 最近在公司维护的项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误——在中断处理函数中调用了 printf 函数,因为中断处理函数的调用了不可重入函数,导致
2021-02-17 09:33:00
函数与递归-2
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式 此传参方式可以让函数和函数外面的变量建立起真正的联系。也就是说,函数内部可以直接操作函数外部的变量。
2023-02-21 15:53:01
python匿名函数的使用
python匿名函数的使用 匿名函数(英语:anonymous function)是指一类无需定义标识符(函数名)的函数。通俗来说呢,就是它可以让我们的函数,可以不需要函数名。 正常情况下,我们定义
2022-03-02 16:42:09
Python入门之什么是函数
Python函数比我们想象的更为灵活。由于Python函数是对象,所以函数对象可以赋值给其他的名字、传递给其他函数、嵌入到数据结构、从一个函数返回给另一个函数,等等,就好像它们是简单的数字或字符串。 下面的代码演示了把一个函数对象赋给其他的名称并调用它:
2023-02-21 14:24:17
FreeRTOS中内核控制函数
1、函数 taskYIELD() 此函数用于 进行任务切换 ,此函数本质上是一个宏。 2、函数 taskENTER_CRITICAL() 进入临界区 ,用于任务函数中,本质上是一个宏。 3、函数
2023-07-06 16:53:05
函数的参数
对比功能块,函数没有任何他们保存参数值的内存。在函数激活时,本地数据只中临时地贮存。由于这个原因,当调用函数时,所有在函数声明部分定义的形式输入、输入/输出和输出参数必须赋予实际参数。
2023-04-27 15:26:26