LINUX.ORG.RU

Проблемы с асинхронной инициализацией gpio на raspberry pi 3 от обычного пользователя

 , , , ,


0

1

Написал скрипт:

#!/bin/bash
exportfile="/sys/class/gpio/export"
echo "$1" > "$exportfile"
echo "$2" > "/sys/class/gpio/gpio""$1""/direction"
exit 0;

# Примеры
# init-gpio-sh 5 in
# init-gpio-sh 3 out

При каждом запуске от пользователя pi входящего в группу gpio, bash ругался на 4 строку. Ошибка доступа. При запуске от пользователя root ошибки не было. Тогда я стал искать причину ошибки в правах пользователя, но у пользователя были необходимые права на все файлы в /sys/class/gpio/gpio

Если я от пользователя вводил проблемную команду отдельно, то проблемы не было. В итоге я добавил строку sleep 0.1 между третьей и четвёртой строками, и скрипт стал работать корректно.

#!/bin/bash
exportfile="/sys/class/gpio/export"
echo "$1" > "$exportfile"

sleep 0.1

echo "$2" > "/sys/class/gpio/gpio""$1""/direction"
exit 0;

# Примеры
# init-gpio-sh 5 in
# init-gpio-sh 3 out
# Пауза нужна что бы успел произойти экспорт

Raspbian последней версии.

Ошибка ли это? Или следствие того что ранее закрыли какую то дыру сделав выполнение операций с этими файлами для всех пользователей кроме root асинхронным? Пожалуйста проверьте повторяется ли у вас эта ошибка.

☆☆☆

Последнее исправление: rezedent12 (всего исправлений: 1)

что бы

Когда тебя уже наконец забанят?

Ошибка ли это?

Ты посылаешь ядру, ядро отдупляет gpio, и отдаёт тебе его на растерзание. Ты за микросекунды хочешь результата?

r3lgar ★★★★★
()

Попробуй посмотреть, как будет выглядеть

cat "$exportfile"
echo "$1" > "$exportfile"
cat "$exportfile"
Без задержки, естественно. И для наглядности посылай туда отличное от того, что там.

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 1)
Ответ на: комментарий от r3lgar

Ты посылаешь ядру, ядро отдупляет gpio, и отдаёт тебе его на растерзание. Ты за микросекунды хочешь результата?

Я хочу гарантированного результата. То есть задержки до полного «раздупления» GPIO.

Когда тебя уже наконец забанят?

А тебя когда?

rezedent12 ☆☆☆
() автор топика
Ответ на: комментарий от rezedent12

Я хочу гарантированного результата.

И при этом пишешь костыли на баше? Okay.

То есть задержки до полного «раздупления» GPIO.

Напиши нормальный драйвер для начала.

Когда тебя уже наконец забанят?

А тебя когда?

У меня проблемы с русским языком возникают только под веществами, а у современных тролЛОРовцев они были и будут всегда. На следующий новый год попрошу у деда Мороза модераторство на ЛОРе (на одну ночь).

Так что там с /sys/class/gpio/export? Моя теория, что оно не сразу отдупляется, подтвердилась?

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

У меня проблемы с русским языком возникают только под веществами, а у современных тролЛОРовцев они были и будут всегда.

Мне не нужны «вещества» для изменения состояния своего сознания.

Так что там с /sys/class/gpio/export? Моя теория, что оно не сразу отдупляется, подтвердилась?

Я ещё не проверил. Завтра займусь этим. У меня появилась ещё одна гипотеза. Что «раздупляет» порт он вовремя, а вот присваивает ему права группы gpio с задержкой.

rezedent12 ☆☆☆
() автор топика
Ответ на: комментарий от rezedent12

У меня появилась ещё одна гипотеза. Что «раздупляет» порт он вовремя, а вот присваивает ему права группы gpio с задержкой.

Это, кстати, тоже вполне вероятно.

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

Проверил, ты ошибся. $exportfile на чтение не доступен никогда, в него только писать можно. Ты наверно имел ввиду

cat "/sys/class/gpio/gpio""$1""/direction"
В результате выводится содержимое этого файла
in
и сообщение о том что отказано в доступе. То есть доступ есть, но сообщение об ошибке есть. Могу лишь предположить что с правами на GPIO файлы действительно есть какая то задержка.

rezedent12 ☆☆☆
() автор топика

Поставь ты уже себе wiringPI и не долбай людей!

Вот тебе пример рабочей штукенции. В этом случае такой код

void setup_motors(){
#ifdef __arm__
	wiringPiSetupGpio();
	pinMode(X_EN_PIN, OUTPUT);
	pinMode(X_DIR_PIN, OUTPUT);
	pinMode(X_CLK_PIN, OUTPUT);
	pinMode(Y_EN_PIN, OUTPUT);
	pinMode(Y_DIR_PIN, OUTPUT);
	pinMode(Y_CLK_PIN, OUTPUT);
	Write(X_EN_PIN, 0);
	Write(Y_EN_PIN, 0);
	Write(X_CLK_PIN, 1);
	Write(Y_CLK_PIN, 1);
	Write(X_DIR_PIN, 1);
	Write(Y_DIR_PIN, 1);
#else // __arm__
	printf("Setup GPIO\n");
#endif // __arm__
}
никаких проблем не вызывает. Кроме того, доступ через sys-интерфейс очень тормозной. Нужно через DMA.

anonymous
()
Ответ на: комментарий от anonymous

Поставь ты уже себе wiringPI

А что это такое?

Вот тебе пример рабочей штукенции.

А я не на «C» пишу.

Кроме того, доступ через sys-интерфейс очень тормозной. Нужно через DMA.

Для моих целей хватает sys.

rezedent12 ☆☆☆
() автор топика
Ответ на: комментарий от rezedent12

«/sys/class/gpio/gpio»"$1""/direction"

Ага да. (derlafff, пошто ты сломал мои кавычки, понь?!)

То есть доступ есть, но сообщение об ошибке есть.

GNU/Linux такой GNU/Linux…

r3lgar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.