ioread32函数有关知识

x86体系和ARM体系的寻址方式是有差别的:

x86下,为了能够满足CPU高速地运行,内存与CPU之间通过北桥相连并通过地址方式访问,而外设通过南桥与CPU相连并通过端口访问。

ARM下也实现了类似的操作,通过两条不同的总线(AHBBUSAPBBUS)来连接不同访问速度的外设。但是它与x86不同,无论是内存还是外设,ARM都是通过地址访问。

因为这两种访问方式的不同,linux分出了两种不同的访问操作:

以地址方式访问硬件——使用IO内存操作。

以端口方式访问硬件——使用IO端口操作。


ARM下,访问寄存器就像访问内存一样——从指定的寄存器地址获取数据,修改。所以,ARM下一般是使用IO内存的操作。但这并不是说IO端口的操作在ARM下不能用,它们的代码差不多,只是没有使用的必要,下面也将介绍IO内存操作。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


二、如何使用IO内存获得硬件的地址


之前已经说过,不能在linux使用实际的物理地址,要对指定的物理地址进行操作,必须要先将物理地址与虚拟地址对应,通过虚拟地址访问。于是有了以下的物理地址映射函数:

#include

void*ioremap(unsigned long phys_addr, unsigned long size);

其实这也是上一节介绍的内存分配的一种方式,它同样会建立新页表来管理虚拟地址。函数传入两个参数,需要访问的物理内存(寄存器)的首地址phys_addr和这段内存区域的大小size,返回与该段物理地址对应的虚拟地址。这段地址可以多次被映射,当然,每次映射的虚拟地址也不一样。

对应的也有撤销映射关系的函数:

voidioumap(void *addr);


接下来,我将会从一个裸板的ARMled驱动开始,讲解linux下的操作和裸板有什么不一样。

我的ARM裸板程序是在linux下编写的,我不知道这跟win下使用ADS有什么区别,在裸板驱动中,一般我是通过这样的办法来操作寄存器的:

首先,先给个地址定义个容易记的名字:

#defineGPECON *(volatile unsigned long *) 0x56000040

接着,我就要操作这个GPECON寄存器了:

*GPECON&= ~(3 << 24); //2425位清零

*GPECON|= (1 << 24); //2425位分别赋值为10

可以看到,操作寄存器其实就是拿个地址出来进行操作。其实在linux下也是一样,只是操作的时候不能使用物理地址,需要用映射出来的虚拟地址

上个函数,这个程序我将要点亮连在我开发板上的led灯,这个灯接在我开发板的GPE12上,如果需要下载程序运行,需要改一下接口

/*5th_mm_2/1st/test.c*/

1#include

2#include

3

4#include //上面介绍的函数需要包含该头文件

5

6volatile unsigned long virt, phys;//用于存放虚拟地址和物理地址

7volatile unsigned long *GPECON, *GPEDAT, *GPEUP;//用与存放三个寄存器的地址

8

9void led_device_init(void)

10{

11 phys = 0x56000000;//1、指定物理地址

12 virt = (unsigned long)ioremap(phys,0x0c);//2、通过ioremap获得对应的虚拟地址

13//0x0c表示只要12字节的大小

14 GPECON = (unsigned long *)(virt + 0x40);//3

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 要将Java中的FileInputStream转换为InputStreamReader,可以使用InputStreamReader的构造函数,该构造函数接受InputStream和Charset作为参数。因此,可以使用以下代码: ``` FileInputStream fileInputStream = new FileInputStream("example.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8); ``` 这将创建一个InputStreamReader对象,它使用UTF-8字符集读取名为"example.txt"的文件。现在,您可以使用inputStreamReader对象来读取该文件。 ### 回答2: 要将FileInputStream转换为InputStreamReader,可以使用以下代码: ```java // 创建一个FileInputStream对象 FileInputStream fis = new FileInputStream("input.txt"); // 将FileInputStream对象转换为InputStreamReader对象 InputStreamReader isr = new InputStreamReader(fis); ``` - 首先,我们创建一个FileInputStream对象,指定要读取的文件路径。这个对象将用于读取文件中的字节流。 - 然后,我们通过创建InputStreamReader对象,将FileInputStream对象转换为字符流。InputStreamReader是一个字节流和字符流之间的桥梁。它将字节流转换为字符流,使用指定的字符编码。 需要注意的是,在转换过程中,字符编码是非常重要的。如果不指定字符编码,默认会使用平台默认的字符编码。如果文件的字符编码与平台默认的字符编码不一致,可能会导致乱码问题。因此,根据实际情况,需要指定正确的字符编码,例如: ```java // 使用UTF-8编码 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); ``` 完成上述转换后,我们就可以使用InputStreamReader对象来读取文件中的字符数据了。 ### 回答3: 在Java语言中,可以使用IO流的知识将FileInputStream流转换为InputStreamReader流。 首先,我们需要引入相应的包: import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.UnsupportedEncodingException; 然后,创建一个FileInputStream对象,用于读取文件的原始字节流: FileInputStream fis = new FileInputStream("文件路径"); 接下来,我们可以将FileInputStream对象转换为InputStreamReader对象,使用特定的字符编码进行解码。常见的字符编码包括UTF-8、GBK等: InputStreamReader isr = new InputStreamReader(fis, "字符编码"); 最后,通过InputStreamReader对象,我们可以读取文本内容。可以使用read()方法逐个字符地读取,或者使用readLine()方法逐行读取: int data = isr.read(); String line = isr.readLine(); 需要注意的是,在使用完InputStreamReader后,我们需要关闭它以确保资源的释放: isr.close(); fis.close(); 使用以上的方法,我们就可以将FileInputStream流转换为InputStreamReader流,并且可以方便地读取文本内容了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值