readb(), readw(), readl(),writeb(), writew(), writel() 宏函数
readb(), readw(), readl()函数
功能:
从内存映射的 I/O 空间读取数据。
readb 从 I/O 读取 8 位数据 ( 1 字节 );
readw 从 I/O 读取 16 位数据 ( 2 字节 );
readl 从 I/O 读取 32 位数据 ( 4 字节 )。
原型:
#include <asm/io.h>
unsigned char readb (unsigned int addr )
unsigned char readw (unsigned int addr )
unsigned char readl (unsigned int addr )
变量:
addr I/O 地址。
返回值: 从 I/O 空间读取的数值。
writeb(), writew(), writel() 宏函数
功能:
往内存映射的 I/O 空间上写数据。
writeb() I/O 上写入 8 位数据 (1字节)
writew() I/O 上写入 16 位数据 (2字节)
wirtel() I/O 上写入 32 位数据 (4字节)
原型:
引用
#include <asm/io.h>
void writeb (unsigned char data, unsigned short addr)
void writew (unsigned char data, unsigned short addr)
void writel (unsigned char data, unsigned short addr)
变量:
data I/O 地址;
data 数据。
内核里面writel(readl)是如何实现的?
writel和readl,这两个个函数实现在操作系统层,有内存保护的情况下,往一个寄存器或者内存地址写一个数据。先说一下writel:
在arch/alpha/kernel/io.c中有
188 void writel(u32 b, volatile void __iomem *addr)
189 {
190 __raw_writel(b, addr);
191 mb();
192 }
这样一个writel函数的作用应该是向一个地址上写一个值,我想知道这个函数底下具体实现的细节,于是往下继续跟踪代码:__raw_writel(b, addr);(发现在同目录下)
129 void __raw_writel(u32 b, volatile void __iomem *addr)
130 {
131 IO_CONCAT(__IO_PREFIX,writel)(b, addr);
132 }
再往下跟踪 IO_CONCAT,在对应的io.h中的定义如下:
134 #define IO_CONCAT(a,b) _IO_CONCAT(a,b)
135 #define _IO_CONCAT(a,b) a ## _ ## b
这段代码前几天问过了,是标示将两边的字符串连接起来的意思。
跟踪__IO_PREFIX 定义如下
501 #undef __IO_PREFIX
502 #define __IO_PREFIX apecs
继续阅读代码,看看定义__IO_PREFIX之后紧接着包含了哪个头文件。在哪个头文
件里面寻找答案。对于你的apsec,看看以下代码段(linux-2.6.28-rc4)
arch/alpha/include/asm/core_apecs.h
------------------------------------------
#undef __IO_PREFIX
#define __IO_PREFIX apecs
#define apecs_trivial_io_bw 0
#define apecs_trivial_io_lq 0
#define apecs_trivial_rw_bw 2
#define apecs_trivial_rw_lq 1
#define apecs_trivial_iounmap 1
#include <asm/io_trivial.h>
------------------------------------------
前往arch/alpha/include/asm/io_trivial.h
------------------------------------------
__EXTERN_INLINE void
IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a)
{
*(volatile u32 __force *)a = b;
}
就是最终通过*(volatile u32 __force *)a = b;
来写入数据的。
同样的readl读取数据也和writel类似,这里就不重复了。
(如果在没有os,没有mmu的情况下,当开发板裸跑的时候,我们只需要一句话就一切ok:
*(unsigned long *)addr = value)
readb(), readw(), readl(),writeb(), writew(), writel() 宏函数相关推荐
- Kernel API(一)writeb(), writew(), writel(),readb(), readw(), readl()
一.writeb(), writew(), writel() 宏函数 功能 : 往内存映射的 I/O 空间上写数据. writeb() I/O 上写入 8 位数据 (1字节) writew() I/O ...
- linux内存映射边读边写,内存映射IO空间的读写函数writeb(), writew(), writel()
132 } IO_CONCAT定义在include/asm-$(arch)目录下的IO.H中 #define IO_CONCAT(a,b)_IO_CONCAT(a,b) #define _IO_CON ...
- linux 打印函数宏,linux内核中的嵌入式汇编宏函数
在看linux内核代码时,常会遇到诸如:static inline _syscall0(int,fork)这样的函数.经查阅资料,发现该函数是嵌入式汇编宏函数. linux内核提供了7个非常有用的宏定 ...
- python展开 c函数中的宏预处理_最基本的宏函数 课后习题9.2 (C语言代码)
解题思路 利用宏函数. 函数. 本题的难点肯定不在算法, 应该是宏函数! 带参宏定义的一般形式为:#define 宏名(形参表) 字符串; 在字符串中含有各个形参. 带参宏调用的一般形式为: #def ...
- Report Studio值提示通过prompt宏函数给sql查询传参
场景:当我们在DW中新建了一个表,但是在FM中没有创建模型,想针对这个表直接做一个报表,那么就需要在reportstudio中直接用sql来查询,为了追求查询速度,我们可以把页面用户选择的条件直接传给 ...
- c/c++宏函数的定义与使用(宏定义函数)(macro definition)
文章目录 为什么要使用宏函数? 什么是宏 如何使用宏 宏的定义 不带参数的宏 带参数的宏(假参数,不是真正的参数,只是替换而已) 原理 对了,如果宏函数与函数名称相同,优先使用宏定义函数 为什么要使用 ...
- #define定义宏函数 的正确使用
如何使用宏来定义一个自定义函数呢? 首先我们来看下面这段代码 #define SQUARE(x) x*x int main() {int a = 5;printf("SQUARE(a): % ...
- define关键字的使用,以及宏函数的定义
define关键的作用是预定义 好处是:预定义的值只要改变了,程序中只要是使用了预定义的部分就可以一改全改. 截图如下: 上面的部分程序仍然可以正常输出. 3.关于宏函数 #include< ...
- python展开 c函数中的宏预处理_C 语言常用的预处理-宏函数
#include // 宏函数 三目运算符 #define MAX(A, B) A>B?A:B //宏函数 多行 添加\直接回车 #define LOOP(FROM, TO, CONTENT)\ ...
最新文章
- 数据人必须会的技能,用手机查看数据报告真香
- java自动定义一个map类_自定义实现Map类 高效版
- hiveServer2 和 metastore的一点解读。
- NASA公布“门户计划”,在月球轨道建立空间站进一步探索月球
- 桩筏有限元中的弹性板计算_永清县打桩机租赁钢板桩租赁怎么联系?
- H5之audio标签放音兼容所有浏览器方法
- java开心消消乐代码_Vue实现开心消消乐游戏算法
- YOLO 系目标检测算法家族全景图!
- 罗永浩直播成绩单:3小时带货超1.1亿元,近5000万人来听相声
- 互联网公司分批返岗;Safari 将封杀超过398天的 HTTPS 证书;TypeScript 3.8 发布 | 极客头条...
- linux脚本定时执行,Shell脚本实现每个工作日定时执行指定程序
- 一张图看懂BGP邻居关系建立过程和BGP报文简介
- 一条 update 语句引起的事故,这回可以长长记性了
- mysql 主从故障恢复
- STM32开发,使用IAR软件建立工程
- nodejs下载文件
- php裂变函数,python实现红包裂变算法
- 携手强化「内容审核」能力,融云与数美科技达成战略合作!
- AndroidStudio实现按钮按下时状态改变以及选择器属性及基本用法
- Excel 2011 显示被隐藏的第一行