Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 嵌入式编程_C_Embedded - Fatal编程技术网

C 嵌入式编程

C 嵌入式编程,c,embedded,C,Embedded,我在网上找到了这个问答: 问:对于优化来说,char、short或int类型哪个更好 答:在可能的情况下,最好避免 使用char和short作为本地 变量。对于char和 短编译器需要减少 局部变量的大小为8或16 每个赋值后的位。这是 已签名的被调用符号扩展 变量和零扩展 无符号变量。它已经实施 将寄存器向左移位24或 16位,后跟有符号或 无符号右移相同 数量,接受两条指令 (无符号字符的零扩展名) 接受一条指令)。这些转变 可以通过使用int和 局部变量的无符号int。这 这对我们来说尤其

我在网上找到了这个问答:

问:对于优化来说,char、short或int类型哪个更好

答:在可能的情况下,最好避免 使用char和short作为本地 变量。对于char和 短编译器需要减少 局部变量的大小为8或16 每个赋值后的位。这是 已签名的被调用符号扩展 变量和零扩展 无符号变量。它已经实施 将寄存器向左移位24或 16位,后跟有符号或 无符号右移相同 数量,接受两条指令 (无符号字符的零扩展名) 接受一条指令)。这些转变 可以通过使用int和 局部变量的无符号int。这 这对我们来说尤其重要 首先加载数据的计算 转换为局部变量,然后进行处理 局部变量中的数据。 即使数据输入和输出为8- 或16位的数量,这是值得的 考虑将它们处理为32位 数量

这是正确的吗?我认为最好避免使用char和short,因为这是算术转换(它们很可能会转换为int或long,这将导致编译器生成额外的指令)

Q:如何在基于ARM的系统中减少函数调用开销

答:避免函数的参数部分在寄存器中传递,部分在寄存器中传递 在堆栈上(拆分参数)。这不是由当前系统有效处理的 编译器:所有寄存器参数都推送到堆栈上

·避免使用参数数量可变的函数。Varargs函数。

关于“varargs”——这是因为参数将通过堆栈传递吗? 什么是参数部分通过寄存器传递,部分通过堆栈传递的函数,您能举个例子吗

我们可以说,函数参数的传递方式(通过寄存器或堆栈)在很大程度上取决于体系结构吗

谢谢

关于“varargs”,是这样吗 因为参数将被传递 越过堆栈?什么是函数 带有部分传入的args 寄存器,并部分通过堆栈, 你能举个例子吗

如果您有如下功能:

int my_func(int v1, int v2)
编译器可以使用处理器的内部寄存器在函数调用期间传递参数v1、v2

如果您有:

int my_func(int v1, int v2, ...., int v10)
参数使用的空间太大,无法使用处理器内部寄存器(空间不足),因此使用内部寄存器和堆栈

我们可以说,这种方式起作用了吗 参数是通过 寄存器或堆栈)强烈依赖于 关于建筑


是的,它也很大程度上取决于编译器。

我不认为当赋值为8位或16位时,大小的减小只会在从较大的值赋值时发生。例如,如果一个函数返回char,为什么在赋值给char时需要修改该值?如果有一些操作只能用较大的变量来完成,那么可能会有一个例外,但根据编译器和处理器的不同,我不确定这是否会经常出现

  • 是的,根据标准,几乎所有的计算和比较都是使用宽度至少为
    int
    的整数类型完成的。因此,使用较小的类型“仅”可以节省空间,另一方面可能会产生开销
  • vararg必须使用堆栈,因为处理这些参数的相应宏通常只使用指针跟踪所处理参数的实际位置

  • 简单地说:关于优化的建议是误导性的。不一定错,但不完整

    看来你的消息来源是。他表示,他主要谈论的是ARM的优化

    首先,处理char和short的方式高度依赖于处理器。根据体系结构的不同,转换可能是零成本或最低成本,这取决于转换发生的时间和方式——在加载时,操作类型,什么指令可以并行运行,实际上可能是免费的,这取决于代码的其余部分——例如,在TI DSP c64体系结构上,每个周期可以运行8个操作。通常最有效的使用是“本机”整数大小,但这也取决于数据来自何处-加载、修改和存储char/short数据可能比加载和转换为int、修改和存储为char/short更有效。也可能不是——这取决于体系结构和正在执行的操作。编译器通常会更好地查看是否为您执行此操作

    其次,在许多体系结构中,char和short与int一样快,特别是当计算避免隐式转换为int时。注意:这在C中很容易搞砸,比如“x=y+1”-强制转换为int(假设x&y是char或short),但好的是,几乎所有的编译器都足够聪明,可以为您优化转换。许多其他使用本地be char/short的情况会导致编译器根据以后的使用方式优化任何转换。这是因为在典型的处理器中,char/short的溢出/环绕与将其计算为int并在存储上转换(或者在以后的操作中简单地将该寄存器寻址为char/short,即获得“免费”转换)的结果相同

    在他们的例子中:

    int wordinc (int a)
    { 
       return a + 1;
    }
    short shortinc (short a)
    { 
        return a + 1;
    }
    char charinc (char a)
    { 
        return a + 1;
    }
    
    在许多体系结构/编译器中,它们在实践中运行速度同样快

    第三,在某些体系结构中,char/short比int快。自然大小为8或16位的嵌入式体系结构就是一个例子(不可否认,这不是您现在考虑的那种开发)

    第四,尽管在现代ram密集的大型缓存处理器环境中通常不是一个大问题,但保持本地堆栈存储大小较小(假设编译器不将其提升到寄存器)可能有助于提高缓存访问的效率,特别是一级缓存