小编Ara*_*uhi的帖子

如何在C中用malloc初始化静态指针?

我正在尝试在C中使用malloc启动静态变量(在函数内),但我得到的是"初始化程序不是常量错误".我知道我不能在C中用非常量启动静态,但是有人能想到一个解决方案吗?我需要代码具有与此相同的效果:

static int *p = (int *)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

有诀窍/解决方法吗?

编辑:我有一个函数,每次标志变高时调用.在这个函数中,我正在创建并启动一个新线程.我声明了一个指向结构的指针,并使用malloc分配内存,然后将此指针传递给线程.然后该函数返回控制.当我重新进入该函数时,我最初打开的线程仍将运行,我希望能够访问我最初传递给线程的内存区域.这就是为什么我需要一个静态,以便我可以在第一次调用时使用malloc,然后在后续调用中使用相同的地址.这样我就可以从线程中获取信息.这一切都是为了避免使用全局变量.

c malloc static constants initializer

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

为什么在启动步骤中需要“MLO”?

我正在研究 Pandaboard 上的启动步骤。根据此操作指南,它们有多个引导步骤(引导 rom > X-loader 或 SPL > U-boot > Linux 内核)。实际上,我不明白为什么他们的这些步骤效率低下。我不能只加载 u-boot 而不是使用名为“MLO”的文件吗?“MLO”实际上是做什么的?他们必须放置“MLO”而不是直接加载 u-boot 是否有任何重要原因?

linux

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

中断处理程序是否必须是可重入的?

我在中断处理程序中使用静态变量,使中断处理程序不可重入.

  1. 拥有一个不可重入的中断处理程序是否可以?
  2. 当引发硬件中断时,事件是否进入某种队列并等待当前中断处理程序调用完成或是否立即调用中断处理程序?

谢谢

PS.我正在使用Linux.我正在使用的编程语言是C,如果它有所作为.

c interrupt reentrancy interrupt-handling

6
推荐指数
1
解决办法
4872
查看次数

通过Xilinx FPGA的MGT传输信号的最简单方法是什么?

我想在Xilinx FPGA的MGT通道上发送信号(无论什么类型的信号,只是随机二进制).这用于测试PCB上的MGT迹线.我能做到这一点最简单的方法是什么?对于常规IO,我只需使用输出缓冲器(OBUF)并将信号发送到输出引脚.对于MGT银行引脚,这相当于(或最简单的等价物)是什么?

编辑:我想尽可能远离ipcores.我正在寻找一种非常简单的解决方案,以某种方式缓冲信号到MGT引脚.

fpga xilinx

6
推荐指数
1
解决办法
406
查看次数

memcmp但需要将块与固定值进行比较

我需要将一块内存与C中的固定值进行比较.我可以用memcmp做这个吗?就像是:

memcmp(starting_address,fixed_value,num_byte)

我需要fixed_value作为固定值而不是块的起始地址.

  1. 将固定值写入整个临时存储器块不是一种选择,因为我的空间有限.
  2. 使用循环来逐个写入和检查内存不是一种选择,因为它非常慢.

如果不可能,任何人都可以告诉我一个与memcmp一样快(或更快)的解决方案吗?

谢谢,

编辑:假设我有5GB的内存,保持0.我正在努力确保他们都是0.检查块的第一个字节是否安全,然后执行此操作:

memcmp(starting_address,starting_address + ONE_BYTE,FIVE_GB); ?

编辑:这就是为什么我需要使用memcmp而不是用户定义的循环:

此代码运行了546个时钟周期:

memset(0x80000000 , 0x1 , 0x10000000);
memset(0x90000000 , 0x1 , 0x10000000);
memcmp(0x80000000 , 0x90000000 , 0x10000000);
Run Code Online (Sandbox Code Playgroud)

vs这个花了7669个时钟滴答:

