首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向nds项目makefile添加p线程.h

向nds项目makefile添加p线程.h
EN

Stack Overflow用户
提问于 2018-10-14 17:54:22
回答 1查看 238关注 0票数 0

我在makefile中搜索并尝试链接了一个与nds平台的ARM项目,我仍然无法正确地链接它.

代码语言:javascript
复制
#-------------------------------------------------------------------------------
.SUFFIXES:
#-------------------------------------------------------------------------------

ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif

ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPRO")
endif

ifeq ($(strip $(DESMUME)),)
$(error "Please set DESMUME in your environment. export DESMUME=<path to>DeSmuME")
endif

include $(DEVKITARM)/base_rules

#-------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files
# DATA contains .bin files with extra data for the project (e.g. graphic tiles)
# NITRODATA contains the "virtual" file system accessed through filesystem lib
#-------------------------------------------------------------------------------
TARGET      :=  $(shell basename $(CURDIR))
BUILD       :=  build
SOURCES     :=  source
INCLUDES    :=  include
DATA        :=  data
NITRODATA   :=  nitrofiles

#-------------------------------------------------------------------------------
# options for code generation
#-------------------------------------------------------------------------------
ARCH    :=  -march=armv5te -mlittle-endian

CFLAGS  :=  -Wall -g -O2 \
            $(ARCH) -mtune=arm946e-s -fomit-frame-pointer -ffast-math
                # -Wall                     : enable all warnings
                # -g                        : enable debug info generation
                # -O2                       : code optimization level 2
                # $(ARCH) -mtune=arm946e-s  : tune code generation for specific machine
                # -fomit-frame-pointer      : avoid to use a 'frame-pointer' register in functions that do not need it
                # -ffast-math               : optimize math operations

CFLAGS  +=  $(INCLUDE) -DARM9

ASFLAGS :=  -g $(ARCH)
LDFLAGS =   -specs=ds_arm9.specs $(ARCH)

#-------------------------------------------------------------------------------
# any extra libraries we wish to link with the project (order is important)
#-------------------------------------------------------------------------------
LIBS    :=  -lfilesystem -lfat -lnds9

#-------------------------------------------------------------------------------
# list of directories containing libNDS libraries, this must be the top level
# containing include and lib
#-------------------------------------------------------------------------------
LIBNDS  :=  $(DEVKITPRO)/libnds

#---------------------------------------------------------------------------------
# check if the build directory is not created yet
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------

export OUTPUT   :=  $(CURDIR)/$(TARGET)

export VPATH    :=  $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))
export DEPSDIR  :=  $(CURDIR)/$(BUILD)

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
AFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
BINFILES    :=  $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.bin)))

export OFILES   :=  $(BINFILES:.bin=.o) $(CFILES:.c=.o)
export SFILES   :=  $(AFILES:.s=.o)

# GARLIC_API is the directory where the API's include and source code lives
#           (assume a relative structure of the GARLIC project directories)
export GARLICAPI    :=  $(CURDIR)/../GARLIC_API

export INCLUDE  :=  $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
                    $(foreach dir,$(LIBNDS),-I$(dir)/include) \
                    -I$(GARLICAPI)

export LIBPATHS :=  $(foreach dir,$(LIBNDS),-L$(dir)/lib)


#---------------------------------------------------------------------------------
# use CC for linking standard C projects 
#---------------------------------------------------------------------------------
export LD   :=  $(CC)


export _ADDFILES    :=  -d $(CURDIR)/$(NITRODATA)


.PHONY: $(BUILD) clean

#---------------------------------------------------------------------------------
$(BUILD):
    @[ -d $@ ] || mkdir -p $@
    @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

#---------------------------------------------------------------------------------
clean:
    @echo "Removing ALL intermediate files... "
    @echo "Por favor, recuerda que habitualmente NO es necesario hacer un 'clean' antes de un 'make'"
    @sleep 3
    @rm -fr $(BUILD) $(TARGET).elf $(TARGET).nds

#---------------------------------------------------------------------------------
run : $(TARGET).nds
    @echo "runing $(TARGET).nds with DesmuME"
    @$(DESMUME)/DeSmuME.exe $(TARGET).nds &

#---------------------------------------------------------------------------------
debug : $(TARGET).nds $(TARGET).elf
    @echo "testing $(TARGET).nds/.elf with DeSmuME_dev/Insight (gdb) through TCP port=1000"
    @$(DESMUME)/DeSmuME_dev.exe --arm9gdb=1000 $(TARGET).nds &
    @$(DEVKITPRO)/insight/bin/arm-eabi-insight $(TARGET).elf &

#---------------------------------------------------------------------------------
else

DEPENDS :=  $(OFILES:.o=.d) $(SFILES:.o=.d)

#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
$(OUTPUT).nds   :   $(OUTPUT).elf
$(OUTPUT).elf   :   $(OFILES) $(SFILES)

#---------------------------------------------------------------------------------
%.nds: %.elf
    @ndstool -c $@ -9 $< -b $(GAME_ICON) "$(GAME_TITLE);$(GAME_SUBTITLE1);$(GAME_SUBTITLE2)" $(_ADDFILES)
    @echo built ... $(notdir $@)

#---------------------------------------------------------------------------------
%.elf:
    @echo linking $(notdir $@)
    $(LD)  $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) $(SFILES) -o $@

#---------------------------------------------------------------------------------
%.bin.o :   %.bin
#---------------------------------------------------------------------------------
    @echo $(notdir $<)
    $(bin2o)

-include $(DEPSDIR)/*.d


#---------------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------

由于我不是在Windows环境中工作,所以我发现的当前线程库如下:

最后,我怀疑..。我真的不知道如何链接这个项目中线程的C库,在我的makefile中.甚至我都试图在代码中声明库..。就像这样:

代码语言:javascript
复制
#include <pthread.h>

然而,pthread_t型未被识别。

这与makefile中的链接有关吗?那样的话,我还能补充什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 08:21:18

windows在像任天堂DS这样的嵌入式系统上是没用的。只应使用已为目标平台重新构建的库,而不应使用宿主系统的库。

此外,类似p线程的东西依赖于操作系统来提供线程服务(通常是与POSIX兼容的操作系统),任天堂DS没有这样的服务:你是在裸金属上运行,而你只有你带来的服务。这并不意味着不可能在DS上执行多线程,但这意味着您必须自己完成,使用计时器中断触发代码,捕获堆栈和程序指针,将它们存储在某个位置,并恢复以前线程的指针。这被称为软件多线程。

希望的是,由于NDS有专门用于视频和音频复用/合成的硬件,以及用于串行设备通信和网络等慢任务的从处理器,因此您的ARM9 CPU通常是免费的,可以不间断地运行游戏逻辑,并且不需要多线程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52805481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档