2016-07-14 4 views
0

Прежде всего, прошу прощения за это, я уже прочитал некоторые подобные проблемы, но ни одна из тем не ответила. А также я полный новичок в программировании встроенного linux, и это мой первый опыт использования linux, поэтому будьте вежливы, пожалуйста :)Ошибка сегментации при доступе к GPIO

Итак, моя проблема: я пытаюсь сделать базовое приложение для встроенной системы Linux (AT91SAM9260 mcu) с GPIO - мигающим светодиодом или некоторыми кнопками. Но когда я пытаюсь получить доступ к GPIO через их адрес (например, 0xE002C00C), программа показывает «Ошибка сегментации». То, что я нашел до сих пор, это означает, что Linux не позволит мне использовать память, к которой я пытаюсь получить доступ. Многие люди предполагают, что я должен написать свой собственный драйвер или что-то еще, но, как я уже сказал, я абсолютно новичок в этом, и я понятия не имею, что мне делать. Может кто-то помочь мне с этим? Пошаговые инструкции были бы замечательными.

Заранее спасибо, muliku.

+0

вам необходимо использовать mmap() или написать драйвер для использования физической адресации. –

+0

* «Но когда я пытаюсь получить доступ к GPIO через их адрес (например, xE002C00C)» * - Как давний пользователь SoC AT91SAM9260, этот (физический) адрес даже не выглядит действительным для ** любой ** периферийной системы регистр. – sawdust

+0

@dwelch * «написать драйвер для использования физической адресации» * - драйвер устройства должен был бы ioremap() физический адрес, который по существу эквивалентен mmap(). CPU не может получить доступ к памяти с использованием физических адресов, пока включен MMU. – sawdust

ответ

1

Когда вы говорите, что используете Embedded Linux, было бы полезно предоставить информацию, такую ​​как версия ядра, которую BSP предоставил кому или любой системе сборки, такой как Openembedded или buildroot. Если вы используете Linux, стандартный способ доступа к GPIO в Linux - это /sys/class/gpio. См. GPIO sysfs. Убедитесь, что ядро, которое вы используете, уже экспортировало их.

Что касается вашей ошибки сегментации, то в монолитном ядре, таком как Linux, существует разделение пространства пользователя и пространства ядра. Невозможно получить доступ к любому адресу напрямую. Все адреса отображаются в памяти, и между виртуальным адресом и физическим адресом происходит перевод.

Если у вас есть последнее ядро ​​или ваш поставщик Atmel или укомплектовано соответствующим образом сконфигурированное ядро ​​/ BSP, вы должны иметь доступ к системным файлам GPIO через sysfs, так как драйвер GPIO и любая необходимая поддержка будут включены.

 Смежные вопросы

  • Нет связанных вопросов^_^