LINUX.ORG.RU

цикл в модуле ядра


0

1

Каюсь что не знаю простых вещей, подскажите если в модуле ядра пишешь цикл типа:

static int diod_flash(void) {
	int i = 10;
	diod_initialize();
	while( i > 0 ) {
	at91_set_gpio_value(AT91_PIN_PB18,0);
	mdelay(100);
	at91_set_gpio_value(AT91_PIN_PB18,1);
	mdelay(100);
	i--;
	}	
	return 0;
};
То insmod module будет зависать на время выполнения while, подскажите, а лучше дайте пример как правильно применять цикл в модуле (подозреваю что через fork?)

★★★★★

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

и где здесь рекурсия?

demidrol ★★★★★
()

И где здесь рекурсия? И в чём сакральный смысл цикла while?

dmfd
()

тьфу блин, цикл. Спать наверное пора.

splinter ★★★★★
() автор топика

рекурсия

применять рекурсию в модуле

(подозреваю что через fork?)

Ай-да линуксоид! Премию Дарвина за такое надо давать!

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

В твоём случае так точно делать не надо. man timer.

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

А не: двух. Может лучше так:

static int diod_flash(void) {
	diod_initialize();
	for (int i = 10; i > 0; i -- ) {
  	  at91_set_gpio_value(AT91_PIN_PB18,i & 1);
	  mdelay(100);
	}	
	return 0;
};

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

вообще релюшкой шлепаю, «зависает» значит когда делаю insmod module.ko на время выполнения insmod держит консоль, типа не уходит в фон, делать insmod & как то наверное костыльно.

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

нет, я имел ввиду что insmod module.ko не возвращает управление консолью до окончания работы цикла.

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

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

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

Это не для средних умов.

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

даже если это сделать в отдельной функции, ее все равно придется вызывать через init_module().

splinter ★★★★★
() автор топика

как правильно применять цикл в модуле (подозреваю что через fork?)

Цикл с задержкой - только в контексте процесса.

Вообще вместо цикла с задержками можно использовать таймеры.

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

я понимаю ваше негодование, наверняка вы специалисты во всем, сразу с j-tag'ом из родильного дома выписались.

splinter ★★★★★
() автор топика

напрашивается «kthread_run(diod_flash, NULL, „diod_flash_thread“, 1);» или как-то так

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

Конечно.

И не слушай идиота с кернел фредами.

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

Негодование вполне обоснованное. Прежде чем лезть в ядро, необходимо хотя бы программированию научиться. А то поморгают костылями из ядра и пишут в резюме «Драйверы и ядро линукс», а в результате дебил-имбецилом, ну типа тебя, одним словом.

anonymous
()

По таймеру, не?

// ну тут и так уже насоветовали

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

Ну и правильно, процесс будет находится в режиме ядра и выполнять init код, выполнит и вернёт управление обратно юзерспайсу. Ну и запусти его в фоне, этого же тебе не виндовс 98, тут многозадачность есть.

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

листани синхроное/асинхроное

отличие между

ожидание без отдачи «духа жавого» (твой делай)

сообщил куда следует(зарегался в списке клиентов апаратного/осевого таймера) и отдал «духа жавого» операционке , а сам в анабиоз до «живительного» события

ps. годная рекурсия.

qulinxao ★★☆
()

Ох уж эти сишники-ядерщики.

anonymous
()

Имхо, драйвер должен дать функционал юзерспейсу, экспортируемый, например, через какой-нибудь файл устройства. Функционал простой — включить лампочку, выключить лампочку, опросить статус. Никаких там циклов быть не должно. А в юзерспейсе напиши уже простую программу, которая будет моргать как хочешь.

Legioner ★★★★★
()

Да, с такими знаниями только в ядро писать. Может потом ещё в разрабы этого ядра возьмут по объявлению

HNO-Arzt_
()
Ответ на: комментарий от mv

Сначала поясни про битовый сдвиг и рекурсию.

anonymous
()

Создай отдельный kthread под эту задачу.

Moncruist
()

Либо делать kthread, либо шедулить эвент по таймеру, и по нему менять состояние. Второе будет жрать меньше ресурсов.

ncrmnt ★★★★★
()

А потом люди удивляются чего Линус временами такой нервный.

dmiceman ★★★★★
()

Эээ... Может тебе надо копать в эту сторону http://linuxdrivers.blogspot.ru/2010/12/74.html

//Я не претендую на звание крутого кернел специалиста. Просто мне кажется, что та статья будет полезна.

pathfinder ★★★★
()

kthread
kthread
kthread

Под моргание лампочкой... Дураки, честное слово.

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