Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вызов SIGUSR1 в драйвере устройства
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
leonopulos
Здравствуйте.
При разработке драйвера устройства столкнулся со следующей проблемой.
драйвер должен совместно работать с прикладной программой (демоном) и должен передавать этой программе сигналы о готовности данных (после аппаратного прерывания).
Для этих целей я воспользовался механизмом передачи сигналов, в частности, передачей 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)
Непомнящий Евгений
Цитата(leonopulos @ Jul 10 2009, 20:52) *
саму структуру объявил глобально, так как она используется в нескольких модулях драйвера:

static struct task_struct *p;


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

struct task_struct { .... };

или подключить соответствующий хидер, если она из стандартной библиотеки
leonopulos
да, это моя ошибка в описании проблемы.
я объявил указатель, а сама структура находится в заголовочном файле "linux/sched.h" и там это поле присутствует.
amw
Цитата(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;
...
}
demiurg_spb
Определяйте свои типы структур через 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);
}
leonopulos
Цитата(amw @ Jul 15 2009, 23:49) *
Потому что
Код
struct task_struct {
...
struct sigpending pending;
...
}


Понял! Спасибо! :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.