unsigned int i;
int flag = 0;
int *p = 0x80000000;
int *q = 0x90000000;
while(p < 0x90000000)
{
    if(*p++ != *q++)
    {
        flag = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

c memcmp

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

-O0编译器标志与C中的volatile关键字具有相同的效果吗?

在C中使用-O0编译器标志时,告诉编译器避免任何类型的优化.将变量定义为时volatile,告诉编译器避免优化该变量.我们可以互换使用这两种方法吗?如果是这样,有什么优点和缺点?以下是我能想到的一些优点和缺点.还有吗?

优点:

  • 如果我们有一个很大的代码库,其中应该声明的变量不是,那么使用-O0标志会很有用volatile.如果代码显示错误行为,而不是进入代码并找到哪些变量需要声明为volatile,我们可以使用-O0标志来消除优化导致问题的可能性.

缺点:

  • -O0标志将影响整个代码,而volatile关键字只影响特定的变量.例如,如果我们正在研究一个小型微控制器,这可能是一个问题,因为使用-O0可能会产生一个大的可执行文件.

c optimization microcontroller volatile

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

_mm_set1_ps 和 _mm_set_ps1 有什么区别?

这些功能有什么区别吗?如果不是,为什么?

__m128 __mm_set1_ps(float a)
__m128 __mm_set_ps1(float a)
Run Code Online (Sandbox Code Playgroud)

Intel Intrinsics Guide网站上的两种描述是相同的。谢谢你。

c sse intrinsics

3
推荐指数
1
解决办法
790
查看次数

FPGA设计中"create_clock"命令的意义何在?

在FPGA编程中,在XDC(或UCF)文件中使用create_clock命令有什么意义?假设我有一个时钟端口CLK,它被分配给XDC(或UCF)文件中的物理引脚(我的时钟).为什么我不能继续在我的顶级HDL中使用这个CLK引脚?为什么我需要添加这样的东西:

create_clock -name sys_clk_pin -period "XXX" [get_ports "CLK"]
Run Code Online (Sandbox Code Playgroud)

另外,假设我有一个主时钟"CLK"以及我用HDL生成的其他一些时钟.我是否必须对XDC中的所有次要时钟使用"create_clock"?

我没有得到这整个"create_clock"的东西.任何帮助或方向都非常感谢.

谢谢

verilog clock fpga

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

将数组定义为非零常量

我有以下子模块:

module test
(
input [LENGTH : 1] array;
);

...

endmodule
Run Code Online (Sandbox Code Playgroud)

我从顶部模块调用它,如下所示:

...
wire [LENGTH-1 : 0] array_top;
test test_i
(
.array (array_top);
);
...
Run Code Online (Sandbox Code Playgroud)

假设LENGTH两个模块中的内容相同。

  1. 假设下降到零但下降到 1,将如何array_top映射到?arrayarray_toparray
  2. 为什么有人会定义一个数组到 1 而不是到 0?
  3. 会发生什么事呢array[0]

arrays verilog system-verilog

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

如何抑制TCL程序的输出消息?

在我的TCL脚本中,我使用了几个我没有源代码的程序.所有这些过程都执行一些任务并输出大量消息.但我只是希望完成任务,我想要压制消息.有没有办法做到这一点.

所以例如我想运行一个这样的过程:

my_proc $arg1 $arg2 $arg3
Run Code Online (Sandbox Code Playgroud)

并压制它的所有消息.任何变通办法/智能替代方案都值得赞赏.

更多信息:我正在使用一个自定义shell,它将一个TCL文件作为参数并运行它.在这个自定义shell中,我可以访问一些我没有代码的TCL过程.

或者甚至有什么方法可以让脚本的输出转到文件而不是命令提示符(stdout)?

tcl

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

为什么ESP8266加载php URL报DNS失败?

使用ESP8266并使用以下AT命令可以成功获取该网页:

AT+CIPSTART="TCP","www.somewebsite.com",80
AT+CIPSEND=80
> GET http://www.somewebsite.com HTTP/1.0
<I get a bunch of HTML here>
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在,我的网站上有一个php页面,该页面带有一些参数并相应地更新了数据库中的表。所以当我输入:

http://www.mywebsite.com/mypage.php?arg1 = one&arg2 = two

它成功更新了表。现在,当我尝试使用ESP8266进行相同操作时,出现DNS失败:

AT+CIPSTART="TCP","http://www.mywebsite.com/mypage.php?arg1=one&arg2=two",80
<get DNS fail here>
Run Code Online (Sandbox Code Playgroud)

即使我尝试不带参数的php页面,我也会收到DNS失败:

AT+CIPSTART="TCP","http://www.mywebsite.com/mypage.php",80
<get DNS fail here>
Run Code Online (Sandbox Code Playgroud)

有人知道发生了什么吗?可能是php页面不在端口80上吗?如果是这样,我如何找出它在哪个端口上?

顺便说一句,如果我对网站上的html页面执行相同操作,则效果很好。

编辑:当我尝试这样做:

AT+CIPSTART="TCP","www.mywebsite.com",80
> GET /mypage.php?arg1=one,arg2=two
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

未找到错误404

当我尝试:

AT+CIPSTART="TCP","www.mywebsite.com",80
> GET http://www.mywebsite.com/mypage.php?arg1=one,arg2=two
Run Code Online (Sandbox Code Playgroud)

我得到的是www.mywebsite.com/index.html的html代码,而不是php页面。

我也不确定GET命令中的“ HTTP / 1.0”是做什么的?

php tcp esp8266

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