在linux中write和writel的区别

在linux中write和writel的区别,第1张

Writeln是输出语句,输出语句有三种格式:

Write

(输出项1,输出项2)

{执行输出后光标不换行}

Writeln

(输出项1,输出项2)

{执行输出后光标换到下一行}

Writeln

{仅输出空白且光标换到下一行}

Writeln语句后面的圆括号以内部分均为输出项,可以是多项,各项间用逗号分隔;

对单引号里的内容按照引号内的原样(字符)输出显示。如果输出项是表达式,则只输出表达式的值,而不是表达式本身。

Readln是一个特殊的输入语句,要求输入一个回车(换行)才能往下执行。

Readln是输入语句,它的一般格式为:

Read

(变量1,变量2);

Readln

(变量1,变量2);

Readln

前两种格式均要从键盘给变量输入数据,输入时,所键入的数据之间以空格为分隔,以回车为输入结束。若多输入了数据(即数据个数超过变量个数),Read语句读完数据之后,能让后续的读语句接着读取多下来的数据;而Readln

语句对本行多输入的数据不能让后续语句接着读取多下来的数据。为了防止多输入的数据影响下一个输入语句读取数据,建议尽量使用Readln语句输入数据。第三种格式不需输入数据,只需按入一个回车键。

request_mem_region(gpbcon, 4, "hu"

pcon = ioremap(gpbdat, 4)

request_mem_region(gpbdat, 4, "hu"

pdat = ioremap(gpbdat, 4)

request_mem_region(gpbup, 4, "hu"

pup = ioremap(gpbdat, 4)

(1)你确定这三个内核地址映射ioremap(gpbdat, 4)里面的参数都为gpbdat?(2)0x56000010(大于1G,小于2G的物理地址),你确认你内存够大或有相应的设备的物理地址恰好在上面?

经过测试(当然是修改了那ioremap参数),若内存512M,读出全为0(不为零才怪了),若内存2048M,没问题,能正常赋值和读出。

在arch/alpha/kernel/io.c中有

188 void writel(u32 b, volatile void __iomem *addr)

189 {

190 __raw_writel(b, addr)

191 mb()

192 }

129 void __raw_writel(u32 b, volatile void __iomem *addr)

130 {

131 IO_CONCAT(__IO_PREFIX,writel)(b, addr)

132 }

在对应的io.h中的定义如下:

134 #define IO_CONCAT(a,b) _IO_CONCAT(a,b)

135 #define _IO_CONCAT(a,b) a ## _ ## b

其实是内核的东西,由于你是写驱动不是写内核,知道是往某个地址写数据就是了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7089178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存