2016-06-29 4 views
1

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

obj-m := module.o 
module-objs := extra.o 

Но работа dosen't для меня ...

Здесь весь исходный проект:

axis_controller.h:

#ifndef _AXIS_CONTROLLER_H 
#define _AXIS_CONTROLLER_H 

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/hrtimer.h> 
#include <linux/ktime.h> 

struct axis_controller { 
    struct hrtimer timer; 
    int state; 
}; 

static inline struct hrtimer* axis_controller_get_timer(struct axis_controller* axis_controller); 

static inline void axis_controller_reset_state(struct axis_controller* axis_controller); 

inline void axis_controller_init(struct axis_controller* axis_controller, enum hrtimer_restart (*function)(struct hrtimer *)); 

inline int axis_controller_clean(struct axis_controller* axis_controller); 

inline void axis_controller_change_state(struct axis_controller* axis_controller, unsigned long sec, unsigned long nano_sec); 

inline void axis_controller_controll(struct axis_controller* axis_controller); 

#endif 

axis_controller.c:

#include "axis_controller.h" 

MODULE_LICENSE("GPL v2"); 

struct hrtimer* axis_controller_get_timer(struct axis_controller* axis_controller) { 
    return &(axis_controller->timer); 
} 

void axis_controller_reset_state(struct axis_controller* axis_controller) { 
    axis_controller->state = 0; 
} 

void axis_controller_init(struct axis_controller* axis_controller, enum hrtimer_restart (*function)(struct hrtimer *)) { 
    hrtimer_init(axis_controller_get_timer(axis_controller), CLOCK_MONOTONIC, HRTIMER_MODE_REL); 
    axis_controller->timer.function = function; 
    axis_controller_reset_state(axis_controller); 
} 

int axis_controller_clean(struct axis_controller* axis_controller) { 
    return hrtimer_try_to_cancel(axis_controller_get_timer(axis_controller)); 
} 
void axis_controller_change_state(struct axis_controller* axis_controller, unsigned long sec, unsigned long nano_sec) { 
    axis_controller->state = !axis_controller->state; 
    hrtimer_start(axis_controller_get_timer(axis_controller), ktime_set(sec, nano_sec), HRTIMER_MODE_REL); 
} 
void axis_controller_controll(struct axis_controller* axis_controller) { 
    axis_controller_reset_state(axis_controller); 
    axis_controller->timer.function(axis_controller_get_timer(axis_controller)); 
} 

//printk(KERN_INFO "axis_controller.c\n"); 

CNC_controller.c:

#include <linux/kernel.h> 
#include <linux/module.h> 
#include "axis_controller/axis_controller.h" 

MODULE_LICENSE("GPL v2"); 
MODULE_AUTHOR("Ivo Stratev (NoHomey)"); 
MODULE_DESCRIPTION("CNC Controller"); 

printk(KERN_INFO "CNC_controller.c\n"); 

static int return_value; 
static struct axis_controller test; 

static enum hrtimer_restart my_callback(struct hrtimer *timer) { 
    printk(KERN_INFO "my_hrtimer_callback called\n"); 
    return HRTIMER_NORESTART; 
} 

static int __init on_load(void) { 
    printk("on_load\n"); 
    axis_controller_init(&test, my_callback); 

    axis_controller_controll(&test); 

    return 0; 
} 

static void on_unload(void) { 
    printk("on_unload\n"); 
    axis_controller_clean(&test); 
    return; 
} 

module_init(on_load); 
module_exit(on_unload); 

Makefile:

__name__ = CNC_controller 
__major__ = 243 
__ioctl_header__ = /usr/include/$(__name__)_ioctl.h 
make_module_action = make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 
obj-m := $(__name__).o 
CNC_controller-objs := axis_controller/axis_controller.o 

all: clean 
    $(make_module_action) modules 

clean: 
    $(make_module_action) clean 

load: 
    insmod $(__name__).ko 

unload: 
    rmmod -f $(__name__) 

device: 
    mknod /dev/$(__name__) c $(__major__) 0 
    chmod 777 /dev/$(__name__) 

remove: 
    rm -f /dev/$(__name__) 

header: 
    rm -f $(__ioctl_header__) 
    cp $(__name__).h $(__ioctl_header__) 
    chmod 555 $(__ioctl_header__) 

Это процесс сборки:

