Embedded 为什么可以';不能从用户空间访问/更改GPIO吗?

Embedded 为什么可以';不能从用户空间访问/更改GPIO吗?,embedded,embedded-linux,gpio,Embedded,Embedded Linux,Gpio,这可能被认为是一个幼稚的问题 我习惯于裸机编程,手动更改寄存器值以写入GPIO。相反,当我需要信息时,我会阅读相同的寄存器 我最近转向了嵌入式linux。我已经说过,现在不能通过在用户空间中运行的代码来处理GPIO。**我可以想象这可能是出于某种安全/理智的原因,但我看不出来为什么不能在GPIO中从用户空间读/写代码?举一个例子,说明这可能导致的问题 **我知道一些库/API可以让您从用户空间处理GPIO,我正在学习如何使用它们。我的问题纯粹是出于好奇。在某些平台上可以,但通常是避免的 通常Li

这可能被认为是一个幼稚的问题

我习惯于裸机编程,手动更改寄存器值以写入GPIO。相反,当我需要信息时,我会阅读相同的寄存器

我最近转向了嵌入式linux。我已经说过,现在不能通过在用户空间中运行的代码来处理GPIO。**我可以想象这可能是出于某种安全/理智的原因,但我看不出来为什么不能在GPIO中从用户空间读/写代码?举一个例子,说明这可能导致的问题


**我知道一些库/API可以让您从用户空间处理GPIO,我正在学习如何使用它们。我的问题纯粹是出于好奇。

在某些平台上可以,但通常是避免的

通常Linux在硬件上运行,MMU提供页级内存保护,并将虚拟地址空间重新映射到物理地址

要从userpace访问内存映射的GPIO,需要配置MMU将寄存器硬件地址映射到所需进程的虚拟地址空间,并且需要启用对该页的读和/或写访问

但问题是粒度通常很差——内存页可能是4KB,而GPIO引脚的行为由几个不同寄存器中的几个不同位控制。因此,不可能将单个管脚暴露在给定的过程中

此外,从用户空间执行此操作需要了解GPIO在给定平台上如何工作的精确硬件细节,而这些信息通常最好放在驱动程序中


在一些情况下,使用sysfs接口的速度太慢,例如,尝试对一些较慢的接口进行位击。但通常在这些情况下,我们不会直接从用户空间处理GPIO,而是编写一个内核模块,从内核空间执行位碰撞,然后userspace使用一个系统调用将整个中高层操作请求传递给内核。

我认为这是操作系统的作用,它可以抽象底层硬件,防止您在直接访问时出错。。。你可以处理GPIO,但你不能直接访问寄存器,必须使用OS API。真的,你看不出绕过OS访问GPIO寄存器有多容易会把流程搞砸吗?有很多方法可以让你的板子冒烟。不,主要的问题是在软件层面上搞乱多任务操作系统,并存在损坏硬件的潜在风险。@0andriy你能举个例子说明硬件是如何损坏的吗?很简单。连接到输出电流的硬件的GPIO线。其中一个将GPIO线切换到电流电位相反的输出模式。Oops.I/O争用是违反规范的情况,但很少是致命的。使用sysfs接口也很容易,所以与问题有点相切。有更好的例子说明你在争论什么,但这与问题无关。