реклама на сайте
подробности

 
 
> вызов SIGUSR1 в драйвере устройства
leonopulos
сообщение Jul 10 2009, 16:52
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 25-11-08
Пользователь №: 41 958



Здравствуйте.
При разработке драйвера устройства столкнулся со следующей проблемой.
драйвер должен совместно работать с прикладной программой (демоном) и должен передавать этой программе сигналы о готовности данных (после аппаратного прерывания).
Для этих целей я воспользовался механизмом передачи сигналов, в частности, передачей SIGUSR1.
для этого в модуле инициализации драйвера заполнил структуру task_struct:

p = find_task_by_name("my_daemon");

саму структуру объявил глобально, так как она используется в нескольких модулях драйвера:

static struct task_struct *p;

затем в обработчике прерывания собственно генерирую SIGUSR1;

sigaddset(&p->pending.signal, SIGUSR1);
p->sigpending = 1;

в ответ на это компилятор выдаёт ошибки:

error: 'struct task_struct' has no member named 'sigpending' в обработчике прерывания и

вопрос: В чём я лоханулся?

ядро - 2.6.23, пропатченное под olimex sam9-l9260
кросс-компилирую, соответственно, под arm (arm-at91)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Непомнящий Евген...
сообщение Jul 13 2009, 04:27
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(leonopulos @ Jul 10 2009, 20:52) *
саму структуру объявил глобально, так как она используется в нескольких модулях драйвера:

static struct task_struct *p;


Это не объявление структуры, а объявление указателя. Чтобы использовать этот указатель для доступа к членам структуры, необходимо определить саму структуру -

struct task_struct { .... };

или подключить соответствующий хидер, если она из стандартной библиотеки
Go to the top of the page
 
+Quote Post
leonopulos
сообщение Jul 13 2009, 07:09
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 25-11-08
Пользователь №: 41 958



да, это моя ошибка в описании проблемы.
я объявил указатель, а сама структура находится в заголовочном файле "linux/sched.h" и там это поле присутствует.
Go to the top of the page
 
+Quote Post
amw
сообщение Jul 15 2009, 19:49
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(leonopulos @ Jul 10 2009, 19:52) *
static struct task_struct *p;

затем в обработчике прерывания собственно генерирую SIGUSR1;

sigaddset(&p->pending.signal, SIGUSR1);
p->sigpending = 1;

в ответ на это компилятор выдаёт ошибки:

error: 'struct task_struct' has no member named 'sigpending' в обработчике прерывания и

Потому что
Код
struct task_struct {
...
struct sigpending pending;
...
}


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 16 2009, 08:25
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Определяйте свои типы структур через typedef - это Вам сильно облегчит жизнь и уменьшит количество писанины...
Код
typedef struct  // объявляем свой тип.
{
    uint16_t  field1;
    uint32_t  field2;
    float     field3;
} my_struct_t;

my_struct_t s1; // создаём переменную s1
my_struct_t s2; // создаём переменную s2

void init_my_struct(my_struct_t* s)   // создаём обработчик
{
    s->field1 = 0;
    s->field2 = 0;
    s->field3 = 312.5f;
}

int main(void)
{
    init_my_struct(&s1);   // обрабатываем...
    init_my_struct(&s2);
    return (0);
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
leonopulos
сообщение Jul 17 2009, 06:52
Сообщение #6





Группа: Участник
Сообщений: 11
Регистрация: 25-11-08
Пользователь №: 41 958



Цитата(amw @ Jul 15 2009, 23:49) *
Потому что
Код
struct task_struct {
...
struct sigpending pending;
...
}


Понял! Спасибо! :-)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016