[email protected]:~/CNC-Controller$ make 
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller clean 
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic' 
CLEAN /home/ivo/CNC-Controller/.tmp_versions 
CLEAN /home/ivo/CNC-Controller/Module.symvers 
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic' 
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller modules 
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic' 
CC [M] /home/ivo/CNC-Controller/axis_controller/axis_controller.o 
LD [M] /home/ivo/CNC-Controller/CNC_controller.o 
Building modules, stage 2. 
MODPOST 1 modules 
CC  /home/ivo/CNC-Controller/CNC_controller.mod.o 
LD [M] /home/ivo/CNC-Controller/CNC_controller.ko 
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic' 
[email protected]:~/CNC-Controller$ 

Когда я удалить строку

CNC_controller-objs := axis_controller/axis_controller.o 

Процесс строительства :

[email protected]:~/CNC-Controller$ make 
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller clean 
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic' 
CLEAN /home/ivo/CNC-Controller/.tmp_versions 
CLEAN /home/ivo/CNC-Controller/Module.symvers 
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic' 
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller modules 
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic' 
CC [M] /home/ivo/CNC-Controller/CNC_controller.o 
In file included from include/linux/printk.h:6:0, 
       from include/linux/kernel.h:13, 
       from /home/ivo/CNC-Controller/CNC_controller.c:2: 
include/linux/kern_levels.h:4:18: error: expected declaration specifiers or ‘...’ before string constant 
#define KERN_SOH "\001" /* ASCII Start Of Header */ 
       ^
include/linux/kern_levels.h:13:19: note: in expansion of macro ‘KERN_SOH’ 
#define KERN_INFO KERN_SOH "6" /* informational */ 
       ^
/home/ivo/CNC-Controller/CNC_controller.c:10:8: note: in expansion of macro ‘KERN_INFO’ 
printk(KERN_INFO "CNC_controller.c\n"); 
     ^
In file included from /home/ivo/CNC-Controller/CNC_controller.c:4:0: 
/home/ivo/CNC-Controller/axis_controller/axis_controller.h:14:31: warning: ‘axis_controller_get_timer’ declared ‘static’ but never defined [-Wunused-function] 
static inline struct hrtimer* axis_controller_get_timer(struct axis_controller* axis_controller); 
          ^
/home/ivo/CNC-Controller/axis_controller/axis_controller.h:16:20: warning: ‘axis_controller_reset_state’ declared ‘static’ but never defined [-Wunused-function] 
static inline void axis_controller_reset_state(struct axis_controller* axis_controller); 
        ^
scripts/Makefile.build:264: recipe for target '/home/ivo/CNC-Controller/CNC_controller.o' failed 
make[2]: *** [/home/ivo/CNC-Controller/CNC_controller.o] Error 1 
Makefile:1403: recipe for target '_module_/home/ivo/CNC-Controller' failed 
make[1]: *** [_module_/home/ivo/CNC-Controller] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic' 
Makefile:10: recipe for target 'all' failed 
make: *** [all] Error 2 
[email protected]:~/CNC-Controller$ 

И вот почему я думаю, что это не компиляции, поскольку он регистрирует ошибку printk:

include/linux/kern_levels.h:4:18: error: expected declaration specifiers or ‘...’ before string constant 
    #define KERN_SOH "\001" /* ASCII Start Of Header * 

Любого понятие, что я делаю не так? потому что я делаю то, что видел другие, которые делают ...

ответ

4

У вас есть две проблемы:

  • вы не можете использовать printk из глобального масштаба. Это нужно переместить в функцию.
  • У вас не может быть файл C с тем же именем, что и модуль при попытке создания нескольких файловых модулей. То есть, либо переименовать CNC_controller.c или .ko Например, переименовывать CNC_controller.cCNC_controller_main.c и использование:

    CNC_controller-OBJS: = CNC_controller_main.c axis_controller/axis_controller.o

1

В соответствии с сообщением об ошибке вы вызываете функцию на верхнем уровне. Что приходит, чтобы показать, что есть вызов за пределами основной или другой функции.

Подробнее printk(KERN_INFO "CNC_controller.c\n");.

На боковой ноте #define KERN_SOH "\001" может выступать только в качестве пробки, потому что '\0' является прекращающим символом. Я оставляю вам сказать, если это то, что вы намеревались.

+0

нет Я добавил что printk, потому что он просто генерирует ошибку при вызове вне стека, поэтому я могу доказать, что CNC_controller.c скомпилирован второй раз, но сначала заметьте (когда есть зависимость, при первом подключении просто привязана ...) –

 Смежные вопросы

  • Нет связанных вопросов^_^