小编Mik*_*ike的帖子

在Linux中,如何在现有类中使用device_create?

注意:我现在列出了这个问题,我反对改变实现(例如将类的创建移动到公共区域),如果它让事情变得更容易......我只是不确定怎么做.:结束注释

我有两个Linux内核模块,我正在尝试更新它们的/ sys条目.搜索谷歌和其他来源,我已经看到了许多代码:

static dev_t MyDev;
static struct class *c1;

static int __init start_func(void)
{
    ...
    MyDev = MKDEV(nMajor, MINOR_VERSION);
    register_chrdev_region(MyDev, 1, MODULE_NAME);
    c1 = class_create(THIS_MODULE, "chardrv");
    device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
    ....
Run Code Online (Sandbox Code Playgroud)

我已经验证了我的第一个模块这个代码是否有效,并且它正确地创建了一个:

/sys/class/chardrv/<MODULE_NAME>
Run Code Online (Sandbox Code Playgroud)

条目.我想知道的是如何在现有类中创建设备.换句话说,我的一个模块创建了这个新的chardrv类,现在我希望我的其他模块能够在同一个类下注册它的设备.

我不能再次调用class_create()(在第二个模块中),因为"chardrv"类已经存在...

所以我可以运行一个检查来查看/ sys/class/chardrv是否存在,这可以帮助我决定是否需要调用class_create(),这不是问题.让我们在这里放一些伪代码来澄清:

if ( path "/sys/class/chardrv" does not exist)
    new_class = class_create("chardrv")
else
    new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
Run Code Online (Sandbox Code Playgroud)

因此,根据这个例子,如果我的类已经存在,并且我只想从第二个模块添加我的新设备,我假设我需要创建一个类结构,并以某种方式使用正确的"chardrv类"属性填充它然后调用device_create和以前一样,但我不知道该怎么做.

c linux device-driver linux-kernel

13
推荐指数
2
解决办法
2万
查看次数

scanf()中的反转参数

我(很快)编写了一些代码并意外地将参数反转为scanf():

char i[] = "ABC1\t";
scanf(i, "%s");
Run Code Online (Sandbox Code Playgroud)

编译gcc -Werror -Wall -Wextra并没有抱怨这一点.显然,这段代码不起作用,但为什么没有gcc通知我,我颠倒了论点?它不能检测到i不是格式字符串,或者第二个参数不是可存储类型吗?

编辑
感谢您的洞察力,看起来我找到了答案,-Wformat旗帜上有一个扭曲,使这个"捕获"(在下面张贴以供参考)

c gcc compiler-errors

13
推荐指数
2
解决办法
464
查看次数

C中的空结构

我有一个没有成员的结构(目前),我想知道是否有可能抑制我得到的警告:

warning: struct has no members
Run Code Online (Sandbox Code Playgroud)

是否可以添加成员并保持sizeof结构为零?还有其他方法吗?

c struct warnings

12
推荐指数
5
解决办法
3万
查看次数

如何在Linux上将波特率设置为307200?

基本上我使用以下代码来设置串口的波特率:

struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(fd, TCSANOW, &options);
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是我知道我必须使用波特率为307200的设备进行通信.我该如何设置?cfsetispeed(&options, B307200);不起作用,没有B307200定义.

我尝试使用MOXA Uport 1150(实际上是USB转串口转换器)和英特尔主板的标准串口.我不知道后者的确切类型,setserial只是将其报告为16550A.

c c++ linux serial-port baud-rate

12
推荐指数
2
解决办法
3万
查看次数

直接比较两个枚举时为什么会出错?

我有一些代码我正在移植到一个新平台,它开始给我一个关于比较来自两个不同枚举器列表的两个枚举器的错误.我很困惑,为什么它给我一个错误.

C规范(6.7.2.2)的枚举指定程序部分指出:

枚举器列表中的标识符声明为具有int类型的常量,并且可以出现在允许的位置.127)带=的枚举数将其枚举常量定义为常量表达式的值.如果第一个枚举数没有=,则其枚举常量的值为0.

所以我应该能够使用与int常量相同的枚举成员.在这个小样本程序中:

enum first {
  a,
  b
};

enum second {
 c,
 d
};

