Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java访问/dev/mem_Java_Linux_Raspberry Pi - Fatal编程技术网

通过Java访问/dev/mem

通过Java访问/dev/mem,java,linux,raspberry-pi,Java,Linux,Raspberry Pi,我试图使用Java中Raspberry PI的PWM,而不使用WiringPi/Pi4j或任何其他库。到目前为止,我了解到控制PWMs的唯一方法是通过内存映射/dev/mem文件并在那里设置适当的寄存器。WiringPi就是这样做的(见),人们也经常在网上询问 我正面临着一个似乎与覆盆子无关的问题,这就是为什么我在通用SO论坛上提出这个问题。我在我的Ubuntu笔记本电脑上测试了以下症状呈阳性 因此,我尝试使用这段简单的代码,这似乎是一个再现问题的最小示例,运行sudo: 导入java.io.R

我试图使用Java中Raspberry PI的PWM,而不使用WiringPi/Pi4j或任何其他库。到目前为止,我了解到控制PWMs的唯一方法是通过内存映射
/dev/mem
文件并在那里设置适当的寄存器。WiringPi就是这样做的(见),人们也经常在网上询问

我正面临着一个似乎与覆盆子无关的问题,这就是为什么我在通用SO论坛上提出这个问题。我在我的Ubuntu笔记本电脑上测试了以下症状呈阳性

因此,我尝试使用这段简单的代码,这似乎是一个再现问题的最小示例,运行
sudo

导入java.io.RandomAccessFile;
导入java.nio.MappedByteBuffer;
导入java.nio.channels.FileChannel;
公共班机{
公共静态void main(字符串[]args){
试一试{
RandomAccessFile文件=新的RandomAccessFile(“/dev/mem”、“rw”);
long size=12345;//任何大于0的值-似乎都不相关。
MappedByteBuffer out=file.getChannel().map(FileChannel.MapMode.READ_WRITE,0,size);
//在这里,我计划对寄存器进行一些写操作。
}捕获(例外e){
e、 printStackTrace();
}
}
}
我甚至没有尝试读取任何数据或更改内部指针位置。我从调用
map(…)
得到以下堆栈跟踪:

调试代码时,我在
map(…)
的实现中注意到了这一点(在
sun/nio/ch/FileChannelImpl.java
中):

filesize=nd.size(fd);
文件大小计算为0。我不知道如何进行更深入的调试,因为它似乎已经是通过JNI进行的本机调用

通过命令行检查此文件的大小将显示
1

$ll| grep mem
crw-r-----1根kmem 1,1唇2 13:12 mem
我查看了手册页:,但它似乎没有解决这个特定的问题

当我发现JDK版本很重要时,它变得更有趣了。它不能在Oracle的11.0.1和OpenJDK14.0.1上工作。但是,它在Oracle的8.0.191上确实有效(不会崩溃)。我在将这个JDK的源代码附加到我的调试器时遇到了一些问题,因此我无法像使用其他版本那样对它进行深入的调试。我也不能在我的Raspberry上使用JDK 8,我在安装它时遇到了一些问题。我认为更好地理解这个问题,而不是坚持一个JDK

我做错了什么?用C/C++或Python映射
/dev/mem
似乎很容易,我在RPI论坛上看到了很多例子。我真的希望尽可能长时间地保持纯Java。从理论上讲,在更新的JDK中也存在bug的风险,但我想在提交bug之前获得一些第二种意见,特别是我不精通低级Linux

谢谢, 彼得

java.io.IOException: Invalid argument
    at java.base/sun.nio.ch.FileDispatcherImpl.truncate0(Native Method)
    at java.base/sun.nio.ch.FileDispatcherImpl.truncate(FileDispatcherImpl.java:86)
    at java.base/sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:987)
    at Main.main(Main.java:10)