将 m5ops.h 链接到 C 项目
Linking m5ops.h to a C project
我有一个 C 应用程序正在使用 Gem5 操作中的一个函数,称为 "m5_dumpreset_stats()"。
所以,我做了以下,我包含了这个函数的头文件:
#include "../gem5-stable/util/m5/m5op.h"
然后在我的源文件中调用函数:
void foo()
{
m5_dumpreset_stats(0,0);
/* For loop */
m5_dumpreset_stats(0,0);
}
为了构建我的项目,我使用了 Makefile:
CC=arm-linux-gnueabi-gcc
CFLAGS=-g -c -Wall -O3 -mfpu=neon
LDFLAGS=-static
SOURCES=$ foo.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=foo
all: $(TASKMAP) $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -lm -o $@
.c.o:
$(CC) $(CFLAGS) $< -lm -o $@
clean:
rm -fr $(OBJECTS) $(EXECUTABLE)
我的第一个猜测是我必须 link 使用 Makefile 的库,但老实说,我不知道怎么做?有人可以告诉我正确的方法吗?
P.S : m5_dumpreset_stats(delay,period): 在延迟纳秒内将模拟统计信息保存并重置到文件中;每纳秒重复一次。
由于您的 header 位于通常不被搜索的目录中,因此您的图书馆也可能如此。所以你需要两个标志:-l
引用库和 -L
添加其他库目录进行搜索。
如果我的图书馆 libm5op.a 位于 "../gem5-stable/util/m5",我可能会这样做:
$(CC) $(LDFLAGS) $(OBJECTS) -lm -L"../gem5-stable/util/m5" -lm5op -o $@
或一些适合您的情况。
感谢您的贡献。这是我的解决方案:
看到我正在使用 ARM 内核进行模拟我使用 Makefile.arm 生成一个名为 "m5" 的库然后我必须在我自己的 Makefile 中进行以下更改:
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -lm -L"/home/anoir/gem5-stable/util/m5" -lm5 -o $@
并且我将包含在我的头文件中以这样调用 m5op.h:
#include "/home/anoir/gem5-stable/util/m5/m5op.h"
最后,我在模拟器中对其进行了测试,并检查了统计文件并完美运行,谢谢你。
gem5 20更新程序
直接对程序集进行硬编码
有时,破解它并添加内联程序集会更容易。例如。在 aarch64
上,要转储您可以执行的统计信息:
mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x41 << 16);
其中一些说明的列表is available here and how you can deduce them on your own is explained here。
我有一个 C 应用程序正在使用 Gem5 操作中的一个函数,称为 "m5_dumpreset_stats()"。
所以,我做了以下,我包含了这个函数的头文件:
#include "../gem5-stable/util/m5/m5op.h"
然后在我的源文件中调用函数:
void foo()
{
m5_dumpreset_stats(0,0);
/* For loop */
m5_dumpreset_stats(0,0);
}
为了构建我的项目,我使用了 Makefile:
CC=arm-linux-gnueabi-gcc
CFLAGS=-g -c -Wall -O3 -mfpu=neon
LDFLAGS=-static
SOURCES=$ foo.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=foo
all: $(TASKMAP) $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -lm -o $@
.c.o:
$(CC) $(CFLAGS) $< -lm -o $@
clean:
rm -fr $(OBJECTS) $(EXECUTABLE)
我的第一个猜测是我必须 link 使用 Makefile 的库,但老实说,我不知道怎么做?有人可以告诉我正确的方法吗?
P.S : m5_dumpreset_stats(delay,period): 在延迟纳秒内将模拟统计信息保存并重置到文件中;每纳秒重复一次。
由于您的 header 位于通常不被搜索的目录中,因此您的图书馆也可能如此。所以你需要两个标志:-l
引用库和 -L
添加其他库目录进行搜索。
如果我的图书馆 libm5op.a 位于 "../gem5-stable/util/m5",我可能会这样做:
$(CC) $(LDFLAGS) $(OBJECTS) -lm -L"../gem5-stable/util/m5" -lm5op -o $@
或一些适合您的情况。
感谢您的贡献。这是我的解决方案: 看到我正在使用 ARM 内核进行模拟我使用 Makefile.arm 生成一个名为 "m5" 的库然后我必须在我自己的 Makefile 中进行以下更改:
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -lm -L"/home/anoir/gem5-stable/util/m5" -lm5 -o $@
并且我将包含在我的头文件中以这样调用 m5op.h:
#include "/home/anoir/gem5-stable/util/m5/m5op.h"
最后,我在模拟器中对其进行了测试,并检查了统计文件并完美运行,谢谢你。
gem5 20更新程序
直接对程序集进行硬编码
有时,破解它并添加内联程序集会更容易。例如。在 aarch64
上,要转储您可以执行的统计信息:
mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x41 << 16);
其中一些说明的列表is available here and how you can deduce them on your own is explained here。