- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在尝试使用 NDK 通过 Android 设备访问 Raspberry Pi 上的 GPIO,但在尝试了几种方法后,我总是发现某种安全墙阻止我访问它。
动机是我使用 Java API 从 GPIO 获得的速度缓慢。作为基本引用,我能够以大约 2KHz 的频率打开和关闭它,这恰好是 this list 中最差的一个。 .另见 What is Android Things Raspberry Pi GPIO max frequency? ,到目前为止还没有答案,我在其中添加了有关 Java 速度的评论。事实上,这项工作的动机是我在检查该问题时得到的结果。
目前最好的方法是尝试类似于 Debian 下的 sysfs 所采取的方法。从这个意义上讲,代码似乎是公平的,但在以 root 身份运行之后,将应用程序安装为系统应用程序(通过将其移动到/system/app)和 chmod a+rw /sys/class/gpio/下的几个不同的东西
和 /sys/class/gpio/gpio24/
还有 /dev/gpiomem
这就是我得到的:
01-27 12:54:47.069 8412 8412 I NativeHelper: Call native = hello from helper java class
01-27 12:54:47.079 8412 8412 I NativeHelper: Open pin true
01-27 12:54:47.080 8412 8412 F libc : Fatal signal 4 (SIGILL), code 1, fault addr 0xaf2e039c in tid 8412 (le.thingssample)
01-27 12:54:47.081 128 128 W : debuggerd: handling request: pid=8412 uid=10028 gid=10028 tid=8412
01-27 12:54:47.066 8412 8412 I le.thingssample: type=1400 audit(0.0:211): avc: denied { write } for name="export" dev="sysfs" ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
01-27 12:54:47.076 8412 8412 I le.thingssample: type=1400 audit(0.0:212): avc: denied { open } for path="/sys/class/gpio/export" dev="sysfs" ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
01-27 12:54:47.166 8427 8427 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-27 12:54:47.166 8427 8427 F DEBUG : Build fingerprint: 'generic/iot_rpi3/rpi3:7.0/NIF73/3565696:userdebug/test-keys'
01-27 12:54:47.166 8427 8427 F DEBUG : Revision: '0'
01-27 12:54:47.166 8427 8427 F DEBUG : ABI: 'arm'
01-27 12:54:47.167 8427 8427 F DEBUG : pid: 8412, tid: 8412, name: le.thingssample >>> com.amazingapps.sample.thingssample <<<
01-27 12:54:47.167 8427 8427 F DEBUG : signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xaf2e039c
01-27 12:54:47.167 8427 8427 F DEBUG : r0 00000000 r1 b1f5e59f r2 b1f5e59f r3 af2e1c55
01-27 12:54:47.167 8427 8427 F DEBUG : r4 00000000 r5 be8e35fc r6 acca3230 r7 be8e35d8
01-27 12:54:47.167 8427 8427 F DEBUG : r8 be8e36f8 r9 acc85400 sl 00000000 fp be8e3684
01-27 12:54:47.168 8427 8427 F DEBUG : ip be8e3590 sp be8e3598 lr ae7fbd2b pc af2e039c cpsr 60000030
01-27 12:54:47.170 8427 8427 F DEBUG :
01-27 12:54:47.170 8427 8427 F DEBUG : backtrace:
01-27 12:54:47.170 8427 8427 F DEBUG : #00 pc 0000139c /data/app/com.amazingapps.sample.thingssample-1/lib/arm/libsample.so (Java_com_amazingapps_sample_thingssample_ndk_NativeHelper_doAll+59)
01-27 12:54:47.170 8427 8427 F DEBUG : #01 pc 002c8cb3 /data/app/com.amazingapps.sample.thingssample-1/oat/arm/base.odex (offset 0x2af000)
01-27 12:54:48.133 408 8432 W ActivityManager: Force finishing activity com.amazingapps.sample.thingssample/.view.MainActivity
01-27 12:54:48.137 128 128 W : debuggerd: resuming target 8412
01-27 12:54:48.138 408 427 I BootReceiver: Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE)
01-27 12:54:48.228 8433 8433 W crash_reporter: Received crash notification for app_process32[8412] sig 4, user 10028 (handling)
01-27 12:54:48.233 8433 8433 I crash_reporter: State of crashed process [8412]: S (sleeping)
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:213): avc: denied { search } for name="8412" dev="proc" ino=214991 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=dir permissive=1
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:214): avc: denied { read } for name="exe" dev="proc" ino=217417 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=lnk_file permissive=1
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:215): avc: denied { read } for scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:216): avc: denied { open } for path="/proc/8412/status" dev="proc" ino=216902 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:217): avc: denied { getattr } for path="/proc/8412/status" dev="proc" ino=216902 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1
01-27 12:54:48.672 408 422 W ActivityManager: Activity pause timeout for ActivityRecord{f2233fb u0 com.amazingapps.sample.thingssample/.view.MainActivity t86 f}
通过 chmod a+rw/sys/class/gpio/export
至少我得到了不同并且可以打开和关闭 pin,通过方法返回值验证并检查 /sys/class/gpio/gpio24
.
我正在使用以下代码在 Raspberry Pi 3 上尝试:https://github.com/fmatosqg/androidthings_ndk/tree/SO_question
在另一种方法中,我尝试直接在 java 中加载 libperipheralman.so
,希望调用它的函数(显然这是 GPIO setValue() 所在的位置),但这次我遇到了一个不同的一些库的子集被某些安全问题拒绝加载的问题。请参阅关于他们不允许开发人员访问所有 .so 的 Nougat 文档,因为出于向后/ future 兼容性的目的。
我想任何跳过使用 Java VM/Dalvik 的实现也有可能让我更接近我的目标,即在 .apk 上获得不错的 GPIO 速度,但我不知道是否有任何方法有效on rpi3 + debian 可以在这里使用。
最佳答案
编辑:
每次您要运行该应用程序时运行类似的代码(适用于 pin 24,替换为您喜欢的 pin):
cd /sys/class/gpio
su root chmod a+w export
echo 24 > export
su root chmod a+w gpio24/direction
su root chmod a+w gpio24/value
ls gpio24/ -l
不幸的是,调用 execl 返回 -1,系统返回 32256,因此无法替代此手动步骤。即使尝试 system("/system/bin/date >/storage/self/primary/now ");
也会得到 32256。
然后将一个脚本放在一起,该脚本监听命名管道并基于该脚本运行上述代码。在使用 su
和 chmod
使其易于运行后,我将一个 C 代码放在一起,该代码将写入同一个管道。添加 300ms 等待管道被读取,我将开始从 apk 内部的 C 代码写入 gpio23/direction 和 gpio/value。
Led 亮起,一旦我优化 C 代码以获得更紧密的循环,我就会发布一些速度基准测试。
这里有完整的解决方案 https://github.com/fmatosqg/androidthings_ndk/tree/SO_answer .查看 README.md 以获取说明。
为了让它变得更好,我需要调试命名管道读取,因为有时我会读取错误的信息。并使脚本在启动时启动。
关于android - 如何绕过 Java 在 Android Things 上执行 GPIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41894967/
虽然找到了许多关于如何使用 GPIO.BCM 模式设置 gpio 的示例(其中引脚编号等效于 RPI(参见图像和 nvidia/jetson-gpio),但我找不到在 GPIO.TEGRA_SOC 模
我一直在努力编写一个脚本,该脚本将 Pi 的 BCM 引脚 17、27 和 10 打开 1 秒,然后关闭 1 秒,连续 100 次。当我运行脚本时,LED1 会亮起然后熄灭,程序因以下错误而关闭: T
我想使用 linux GPIO 驱动程序来处理 mpc8308 处理器的 GPIO 引脚之一作为输出。所以我启用了 GPIO 驱动程序并在以下位置进行调试: Device Drivers ---> G
我正在开发一个项目,需要我配置 GPIO 引脚并向原子板添加传感器。内核已配置 gpio ... CONFIG_GPIO_SYSFS=y 是内核选项之一。 我使用的是fedora版本2.6.29-10
我真的很担心我的 GPIO 可能被烧坏了,因为即使是这个 super 简单的代码也会导致错误 import RPi.GPIO as io import time io.setmode(io.BCM)
我尝试将 RPi.GPIO 与 Python 3.6 一起使用。 我安装了 RPi.GPIO,它适用于 Python 3.4,但不适用于 Python 3.6 我得到这个错误: ModuleNotFo
默认情况下,/sys/class/gpio 只能作为 root 访问。所以我喜欢一个新组gpio可以使用/sys/class/gpio下的文件和目录。为此,我将以下行添加到 /etc/rc.local
我已经阅读了 RPi.GPIO 的文档,并在谷歌和 SO 上进行了搜索,但无法完全找到可能是一个非常愚蠢的问题的解决方案。我试图只检测按下按钮的边缘。但无论我是否指定寻找“下降”或“上升”边缘,Pi
我正在编写一个程序来读取 GPIO 引脚的温度。不幸的是,访问这些总是会抛出 ModuleNotFoundError:没有名为“RPi”的模块。 我尝试重新安装它们,但没有成功。 异常(excepti
我正在使用 Raspberry pi 和 java 来使用 pi4j 使 LED 闪烁,一切都已清除并且工作正常,LED 按照代码闪烁但是当我第二次运行时它会导致以下错误,我搜索了很多有很多相同的问题
所以我一直在尝试通过使用命令行和 sysfs 写入和读取 /sys/class/gpio/ 让我的 Raspberry Pi GPIO 正常运行。根据以下教程,我无法复制将 GPIO 设置为输出并将其
我正在使用 Q7 模块 (x86) 并尝试在 Linux 上使用 ACPI SSDT 覆盖配置我们的外围设备。但我与它斗争。我想我误解了 ACPI 的一些核心概念。 问题 CPU -> I2C ->
我正在尝试在 Raspberry PI 上使用 nodejs 从连接的光传感器读取值。我可以读取 python 程序的读数,并可以确认我的设置是正确的。 下面是程序 var gpio = requir
我正在从事密室逃脱项目。实际上,我试图创建的行为如下: 网络浏览器以通常的方式显示网络应用程序的一部分。从此时起,客户端上将不再有键盘/鼠标的输入。我已经使用 JS 解决了基于时间的更改,因此我可以加
我的代码在使用 raspberry pi 时遇到问题。我刚开始使用 Python,所以我需要一些帮助。 这是代码: import RPi.GPIO as GPIO import time GPIO.s
我遇到了和这个问题一样的问题, python import fails when called from PHP但现在是我的另一个导入。 脚本在命令行 (python uit.py) 和一个 test
现在使用旧方法 gpio-sunxi 如何在 OrangePi PC plus ( SoC H3 ) 上访问 Armbian 3.4.113 上的 GPIO并编辑 .fex -file 已过时(想分享
在 Android 和 Linux 下使用传统的 sysfs GPIO 过程的第一步是脚趾 export您要使用的特定 GPIO 引脚。当您完成 GPIO 引脚到 unexport它。 我一直在寻找关
PHYTEC 的内核版本 3.12.30-AM335x-PD15.1.1。 如果我使用/sys/class/gpio 方式,我可以看到按钮输入引脚(AM3359 的 gpio103)值从 0 变为 1
从以前已知的 sysfs 接口(interface),任何人都可以设置合理配置的 GPIO 线的输出,并且此输出将保持该值,直到 SoC 重置或有人更改线值。使用 GPIOlib,当消费者关闭 gpi
我是一名优秀的程序员,十分优秀!