小编Mar*_*ark的帖子

搜索文本后摆脱Vim的亮点

在VIM中,在使用"/"命令查找文本后,该文本仍然突出显示.

删除它的命令是什么?我根本不想删除突出显示功能,但是一旦我找到了我需要的东西,就不想拥有所有那些明亮的文本点.

谢谢.

vim

73
推荐指数
6
解决办法
4万
查看次数

从C中的函数返回局部变量

#include <stdio.h>

int foo1(void)
{
    int p;
    p = 99;
    return p;
}

char *foo2(void)
{
    char buffer[] = "test_123";
    return buffer;
}

int *foo3(void)
{
    int t[3] = {1,2,3};
    return t;
}

int main(void)
{
    int *p;
    char *s;

    printf("foo1: %d\n", foo1());
    printf("foo2: %s\n", foo2());
    printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时gcc -ansi -pedantic -W -Wall,编译器会发出foo2()和foo3()的警告消息:

warning: function returns address of local variable
Run Code Online (Sandbox Code Playgroud)

我认为不允许返回局部变量,但foo1()工作正常,似乎返回指向本地对象的指针和对象本身之间存在巨大差异.

任何人都能对这个问题有所了解吗?提前致谢!

c pointers local-variables

34
推荐指数
3
解决办法
4万
查看次数

有助于理解宏观

我在理解MTD驱动程序中的一些代码时遇到问题

#define ROUNDUP(x, y)       ((((x)+((y)-1))/(y))*(y))
...
static struct mtd_partition my_parts[] =
{
   {
      .name = "boot",
      .size = 0,
      .offset = 0,
      .mask_flags = MTD_WRITEABLE
   },
   {
      .name = "linux",
      .size = 0,
      .offset = 0
   },
   {
       .name = "rootfs",
       .size = 0,
       .offset = 0,
       .mask_flags = MTD_WRITEABLE
   },
   {
       .name = "nvram",
       .size = 0,
       .offset = 0
   },
   {
       .name = 0,
       .size = 0,
       .offset = 0
   }
}
...

i = (sizeof(bcm947xx_parts)/sizeof(struct mtd_partition)) - …
Run Code Online (Sandbox Code Playgroud)

c linux-kernel

5
推荐指数
1
解决办法
316
查看次数

关于Linux内核内部的问题

我正在阅读"Linux设备驱动程序,第3版",并面对一些我不太了解的内核项目.希望大师在这个论坛上帮助我.

1)Linux内核是否在内部使用虚拟或物理地址运行?让我特别困惑的是,有几种类型的地址(逻辑,虚拟,总线和物理),它们都是内核有效且可操作的.

2)CPU指令是否正确无法直接寻址存储在外围设备中的数据,因此可以使用可寻址存储器,即缓冲区,用于这些目的?

4)当请求信号量(值为0)并且必须等待它时,进程是否可以休眠?

4)原子操作 - 这些是由特定的CPU指令保证的吗?

linux linux-kernel

4
推荐指数
1
解决办法
1219
查看次数

在中断处理程序中传递args

考虑我们正在为裸机MCU编写固件,即没有操作系统.我被告知不可能(非法?)将参数传递给中断处理程序函数?

我不能准确理解为什么会这样?这有什么问题?

PS.是否可以在某些RTOS-es,嵌入式Linux等中进行,或者它从根本上是错误的?

embedded microcontroller

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

嵌入式编程

我发现这个问答网络:

问:优化的char,short或int类型哪个更好?

答:在可能的情况下,最好避免使用char和short作为局部变量.对于char和short类型,编译器需要在每次赋值后将局部变量的大小减小到8位或16位.对于有符号变量,这称为符号扩展,对于无符号变量,称为zeroextending.它是通过将寄存器左移24或16位,然后将有符号或无符号右移相同的量来实现的,取两条指令(无符号字符的零扩展需要一条指令).通过对局部变量使用int和unsigned int可以避免这些转换.这对于首先将数据加载到局部变量然后处理局部变量内的数据的计算尤为重要.即使数据输入和输出为8位或16位数量,也值得考虑将它们作为32位数量处理.

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

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

答:避免使用部分传递给寄存器且部分传递给堆栈的参数的函数(split-argument).当前编译器无法有效处理:所有寄存器参数都被压入堆栈.

·避免使用可变数量的参数的函数.Varargs功能....

关于'varargs' - 这是因为参数将通过堆栈传递吗?什么是args部分传递到寄存器中的函数,部分通过堆栈,你能举例吗?

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

谢谢 !

c embedded

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