我的应用程序调用了一些放置在外部静态库中的函数。我将外部静态库链接到我的应用程序,一切正常(在这种情况下,我使用的是 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 等)?
我必须使用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),但这是正确的方法(逻辑上我不这么认为)?
我正在使用这个命令:
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) 在双补码中反转一个数字的符号,你通常只是否定每一位并添加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位加法器.
没有使用加法器,还有另一种更有效的解决方案吗?
我有一个文件(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次只是为了删除当前内容.
这段代码工作正常,但我需要简化它以获得更清晰,并希望更高效:
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,则不调用其他方法).
我需要调用每个方法.
我有这些定义:
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"),我不知道如何正确地从做转换int
到char
.
编辑:我的意思是:我必须像这样填充数组:
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) 我有这样的文本文件:
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个索引的递归函数,可能是"数组中的位置"和"数组的索引",但我真的不知道如何实现所有这些.
我甚至尝试使用相同的输入调整笛卡尔积的函数,但我完全失败了.我不需要生成笛卡尔积.