init_MUTEX被废除(解决error: implicit declaration of function ‘init_MUTEX’)

CSDN GitHub
init_MUTEX被废除
解决error: implicit declaration of function ‘init_MUTEX’
LDD/problem/port/init_MUTEX


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处

1 问题


近期在移植驱动的时候, 提示了如下错误

error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]

2 原因分析


2.6.37 之后的 Linux 内核中, init_mutex 已经被废除了, 新版本使用 sema_init 函数

查了一下早期版本的定义, 参见include/linux/semaphore.h, version 2.6.36.4, line 42

static inline void sema_init(struct semaphore *sem, int val)
{
    static struct lock_class_key __key;
    *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);
    lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0);
}

#define init_MUTEX(sem)     sema_init(sem, 1)
#define init_MUTEX_LOCKED(sem)  sema_init(sem, 0)

3 解决方案


修改 init_MUTEXsema_init即可, 也可以在驱动中定义 init_MUTEX

  • 修改 init_MUTEXsema_init
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) && !defined(init_MUTEX)
    sema_init(&sem, 1);
#else
    init_MUTEX(&sem);
#endif
  • 定义 init_MUTEXsema_init
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) && !defined(init_MUTEX)
#define init_MUTEX(sem)     sema_init(sem, 1)
#endif

其实早期的内核中, 定义了 sema_init, 因此其实可以不需要添加 #if #endif 宏, 直接修改 init_MUTEXsema_init 是没有什么问题的.


发布了440 篇原创文章 · 获赞 1321 · 访问量 572万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览