int main(){
    enum first myf = a;
    enum second mys = c;

    if(myf == mys)
        printf("same value\n"); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译时gcc -Wall -Werror我收到消息:

错误:'enum first'和'enum second'之间的比较[-Werror = enum-compare]

我知道,如果我都强制类型转换myf,并mysintS中的编译器会很高兴,就像我可以设置几个int从s的价值观myfmys做的比较; 但为什么我必须做其中任何一个以摆脱警告?为什么这个警告首先存在?这样做有一些危险,我没有看到.


注意:
我已经阅读了关于这个enum-compare标志的gcc文档,但它没有说明任何内容:

-Wenum-compare
关于不同枚举类型的值之间的比较的警告.在C++中,还会诊断条件表达式中的枚举不匹配,并且默认情况下会启用警告.在C中,此警告由-Wall启用.

c comparison enums gcc integer

12
推荐指数
1
解决办法
1万
查看次数

什么是Qt的sysroot和前缀选项的实际例子

我正在查看可以为configureQt提供的脚本运行的所有选项.(特别是qt-everywhere-opensource-src-5.2.0).

经过大量的搜索,我已经确定这些东西最好记录在案,所以我希望能得到一些帮助.当我查看描述prefixsysroot配置选项时:

〜/ qt-everywhere-opensource-src-5.2.0 $ ./configure -help | grep"
sysroot " -extprefix <dir>...当使用-sysroot 时,安装所有内容<dir>,
-sysroot <dir>......设置<dir>为目标编译器和qmake的sysroot,并设置pkg-config路径.
-no-gcc-sysroot .....当使用-sysroot时,它禁止将--sysroot传递给编译器

〜/ qt-everywhere-opensource-src-5.2.0 $ ./configure -help | grep"prefix"
-prefix <dir>......这将安装相对于<dir>
-extprefix的所有内容<dir>...当使用-sysroot 时,安装所有内容<dir>,
-hostprefix [dir] ..开发时需要的工具和库

所以我之前使用-prefix过,它完全按照描述完成.它将所有内容放在提供的位置<dir>,然后当我使用<prefix_dir>/bin/qmake并在我的目标平台上安装它时,它想要找到所有共享对象库<prefix_dir>/lib.

我的印象是,如果我使用-sysroot它将安装所有内容,<sysroot_dir>当我在目标平台上安装我的应用程序时,它将搜索/lib.至少我希望这是真的.

现在,如果我的假设是正确的......那么重点是-extprefix什么?难道他们说如果我也可以把这里的东西很好,如果我同时使用-sysroot-extprefix

我想要使​​用的原因是-no-gcc-sysroot什么?如果我希望我的Qt库安装在"sysroot",为什么我不想gcc使用/知道相同的sysroot?

如果我能得到一些如何正确使用这些选项的实际例子,对其中一些的解释会很好,甚至更好.

linux embedded qt configure qt5

12
推荐指数
1
解决办法
1万
查看次数

如果.. else号小于,则无法访问的代码

假设我们在C(或类似语言)中有以下代码:

if (x < 10)
  do_work1();
else if (x < 5)
  do_work2();
Run Code Online (Sandbox Code Playgroud)

在某些情况下,是否会执行此条件的第二个分支?编译器是否会警告无法访问的代码?

c conditional-statements

11
推荐指数
2
解决办法
1037
查看次数

将巨大的文件(> 2GB)压缩到客户端的ZIP中

我使用node.js和构建上传工具socket.io,因为他们通常上传难以置信的巨大文件和正常的上传表格将无法正常工作.问题是他们希望在发送之前将文件压缩成zip,以提高传输效率.

我一直在研究像JSZipzip.js这样的压缩方法,但这些方法都不适用于非常大的文件.我能做什么?

javascript compression upload html5 node.js

11
推荐指数
1
解决办法
5933
查看次数

为什么X86提供了一对除法和乘法指令?

我注意到,unsigned int和int共享了相同的加法和减法指令.但是为整数除法和mutiply提供idivl/imull,为unsigned int提供divl/mull.我可以知道这个的根本原因吗?

c x86

11
推荐指数
1
解决办法
735
查看次数

分配函数指针的正确方法

我对将函数指针赋给变量的正确语法有点困惑.如果我有一个函数foo

int foo();
Run Code Online (Sandbox Code Playgroud)

我正在将指向foo的指针分配给变量栏

void * bar;
Run Code Online (Sandbox Code Playgroud)

如果我使用它似乎并不重要

bar = foo; 
// or 
bar = &foo; 
Run Code Online (Sandbox Code Playgroud)

在我看来,其中只有一个应该是正确的还是我错过了什么?

c function-pointers

11
推荐指数
2
解决办法
1万
查看次数