简答的字符驱动

lq651659889 2011-09-30 11:41:32
我自己写了个简单的字符驱动,编译什么都没有错,模块加载也成功了,但自动创建的设备节点没有,部分代码如下:
static void my_cdev_setup(struct my_cdev *dev, int index)

{

int err;

dev_t devno = MKDEV(device_major, index);

cdev_init(&dev->cdev,&my_cdev_fops);

dev->cdev.owner = THIS_MODULE;

dev->cdev.ops = &my_cdev_fops;

err = cdev_add(&dev->cdev,devno,1);



if(err)

printk(KERN_NOTICE"Error %d adding LED %d\n", err, index);

}



static int __init my_cdev_init(void)

{

int result;

dev_t devno;

printk(KERN_ALERT"init my char driver\n");

if(device_major)

{

devno = MKDEV(DEVICE_MAJOR, 0);

result = register_chrdev_region(devno,1,"my_cdev_qiong");

}

else

{

result = alloc_chrdev_region(&devno,0,1,"my_cdev_qiong");

device_major = MAJOR(devno);

}



if(result < 0)

return result;



my_cdevp = kmalloc(sizeof(struct my_cdev), GFP_KERNEL);

if(!my_cdevp)

{

result = -ENOMEM;

}



memset(my_cdevp, 0, sizeof(struct my_cdev));



my_cdev_setup(my_cdevp, 0);



my_cdev_class = class_create(THIS_MODULE,"liuqiong");

if(IS_ERR(my_cdev_class))

{

return -1;

}



device_create(my_cdev_class,NULL,devno,"liu" "%d",0);

return result;

}



static void __exit my_cdev_exit(void)

{

cdev_del(&my_cdevp->cdev);



device_destroy(my_cdev_class, MKDEV(device_major, 0));

class_destroy(my_cdev_class);



unregister_chrdev_region(MKDEV(device_major, 0), 1);



kfree(my_cdevp);

}
为什么创建设备节点会没有,如果用命令的话是可以创建成功的,还想问下在卸载模块时老是说模块在被使用,但我只是加载了,什么都没做,求高人解答!!!
...全文
83 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
念茜 2011-09-30
  • 打赏
  • 举报
回复
好像是和别人的节点号冲突了
nevil 2011-09-30
  • 打赏
  • 举报
回复
没有,你试下就知道。少了那个NULL会oops crash

[Quote=引用 6 楼 lq651659889 的回复:]

是不是多了个参数,楼上的
[/Quote]
lq651659889 2011-09-30
  • 打赏
  • 举报
回复
是不是多了个参数,楼上的
nevil 2011-09-30
  • 打赏
  • 举报
回复
应该是这样
device_create(my_cdev_class,NULL, devno, NULL, "liu%d",0); 试下
lq651659889 2011-09-30
  • 打赏
  • 举报
回复
我的是自动创建节点号,在/proc/device中都能看到,只是在/dev下看不到自己创建的节点。
nevil 2011-09-30
  • 打赏
  • 举报
回复
device_create(my_cdev_class,NULL,devno,"liu" "%d",0);
这句话改成
device_create(my_cdev_class,NULL,devno,"liu%d",0); 试下
forch 2011-09-30
  • 打赏
  • 举报
回复
改成自动获取节点吧,省事,不会出错。
给你个参考代码,我自己写的,代码肯定能够没有问题。
static int __init spi_init(void)
{
int result;

dev = MKDEV(spi_major, 0);
/**/
if (spi_major)
{
result = register_chrdev_region(dev, 1, spi_name);
}
else /**/
{
result = alloc_chrdev_region(&dev, 0, 1, spi_name);
spi_major = MAJOR(dev);
}
if (result < 0)
{
return result;
}

cdev_init(&spiCdev, &spi_fops);
spiCdev.owner = THIS_MODULE;
spiCdev.ops = &spi_fops;
if (cdev_add(&spiCdev, dev, 1))
{
printk(KERN_NOTICE "Error adding spi %d", 0);
goto fail;
}


// 创建设备节点 /dev/%s tianyl 2011-09-29
spi_class=class_create(THIS_MODULE, spi_name);
device_create(spi_class,NULL,dev,spi_name);


spi_init_test();
printk("Init spi spi_init_test !\n");
return 0;

fail:
spi_exit();
return result;
}
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

4,469

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