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() 宏函数相关推荐

  1. Kernel API(一)writeb(), writew(), writel(),readb(), readw(), readl()

    一.writeb(), writew(), writel() 宏函数 功能 : 往内存映射的 I/O 空间上写数据. writeb() I/O 上写入 8 位数据 (1字节) writew() I/O ...

  2. 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 ...

  3. linux 打印函数宏,linux内核中的嵌入式汇编宏函数

    在看linux内核代码时,常会遇到诸如:static inline _syscall0(int,fork)这样的函数.经查阅资料,发现该函数是嵌入式汇编宏函数. linux内核提供了7个非常有用的宏定 ...

  4. python展开 c函数中的宏预处理_最基本的宏函数 课后习题9.2 (C语言代码)

    解题思路 利用宏函数. 函数. 本题的难点肯定不在算法, 应该是宏函数! 带参宏定义的一般形式为:#define 宏名(形参表) 字符串; 在字符串中含有各个形参. 带参宏调用的一般形式为: #def ...

  5. Report Studio值提示通过prompt宏函数给sql查询传参

    场景:当我们在DW中新建了一个表,但是在FM中没有创建模型,想针对这个表直接做一个报表,那么就需要在reportstudio中直接用sql来查询,为了追求查询速度,我们可以把页面用户选择的条件直接传给 ...

  6. c/c++宏函数的定义与使用(宏定义函数)(macro definition)

    文章目录 为什么要使用宏函数? 什么是宏 如何使用宏 宏的定义 不带参数的宏 带参数的宏(假参数,不是真正的参数,只是替换而已) 原理 对了,如果宏函数与函数名称相同,优先使用宏定义函数 为什么要使用 ...

  7. #define定义宏函数 的正确使用

    如何使用宏来定义一个自定义函数呢? 首先我们来看下面这段代码 #define SQUARE(x) x*x int main() {int a = 5;printf("SQUARE(a): % ...

  8. define关键字的使用,以及宏函数的定义

     define关键的作用是预定义 好处是:预定义的值只要改变了,程序中只要是使用了预定义的部分就可以一改全改. 截图如下: 上面的部分程序仍然可以正常输出. 3.关于宏函数 #include< ...

  9. python展开 c函数中的宏预处理_C 语言常用的预处理-宏函数

    #include // 宏函数 三目运算符 #define MAX(A, B) A>B?A:B //宏函数 多行 添加\直接回车 #define LOOP(FROM, TO, CONTENT)\ ...

最新文章

  1. 数据人必须会的技能,用手机查看数据报告真香
  2. java自动定义一个map类_自定义实现Map类 高效版
  3. hiveServer2 和 metastore的一点解读。
  4. NASA公布“门户计划”,在月球轨道建立空间站进一步探索月球
  5. 桩筏有限元中的弹性板计算_永清县打桩机租赁钢板桩租赁怎么联系?
  6. H5之audio标签放音兼容所有浏览器方法
  7. java开心消消乐代码_Vue实现开心消消乐游戏算法
  8. YOLO 系目标检测算法家族全景图!
  9. 罗永浩直播成绩单:3小时带货超1.1亿元,近5000万人来听相声
  10. 互联网公司分批返岗;Safari 将封杀超过398天的 HTTPS 证书;TypeScript 3.8 发布 | 极客头条...
  11. linux脚本定时执行,Shell脚本实现每个工作日定时执行指定程序
  12. 一张图看懂BGP邻居关系建立过程和BGP报文简介
  13. 一条 update 语句引起的事故,这回可以长长记性了
  14. mysql 主从故障恢复
  15. STM32开发,使用IAR软件建立工程
  16. nodejs下载文件
  17. php裂变函数,python实现红包裂变算法
  18. 携手强化「内容审核」能力,融云与数美科技达成战略合作!
  19. AndroidStudio实现按钮按下时状态改变以及选择器属性及基本用法
  20. Excel 2011 显示被隐藏的第一行

热门文章

  1. 数字图像处理学习笔记之一 DIP绪论与MATLAB基础
  2. 双重游标的使用以及动态游标的使用
  3. 剑指Offer-12:矩阵中的路径
  4. (附源码)nodejs+mysql+node基于vue框架的游戏商城设计及开发 -《夜幕》毕业设计262127
  5. CentOS7快速搭建DNS中转服务器
  6. 读书寄语:慎独自律,学思并重
  7. 详解:动态规划算法【Java实现】——背包问题
  8. Latex 中的警告 Foreign command \atop 的解决方法
  9. 分享几个实用的微信小程序(三)
  10. 联通3G APN设置