Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> компиляция драйвера устройства 
:(
    Опции темы
massiv
Дата 21.11.2009, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Пытаюсь скомпилировать пример простого модуля. Столкнулся с проблемой, ошибка компиляции в функции cleanup_module()
вот ошибка:
Код

make -C /lib/modules/`uname -r`/build M=`pwd` modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.27-15-generic'
  CC [M]  /root/program_f/chardev.o
/root/program_f/chardev.c: In function ‘cleanup_module’:
/root/program_f/chardev.c:53: error: void value not ignored as it ought to be
make[2]: *** [/root/program_f/chardev.o] Error 1
make[1]: *** [_module_/root/program_f] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.27-15-generic'
make: *** [default] Error 2


вот кусок кода с ошибкой:
Код

void cleanup_module(void)
{
  int ret = unregister_chrdev(Major, DEVICE_NAME);
   if (ret < 0)
       printk(KERN_ALERT "Error in unregister_chrdev: %d\n", ret);

   return;
}


 если закомментировать строку nt ret = unregister_chrdev(Major, DEVICE_NAME); , то всё ок.....никак не пойму на што он здесь ругается, ведь функция ничего ен возвращает? как решить такую проблему?

вот полный код модуля:

Код

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>  
 

int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
 
#define SUCCESS 0
#define DEVICE_NAME "chardev"
#define BUF_LEN 80               
 
static int Major;             
static int Device_Open = 0;                              
static char msg[BUF_LEN];     
static char *msg_Ptr;
 
static struct file_operations fops = {
  .read = device_read,
  .write = device_write,
  .open = device_open,
  .release = device_release
};

 
int init_module(void)
{
  Major = register_chrdev(0, DEVICE_NAME, &fops);
 
  if (Major < 0) {    
    printk("Registering the character device failed with %d\n",
            Major);
    return Major;
  }
 
  printk("<1>I was assigned major number %d.  To talk to\n", Major);
  printk("<1>the driver, create a dev file with\n");
  printk("'mknod /dev/chardev c %d 0'.\n", Major);
  printk("<1>Try various minor numbers.  Try to cat and echo to\n");
  printk("the device file.\n");
  printk("<1>Remove the device file and module when done.\n");
 
  return 0;
}
 
void cleanup_module(void)
{
  int ret = unregister_chrdev(Major, DEVICE_NAME);
   if (ret < 0)
       printk(KERN_ALERT "Error in unregister_chrdev: %d\n", ret);

   return;
}

static int device_open(struct inode *inode, struct file *file)
{
  static int counter = 0;
  if (Device_Open)
    return -EBUSY;
  Device_Open++;
  sprintf(msg, "I already told you %d times Hello world!\n", counter++);
  msg_Ptr = msg;
  try_module_get(THIS_MODULE);
 
  return SUCCESS;
}
 
static int device_release(struct inode *inode, struct file *file)
{
  Device_Open--;            
  module_put(THIS_MODULE);
 
  return 0;
}
 
static ssize_t device_read(struct file *filp, char *buffer, size_t length,loff_t * offset)
{
  int bytes_read = 0;
 
  if (*msg_Ptr == 0)
    return 0;
 
  while (length && *msg_Ptr) {
 
    put_user(*(msg_Ptr++), buffer++);
 
    length--;
    bytes_read++;
        }
 
  return bytes_read;
}
 
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
  printk("<1>Sorry, this operation isn't supported.\n");
  return -EINVAL;
}



компиляю в ядре 2.6.27-15-generic

вот Make-файл:
Код

obj-m+=chardev.o

KDIR:=/lib/modules/`uname -r`/build
PWD:=`pwd`

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules



PM MAIL   Вверх
MAKCim
Дата 21.11.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



unregister_chrdev() возвращает void


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
massiv
Дата 21.11.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(MAKCim @ 21.11.2009,  11:00)
unregister_chrdev() возвращает void

странно, в переводе Linux Device Drivers написано такое объявление этой функции: 

Код

 int unregister_chrdev(unsigned int major, const char *name);

Аргументами, передаваемыми в функцию, являются значение освобождаемого старшего номера и строка с именем связанного с ним устройства. Ядро сравнивает переданное в функцию имя с зарегистрированным для данного номера. Если значения имени не совпадают, то функция возвращает значение -EINVAL.



А в исходнике ядра сейчас посмотрел:
Код

 void unregister_chrdev(unsigned int, const char *);



Как же проверить правильно ли отработала эта функция, освобождён ли старший номер устройства?
PM MAIL   Вверх
MAKCim
Дата 21.11.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



если API функция возвращает void, то значит либо ошибка возникнуть не может, либо ее обработка не требуется


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
massiv
Дата 21.11.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(MAKCim @ 21.11.2009,  13:27)
если API функция возвращает void, то значит либо ошибка возникнуть не может, либо ее обработка не требуется

ну ошибка возникнуть может , хотя бы при передаче неверного  параметра.....Возможно стоит проверять переменную errno?
PM MAIL   Вверх
GwinnBleidd
Дата 21.11.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.5.2008
Где: Украина, Донецк

Репутация: нет
Всего: нет



Цитата(massiv @  21.11.2009,  17:41 Найти цитируемый пост)
Возможно стоит проверять переменную errno? 

errno имеет смысл проверять только когда вызов завершился неудачно (обычно -1 для большинства системных вызовов,  -1 или NULL для большинства библиотечных функций)
PM MAIL   Вверх
MAKCim
Дата 21.11.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(massiv @  21.11.2009,  19:41 Найти цитируемый пост)
ну ошибка возникнуть может , хотя бы при передаче неверного  параметра.....Возможно стоит проверять переменную errno? 

я же четко написал
если функция возвращает void, то обработка ошибок _не твоя_ задача ;)
посмотри реализацию тут
ну и кроме того errno в ядре нет ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1021 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.