小编HBv*_*Bv6的帖子

将外部静态库的片段放置到特定位置

我的应用程序调用了一些放置在外部静态库中的函数。我将外部静态库链接到我的应用程序,一切正常(在这种情况下,我使用的是 GCC)。

然而,库的文本、.data 和 .bss 部分的位置(地址)由链接器选择。我可以通过修改链接器脚本来选择/更改它们的位置,但是这很乏味,因为我必须指定库的所有函数、变量等。我的意思是这样的:

. = 0x1000; /* new location */
KEEP(*(.text.library_function1));
KEEP(*(.text.library_function2));
[...]
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是通过为每个函数/变量放置一个段属性来构建外部库,然后通过重新定位整个段来修改链接器。就像是:

/* C source file */
unsigned char __attribute__((section (".myLibrarySection"))) variable1[10];
unsigned char __attribute__((section (".myLibrarySection"))) variable2[10];

/* Linker script */
. = 0x1000;
KEEP(*(.myLibrarySection))
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够重新定位外部静态库的整个 .text、.data 和 .bss 段,而无需使用这些技巧。

我想要这样的东西(在链接脚本中):

. = 0x1000;
KEEP(*(.text.library_file_name))
Run Code Online (Sandbox Code Playgroud)

是否可以使用 GCC 工具链?

是否可以使用其他工具链(IAR、Keil 等)?

c linker gcc iar keil

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

从100MHz基本时钟生成78MHz时钟

我必须使用VHDL语言从100MHz基本时钟(占空比0.5)生成78MHz时钟(占空比0.5或0.7)(因此比率为200/156).我知道我可以使用DCM,PLL或类似的,但此时(不幸的是)我不能.

因此我想使用(不包括任何DCM或PLL)一个简单的分频器,但在这种情况下我也知道频率只能用整数除(最小2,因为我会用计数器来做 - 和In我的情况我必须将基准时钟除以1,2820512820512820512820512820513 ...).

所以我不知道如何在不使用任何DCM或其他东西的情况下实现...我想将100MHz时钟分成更小的频率(如50MHz,25MHz等)并添加它们(例如50 + 25 + 3),但这是正确的方法(逻辑上我不这么认为)?

frequency vhdl

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

如何将“命令-i间隔|尾部”输出写入文件

我正在使用这个命令:

sar 1 | tail -n +3
Run Code Online (Sandbox Code Playgroud)

它输出以下内容(每 1 秒一次,我在几秒钟后中断它):

root@debian:/home/hyper/stats# sar 1 | tail -n +3
20:00:04        CPU     %user     %nice   %system   %iowait    %steal     %idle
20:00:05        all      0,25      0,00      0,50      0,00      0,00     99,25
20:00:06        all      0,50      0,00      0,25      0,00      0,00     99,25
20:00:07        all      4,79      0,00      1,01      0,00      0,00     94,21
20:00:08        all      0,75      0,00      0,75      0,75      0,00     97,74
20:00:09        all      1,26      0,00      0,76      0,00      0,00     97,98
20:00:10        all      0,75      0,00      0,50      0,00      0,00     98,74
^C
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试将此输出写入文件时。我尝试过:

sar 1 | tail -n …
Run Code Online (Sandbox Code Playgroud)

linux bash file tail sar

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

如何在不使用加法器的情况下制作数字的2补码

在双补码中反转一个数字的符号,你通常只是否定每一位并添加1.例如:

011 (3)
100 + 1 = 101 (-3)
Run Code Online (Sandbox Code Playgroud)

在VHDL中是:

a <= std_logic_vector(unsigned(not(a)) + 1);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,合成器使用N位加法器.

没有使用加法器,还有另一种更有效的解决方案吗?

verilog fpga vhdl twos-complement

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

如何清空文件内容,然后多次附加文本

我有一个文件(file.txt),我需要清空他当前的内容,然后多次附加一些文本.

示例:file.txt当前内容为:

AAA

BBB

CCC

我想删除此内容,然后第一次追加:

DDD

第二次:

EEE

等等...

我试过这个:

// empty the current content
fileOut = new FileWriter("file.txt");
fileOut.write("");
fileOut.close();

// append
fileOut = new FileWriter("file.txt", true);

// when I want to write something I just do this multiple times:
fileOut.write("text");
fileOut.flush();
Run Code Online (Sandbox Code Playgroud)

这工作正常,但似乎效率低下,因为我打开文件2次只是为了删除当前内容.

java file-io

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

优化代码以获得更高的清晰度和效率

这段代码工作正常,但我需要简化它以获得更清晰,并希望更高效:

int i = 0;

if (p.cap()) n++;
if (p.creditcard()) n++;
if (p.email()) n++;
[...]
if (p.price()) n++;
if (p.url()) n++;
if (p.zip()) n++;

if (n == 0) p.standard();
Run Code Online (Sandbox Code Playgroud)

正如代码所说,我需要调用多个方法(我不知道它们的有限数量).每一()*方法返回一个布尔值,仅当返回的值为true时,n才会递增.如果n == 0(当调用EVERY方法返回false时会发生这种情况)那么我需要调用p.standard().

如何编写更清晰有效的代码?我尝试了或者条件,这样的事情:

if (!( p.cap() || p.email() || p.isbn() || p.number() || p.phone() ||
       p.price() || p.time() || p.url() || p.zip() || p.creditcard()
    )) {
        p.standard();
}
Run Code Online (Sandbox Code Playgroud)

但显然它没有正常工作(例如:如果p.cap()返回true,则不调用其他方法).

我需要调用每个方法.

java optimization performance

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

将int(32位)转换为char(8位)

我有这些定义:

int data = uartBaseAddress[UART_DATA_REGISTER / 4]; // data coming from UART RX port
char message[20]; // array of 20 chars
Run Code Online (Sandbox Code Playgroud)

现在当我尝试这样做时:

message[0] = (char) data;
printf("%x", message[0]);
Run Code Online (Sandbox Code Playgroud)

它打印(例如): "ffffff9c".当然,我想只有最后8位("9C"),我不知道如何正确地从做转换intchar.

编辑:我的意思是:我必须像这样填充数组:

data = 0xFFFFFF9c;
message[0] = data & 0xFF; -- it has to contain only 9c
data = 0xFFFFFFde;
message[1] = data & 0xFF; -- it has to contain only de
etc...
Run Code Online (Sandbox Code Playgroud)

c arrays int type-conversion char

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

获取具有子集的列表的"相邻"值的算法

我有这样的文本文件:

A
B
C
Run Code Online (Sandbox Code Playgroud)

每个元素都有一个像这样的子集:

A = { a1, a2, a3 }
B = { b1, b2 }
C = { c1, c2, c3 }
Run Code Online (Sandbox Code Playgroud)

我想生成这个:

    a1, b1, c1
    a2, b1, c1
    a3, b1, c1
    a1, b2, c1
    a1, b1, c2
    a1, b1, c3

我不知道文本文件中的元素数量(例如可能是:A,B,C,D,E),并且子集的大小可能不同.

我只能认为这是一个带有2个索引的递归函数,可能是"数组中的位置"和"数组的索引",但我真的不知道如何实现所有这些.

我甚至尝试使用相同的输入调整笛卡尔积的函数,但我完全失败了.我不需要生成笛卡尔积.

java algorithm list subset

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