电线库Visual Studio代码C++ CPP示例不起作用

发布于 2025-02-07 08:21:02 字数 13483 浏览 1 评论 0原文

我正在从Arduino Wire库(主发送者,从属接收器)中运行示例代码,但是我在从属训练器代码中遇到了一个错误。它在接收器功能上存在问题。

该代码在Arduino中起作用,那么为什么在Visual Studio代码中有所不同?我应该改变结构或其他任何东西吗?我不明白为什么会这样。

// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.

#include <Arduino.h>// <- I added this include
#include <Wire.h>

int led = LED_BUILTIN;

void recieveEvent(int howMany); // <- I added this

void setup(){
  Wire.begin(9);
  Wire.onReceive(recieveEvent); //<-This is the issue spot
  Serial.begin(115200);
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  digitalWrite(led, HIGH);       // briefly flash the LED
  while(Wire.available() > 1) {  // loop through all but the last
    char c = Wire.read();        // receive byte as a character
    Serial.print(c);             // print the character
  }
  int x = Wire.read();           // receive byte as an integer
  Serial.println(x);             // print the integer
  digitalWrite(led, LOW);
}

这是一个制作文件:

#******************************************************************************
# Generated by VisualTeensy V1.5.0 on 6/11/2022 at 2:32 PM
#
# Board              Teensy 3.2 / 3.1
# USB Type           Serial
# CPU Speed          96 MHz (overclock)
# Optimize           Faster
# Keyboard Layout    US English
#
# https://github.com/luni64/VisualTeensy
#******************************************************************************
SHELL            := cmd.exe
export SHELL

TARGET_NAME      := BASICSMasterSend
BOARD_ID         := TEENSY32

MCU              := mk20dx256

LIBS_SHARED_BASE := C:\Users\Sorin\OneDrive\Documents\Arduino\libraries
LIBS_SHARED      := Adafruit_PWM_Servo_Driver_Library 

LIBS_LOCAL_BASE  := lib
LIBS_LOCAL       := SPI Time Wire 

CORE_BASE        := C:\PROGRA~2\Arduino\hardware\teensy\avr\cores\teensy3
GCC_BASE         := C:\PROGRA~2\Arduino\hardware\tools\arm\bin
UPL_PJRC_B       := C:\PROGRA~2\Arduino\hardware\tools
UPL_TYCMD_B      := C:\tytools096\TyTools-0.9.7-win64

#******************************************************************************
# Flags and Defines
#******************************************************************************
TIME_SYM    := $(shell powershell [int][double]::Parse((Get-Date -UFormat %s)))

FLAGS_CPU   := -mthumb -mcpu=cortex-m4 -fsingle-precision-constant
FLAGS_OPT   := -O2
FLAGS_COM   := -g -Wall -ffunction-sections -fdata-sections -nostdlib -mno-unaligned-access -MMD
FLAGS_LSP   := 

FLAGS_CPP   := -fno-exceptions -fpermissive -felide-constructors -std=gnu++14 -Wno-error=narrowing -fno-rtti
FLAGS_C     := 
FLAGS_S     := -x assembler-with-cpp
FLAGS_LD    := -Wl,--print-memory-usage,--gc-sections,--relax,--defsym=__rtc_localtime=$(TIME_SYM) -T$(CORE_BASE)/mk20dx256.ld

LIBS        := -larm_cortexM4l_math -lm -lstdc++

DEFINES     := -D__MK20DX256__ -DTEENSYDUINO=154 -DARDUINO_TEENSY32 -DARDUINO=10813
DEFINES     += -DF_CPU=96000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH

CPP_FLAGS   := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_CPP)
C_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_C)
S_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_S)
LD_FLAGS    := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_LSP) $(FLAGS_LD)
AR_FLAGS    := rcs
NM_FLAGS    := --numeric-sort --defined-only --demangle --print-size

#******************************************************************************
# Colors
#******************************************************************************
COL_CORE    := [38;2;187;206;251m
COL_LIB     := [38;2;206;244;253m
COL_SRC     := [38;2;100;149;237m
COL_LINK    := [38;2;255;255;202m
COL_ERR     := [38;2;255;159;159m
COL_OK      := [38;2;179;255;179m
COL_RESET   := [0m

#******************************************************************************
# Folders and Files
#******************************************************************************
USR_SRC         := src
LIB_SRC         := lib
CORE_SRC        := $(CORE_BASE)

BIN             := .vsteensy/build
USR_BIN         := $(BIN)/src
CORE_BIN        := $(BIN)/core
LIB_BIN         := $(BIN)/lib
CORE_LIB        := $(BIN)/core.a
TARGET_HEX      := $(BIN)/$(TARGET_NAME).hex
TARGET_ELF      := $(BIN)/$(TARGET_NAME).elf
TARGET_LST      := $(BIN)/$(TARGET_NAME).lst
TARGET_SYM      := $(BIN)/$(TARGET_NAME).sym

#******************************************************************************
# BINARIES
#******************************************************************************
CC              := $(GCC_BASE)/arm-none-eabi-gcc
CXX             := $(GCC_BASE)/arm-none-eabi-g++
AR              := $(GCC_BASE)/arm-none-eabi-gcc-ar
NM              := $(GCC_BASE)/arm-none-eabi-gcc-nm
SIZE            := $(GCC_BASE)/arm-none-eabi-size
OBJDUMP         := $(GCC_BASE)/arm-none-eabi-objdump
OBJCOPY         := $(GCC_BASE)/arm-none-eabi-objcopy
UPL_PJRC        := "$(UPL_PJRC_B)/teensy_post_compile" -test -file=$(TARGET_NAME) -path=$(BIN) -tools="$(UPL_PJRC_B)" -board=$(BOARD_ID) -reboot
UPL_TYCMD       := $(UPL_TYCMD_B)/tyCommanderC upload $(TARGET_HEX) --autostart --wait --multi
UPL_CLICMD      := $(UPL_CLICMD_B)/teensy_loader_cli -mmcu=$(MCU) -v $(TARGET_HEX)
UPL_JLINK       := $(UPL_JLINK_B)/jlink -commanderscript .vsteensy/flash.jlink

#******************************************************************************
# Source and Include Files
#******************************************************************************
# Recursively create list of source and object files in USR_SRC and CORE_SRC
# and corresponding subdirectories.
# The function rwildcard is taken from http://stackoverflow.com/a/12959694)

rwildcard =$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

#User Sources -----------------------------------------------------------------
USR_C_FILES     := $(call rwildcard,$(USR_SRC)/,*.c)
USR_CPP_FILES   := $(call rwildcard,$(USR_SRC)/,*.cpp)
USR_S_FILES     := $(call rwildcard,$(USR_SRC)/,*.S)
USR_OBJ         := $(USR_S_FILES:$(USR_SRC)/%.S=$(USR_BIN)/%.s.o) $(USR_C_FILES:$(USR_SRC)/%.c=$(USR_BIN)/%.c.o) $(USR_CPP_FILES:$(USR_SRC)/%.cpp=$(USR_BIN)/%.cpp.o)

# Core library sources --------------------------------------------------------
CORE_CPP_FILES  := $(call rwildcard,$(CORE_SRC)/,*.cpp)
CORE_C_FILES    := $(call rwildcard,$(CORE_SRC)/,*.c)
CORE_S_FILES    := $(call rwildcard,$(CORE_SRC)/,*.S)
CORE_OBJ        := $(CORE_S_FILES:$(CORE_SRC)/%.S=$(CORE_BIN)/%.s.o) $(CORE_C_FILES:$(CORE_SRC)/%.c=$(CORE_BIN)/%.c.o) $(CORE_CPP_FILES:$(CORE_SRC)/%.cpp=$(CORE_BIN)/%.cpp.o)

# User library sources (see https://github.com/arduino/arduino/wiki/arduino-ide-1.5:-library-specification)
LIB_DIRS_SHARED := $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/ $(LIBS_SHARED_BASE)/$d/utility/)      # base and /utility
LIB_DIRS_SHARED += $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_SHARED_BASE)/$d/src/,*/.)))        # src and all subdirs of base

LIB_DIRS_LOCAL  := $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/ $(LIBS_LOCAL_BASE)/$d/utility/ )                                       # base and /utility
LIB_DIRS_LOCAL  += $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_LOCAL_BASE)/$d/src/,*/.)))           # src and all subdirs of base

LIB_CPP_SHARED  := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.cpp))
LIB_C_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.c))
LIB_S_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.S))

LIB_CPP_LOCAL   := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.cpp))
LIB_C_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.c))
LIB_S_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.S))

LIB_OBJ         := $(LIB_CPP_SHARED:$(LIBS_SHARED_BASE)/%.cpp=$(LIB_BIN)/%.cpp.o)  $(LIB_CPP_LOCAL:$(LIBS_LOCAL_BASE)/%.cpp=$(LIB_BIN)/%.cpp.o)
LIB_OBJ         += $(LIB_C_SHARED:$(LIBS_SHARED_BASE)/%.c=$(LIB_BIN)/%.c.o)  $(LIB_C_LOCAL:$(LIBS_LOCAL_BASE)/%.c=$(LIB_BIN)/%.c.o)
LIB_OBJ         += $(LIB_S_SHARED:$(LIBS_SHARED_BASE)/%.S=$(LIB_BIN)/%.s.o)  $(LIB_S_LOCAL:$(LIBS_LOCAL_BASE)/%.S=$(LIB_BIN)/%.s.o)

# Includes -------------------------------------------------------------
INCLUDE         := -I./$(USR_SRC) -I$(CORE_SRC)
INCLUDE         += $(foreach d, $(LIBS_LOCAL),-I$(LIBS_LOCAL_BASE)/$d/ -I$(LIBS_LOCAL_BASE)/$d/src -I$(LIBS_LOCAL_BASE)/$d/utility/)
INCLUDE         += $(foreach d, $(LIBS_SHARED), -I$(LIBS_SHARED_BASE)/$d/ -I$(LIBS_SHARED_BASE)/$d/src -I$(LIBS_SHARED_BASE)/$d/utility/)

# Generate directories --------------------------------------------------------
DIRECTORIES     :=  $(sort $(dir $(CORE_OBJ) $(USR_OBJ) $(LIB_OBJ)))
generateDirs    := $(foreach d, $(DIRECTORIES), $(shell if not exist "$d" mkdir "$d"))

#$(info dirs: $(DIRECTORIES))

#******************************************************************************
# Rules:
#******************************************************************************

.PHONY: directories all rebuild upload uploadTy uploadCLI clean cleanUser cleanCore

all:  $(TARGET_LST) $(TARGET_SYM) $(TARGET_HEX)

rebuild: cleanUser all

clean: cleanUser cleanCore cleanLib
    @echo $(COL_OK)cleaning done$(COL_RESET)

upload: all
    @$(UPL_PJRC)

uploadTy: all
    @$(UPL_TYCMD)

uploadCLI: all
    @$(UPL_CLICMD)

uploadJLink: all
    @$(UPL_JLINK)

# Core library ----------------------------------------------------------------
$(CORE_BIN)/%.s.o: $(CORE_SRC)/%.S
    @echo $(COL_CORE)CORE [ASM] $(notdir $<) $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c $<

$(CORE_BIN)/%.c.o: $(CORE_SRC)/%.c
    @echo $(COL_CORE)CORE [CC]  $(notdir $<) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c $<

$(CORE_BIN)/%.cpp.o: $(CORE_SRC)/%.cpp
    @echo $(COL_CORE)CORE [CPP] $(notdir $<) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<

$(CORE_LIB) : $(CORE_OBJ)
    @echo $(COL_LINK)CORE [AR] $@ $(COL_ERR)
    @$(AR) $(AR_FLAGS) $@ $^
    @echo $(COL_OK)Teensy core built successfully &&echo.

# Shared Libraries ------------------------------------------------------------
$(LIB_BIN)/%.s.o: $(LIBS_SHARED_BASE)/%.S
    @echo $(COL_LIB)LIB [ASM] $(notdir $<) $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.cpp.o: $(LIBS_SHARED_BASE)/%.cpp
    @echo $(COL_LIB)LIB [CPP] $(notdir $<) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.c.o: $(LIBS_SHARED_BASE)/%.c
    @echo $(COL_LIB)LIB [CC]  $(notdir $<) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c $<

# Local Libraries -------------------------------------------------------------
$(LIB_BIN)/%.s.o: $(LIBS_LOCAL_BASE)/%.S
    @echo $(COL_LIB)LIB [ASM] $(notdir $<) $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.cpp.o: $(LIBS_LOCAL_BASE)/%.cpp
    @echo $(COL_LIB)LIB [CPP] $(notdir $<) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.c.o: $(LIBS_LOCAL_BASE)/%.c
    @echo $(COL_LIB)LIB [CC]  $(notdir $<) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c $<

# Handle user sources ---------------------------------------------------------
$(USR_BIN)/%.s.o: $(USR_SRC)/%.S
    @echo $(COL_SRC)USER [ASM] $< $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o "$@" -c $<

$(USR_BIN)/%.c.o: $(USR_SRC)/%.c
    @echo $(COL_SRC)USER [CC]  $(notdir $<) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o "$@" -c $<

$(USR_BIN)/%.cpp.o: $(USR_SRC)/%.cpp
    @echo $(COL_SRC)USER [CPP] $(notdir $<) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o "$@" -c $<

# Linking ---------------------------------------------------------------------
$(TARGET_ELF): $(CORE_LIB) $(LIB_OBJ) $(USR_OBJ)
    @echo $(COL_LINK)
    @echo [LD]  $@ $(COL_ERR)
    @$(CC) $(LD_FLAGS) -o "$@" $(USR_OBJ) $(LIB_OBJ) $(CORE_LIB) $(LIBS)
    @echo $(COL_OK)User code built and linked to libraries &&echo.

%.lst: %.elf
    @echo [LST] $@
    @$(OBJDUMP) -d -S --demangle --no-show-raw-insn "$<" > "$@"
    @echo $(COL_OK)Sucessfully built project$(COL_RESET) &&echo.

%.sym: %.elf
    @echo [SYM] $@
    @$(NM) $(NM_FLAGS) "$<" > "$@"

%.hex: %.elf
    @echo $(COL_LINK)[HEX] $@
    @$(OBJCOPY) -O ihex -R.eeprom "$<" "$@"

# Cleaning --------------------------------------------------------------------
cleanUser:
    @echo $(COL_LINK)Cleaning user binaries...$(COL_RESET)
    @if exist $(USR_BIN) rd /s/q "$(USR_BIN)"
    @if exist "$(TARGET_LST)" del $(subst /,\,$(TARGET_LST))

cleanCore:
    @echo $(COL_LINK)Cleaning core binaries...$(COL_RESET)
    @if exist $(CORE_BIN) rd /s/q "$(CORE_BIN)"
    @if exist $(CORE_LIB) del  $(subst /,\,$(CORE_LIB))

cleanLib:
    @echo $(COL_LINK)Cleaning user library binaries...$(COL_RESET)
    @if exist $(LIB_BIN) rd /s/q "$(LIB_BIN)"

# compiler generated dependency info ------------------------------------------
-include $(CORE_OBJ:.o=.d)
-include $(USR_OBJ:.o=.d)
-include $(LIB_OBJ:.o=.d)

此信息可能不是必需的:我正在使用Visual Teensy和Tycommander在Visual Studio代码上运行Teensy 3.2

I'm running example code from the Arduino Wire library (Master Sender, Slave Reciever), but I get an error in the Slave-Reciever code. It's having problems with the recieveEvent function.

The code works in Arduino, so why is it different in Visual Studio Code? Is there anything that I should change in structure or anything? I don't see why this would be.

// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.

#include <Arduino.h>// <- I added this include
#include <Wire.h>

int led = LED_BUILTIN;

void recieveEvent(int howMany); // <- I added this

void setup(){
  Wire.begin(9);
  Wire.onReceive(recieveEvent); //<-This is the issue spot
  Serial.begin(115200);
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  digitalWrite(led, HIGH);       // briefly flash the LED
  while(Wire.available() > 1) {  // loop through all but the last
    char c = Wire.read();        // receive byte as a character
    Serial.print(c);             // print the character
  }
  int x = Wire.read();           // receive byte as an integer
  Serial.println(x);             // print the integer
  digitalWrite(led, LOW);
}

This is the Make File:

#******************************************************************************
# Generated by VisualTeensy V1.5.0 on 6/11/2022 at 2:32 PM
#
# Board              Teensy 3.2 / 3.1
# USB Type           Serial
# CPU Speed          96 MHz (overclock)
# Optimize           Faster
# Keyboard Layout    US English
#
# https://github.com/luni64/VisualTeensy
#******************************************************************************
SHELL            := cmd.exe
export SHELL

TARGET_NAME      := BASICSMasterSend
BOARD_ID         := TEENSY32

MCU              := mk20dx256

LIBS_SHARED_BASE := C:\Users\Sorin\OneDrive\Documents\Arduino\libraries
LIBS_SHARED      := Adafruit_PWM_Servo_Driver_Library 

LIBS_LOCAL_BASE  := lib
LIBS_LOCAL       := SPI Time Wire 

CORE_BASE        := C:\PROGRA~2\Arduino\hardware\teensy\avr\cores\teensy3
GCC_BASE         := C:\PROGRA~2\Arduino\hardware\tools\arm\bin
UPL_PJRC_B       := C:\PROGRA~2\Arduino\hardware\tools
UPL_TYCMD_B      := C:\tytools096\TyTools-0.9.7-win64

#******************************************************************************
# Flags and Defines
#******************************************************************************
TIME_SYM    := $(shell powershell [int][double]::Parse((Get-Date -UFormat %s)))

FLAGS_CPU   := -mthumb -mcpu=cortex-m4 -fsingle-precision-constant
FLAGS_OPT   := -O2
FLAGS_COM   := -g -Wall -ffunction-sections -fdata-sections -nostdlib -mno-unaligned-access -MMD
FLAGS_LSP   := 

FLAGS_CPP   := -fno-exceptions -fpermissive -felide-constructors -std=gnu++14 -Wno-error=narrowing -fno-rtti
FLAGS_C     := 
FLAGS_S     := -x assembler-with-cpp
FLAGS_LD    := -Wl,--print-memory-usage,--gc-sections,--relax,--defsym=__rtc_localtime=$(TIME_SYM) -T$(CORE_BASE)/mk20dx256.ld

LIBS        := -larm_cortexM4l_math -lm -lstdc++

DEFINES     := -D__MK20DX256__ -DTEENSYDUINO=154 -DARDUINO_TEENSY32 -DARDUINO=10813
DEFINES     += -DF_CPU=96000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH

CPP_FLAGS   := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_CPP)
C_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_C)
S_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_S)
LD_FLAGS    := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_LSP) $(FLAGS_LD)
AR_FLAGS    := rcs
NM_FLAGS    := --numeric-sort --defined-only --demangle --print-size

#******************************************************************************
# Colors
#******************************************************************************
COL_CORE    := [38;2;187;206;251m
COL_LIB     := [38;2;206;244;253m
COL_SRC     := [38;2;100;149;237m
COL_LINK    := [38;2;255;255;202m
COL_ERR     := [38;2;255;159;159m
COL_OK      := [38;2;179;255;179m
COL_RESET   := [0m

#******************************************************************************
# Folders and Files
#******************************************************************************
USR_SRC         := src
LIB_SRC         := lib
CORE_SRC        := $(CORE_BASE)

BIN             := .vsteensy/build
USR_BIN         := $(BIN)/src
CORE_BIN        := $(BIN)/core
LIB_BIN         := $(BIN)/lib
CORE_LIB        := $(BIN)/core.a
TARGET_HEX      := $(BIN)/$(TARGET_NAME).hex
TARGET_ELF      := $(BIN)/$(TARGET_NAME).elf
TARGET_LST      := $(BIN)/$(TARGET_NAME).lst
TARGET_SYM      := $(BIN)/$(TARGET_NAME).sym

#******************************************************************************
# BINARIES
#******************************************************************************
CC              := $(GCC_BASE)/arm-none-eabi-gcc
CXX             := $(GCC_BASE)/arm-none-eabi-g++
AR              := $(GCC_BASE)/arm-none-eabi-gcc-ar
NM              := $(GCC_BASE)/arm-none-eabi-gcc-nm
SIZE            := $(GCC_BASE)/arm-none-eabi-size
OBJDUMP         := $(GCC_BASE)/arm-none-eabi-objdump
OBJCOPY         := $(GCC_BASE)/arm-none-eabi-objcopy
UPL_PJRC        := "$(UPL_PJRC_B)/teensy_post_compile" -test -file=$(TARGET_NAME) -path=$(BIN) -tools="$(UPL_PJRC_B)" -board=$(BOARD_ID) -reboot
UPL_TYCMD       := $(UPL_TYCMD_B)/tyCommanderC upload $(TARGET_HEX) --autostart --wait --multi
UPL_CLICMD      := $(UPL_CLICMD_B)/teensy_loader_cli -mmcu=$(MCU) -v $(TARGET_HEX)
UPL_JLINK       := $(UPL_JLINK_B)/jlink -commanderscript .vsteensy/flash.jlink

#******************************************************************************
# Source and Include Files
#******************************************************************************
# Recursively create list of source and object files in USR_SRC and CORE_SRC
# and corresponding subdirectories.
# The function rwildcard is taken from http://stackoverflow.com/a/12959694)

rwildcard =$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

#User Sources -----------------------------------------------------------------
USR_C_FILES     := $(call rwildcard,$(USR_SRC)/,*.c)
USR_CPP_FILES   := $(call rwildcard,$(USR_SRC)/,*.cpp)
USR_S_FILES     := $(call rwildcard,$(USR_SRC)/,*.S)
USR_OBJ         := $(USR_S_FILES:$(USR_SRC)/%.S=$(USR_BIN)/%.s.o) $(USR_C_FILES:$(USR_SRC)/%.c=$(USR_BIN)/%.c.o) $(USR_CPP_FILES:$(USR_SRC)/%.cpp=$(USR_BIN)/%.cpp.o)

# Core library sources --------------------------------------------------------
CORE_CPP_FILES  := $(call rwildcard,$(CORE_SRC)/,*.cpp)
CORE_C_FILES    := $(call rwildcard,$(CORE_SRC)/,*.c)
CORE_S_FILES    := $(call rwildcard,$(CORE_SRC)/,*.S)
CORE_OBJ        := $(CORE_S_FILES:$(CORE_SRC)/%.S=$(CORE_BIN)/%.s.o) $(CORE_C_FILES:$(CORE_SRC)/%.c=$(CORE_BIN)/%.c.o) $(CORE_CPP_FILES:$(CORE_SRC)/%.cpp=$(CORE_BIN)/%.cpp.o)

# User library sources (see https://github.com/arduino/arduino/wiki/arduino-ide-1.5:-library-specification)
LIB_DIRS_SHARED := $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/ $(LIBS_SHARED_BASE)/$d/utility/)      # base and /utility
LIB_DIRS_SHARED += $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_SHARED_BASE)/$d/src/,*/.)))        # src and all subdirs of base

LIB_DIRS_LOCAL  := $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/ $(LIBS_LOCAL_BASE)/$d/utility/ )                                       # base and /utility
LIB_DIRS_LOCAL  += $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_LOCAL_BASE)/$d/src/,*/.)))           # src and all subdirs of base

LIB_CPP_SHARED  := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.cpp))
LIB_C_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.c))
LIB_S_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.S))

LIB_CPP_LOCAL   := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.cpp))
LIB_C_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.c))
LIB_S_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.S))

LIB_OBJ         := $(LIB_CPP_SHARED:$(LIBS_SHARED_BASE)/%.cpp=$(LIB_BIN)/%.cpp.o)  $(LIB_CPP_LOCAL:$(LIBS_LOCAL_BASE)/%.cpp=$(LIB_BIN)/%.cpp.o)
LIB_OBJ         += $(LIB_C_SHARED:$(LIBS_SHARED_BASE)/%.c=$(LIB_BIN)/%.c.o)  $(LIB_C_LOCAL:$(LIBS_LOCAL_BASE)/%.c=$(LIB_BIN)/%.c.o)
LIB_OBJ         += $(LIB_S_SHARED:$(LIBS_SHARED_BASE)/%.S=$(LIB_BIN)/%.s.o)  $(LIB_S_LOCAL:$(LIBS_LOCAL_BASE)/%.S=$(LIB_BIN)/%.s.o)

# Includes -------------------------------------------------------------
INCLUDE         := -I./$(USR_SRC) -I$(CORE_SRC)
INCLUDE         += $(foreach d, $(LIBS_LOCAL),-I$(LIBS_LOCAL_BASE)/$d/ -I$(LIBS_LOCAL_BASE)/$d/src -I$(LIBS_LOCAL_BASE)/$d/utility/)
INCLUDE         += $(foreach d, $(LIBS_SHARED), -I$(LIBS_SHARED_BASE)/$d/ -I$(LIBS_SHARED_BASE)/$d/src -I$(LIBS_SHARED_BASE)/$d/utility/)

# Generate directories --------------------------------------------------------
DIRECTORIES     :=  $(sort $(dir $(CORE_OBJ) $(USR_OBJ) $(LIB_OBJ)))
generateDirs    := $(foreach d, $(DIRECTORIES), $(shell if not exist "$d" mkdir "$d"))

#$(info dirs: $(DIRECTORIES))

#******************************************************************************
# Rules:
#******************************************************************************

.PHONY: directories all rebuild upload uploadTy uploadCLI clean cleanUser cleanCore

all:  $(TARGET_LST) $(TARGET_SYM) $(TARGET_HEX)

rebuild: cleanUser all

clean: cleanUser cleanCore cleanLib
    @echo $(COL_OK)cleaning done$(COL_RESET)

upload: all
    @$(UPL_PJRC)

uploadTy: all
    @$(UPL_TYCMD)

uploadCLI: all
    @$(UPL_CLICMD)

uploadJLink: all
    @$(UPL_JLINK)

# Core library ----------------------------------------------------------------
$(CORE_BIN)/%.s.o: $(CORE_SRC)/%.S
    @echo $(COL_CORE)CORE [ASM] $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(CORE_BIN)/%.c.o: $(CORE_SRC)/%.c
    @echo $(COL_CORE)CORE [CC]  $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(CORE_BIN)/%.cpp.o: $(CORE_SRC)/%.cpp
    @echo $(COL_CORE)CORE [CPP] $(notdir 
lt;) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(CORE_LIB) : $(CORE_OBJ)
    @echo $(COL_LINK)CORE [AR] $@ $(COL_ERR)
    @$(AR) $(AR_FLAGS) $@ $^
    @echo $(COL_OK)Teensy core built successfully &&echo.

# Shared Libraries ------------------------------------------------------------
$(LIB_BIN)/%.s.o: $(LIBS_SHARED_BASE)/%.S
    @echo $(COL_LIB)LIB [ASM] $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(LIB_BIN)/%.cpp.o: $(LIBS_SHARED_BASE)/%.cpp
    @echo $(COL_LIB)LIB [CPP] $(notdir 
lt;) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(LIB_BIN)/%.c.o: $(LIBS_SHARED_BASE)/%.c
    @echo $(COL_LIB)LIB [CC]  $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c 
lt;

# Local Libraries -------------------------------------------------------------
$(LIB_BIN)/%.s.o: $(LIBS_LOCAL_BASE)/%.S
    @echo $(COL_LIB)LIB [ASM] $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(LIB_BIN)/%.cpp.o: $(LIBS_LOCAL_BASE)/%.cpp
    @echo $(COL_LIB)LIB [CPP] $(notdir 
lt;) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c 
lt;

$(LIB_BIN)/%.c.o: $(LIBS_LOCAL_BASE)/%.c
    @echo $(COL_LIB)LIB [CC]  $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c 
lt;

# Handle user sources ---------------------------------------------------------
$(USR_BIN)/%.s.o: $(USR_SRC)/%.S
    @echo $(COL_SRC)USER [ASM] 
lt; $(COL_ERR)
    @"$(CC)" $(S_FLAGS) $(INCLUDE) -o "$@" -c 
lt;

$(USR_BIN)/%.c.o: $(USR_SRC)/%.c
    @echo $(COL_SRC)USER [CC]  $(notdir 
lt;) $(COL_ERR)
    @"$(CC)" $(C_FLAGS) $(INCLUDE) -o "$@" -c 
lt;

$(USR_BIN)/%.cpp.o: $(USR_SRC)/%.cpp
    @echo $(COL_SRC)USER [CPP] $(notdir 
lt;) $(COL_ERR)
    @"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o "$@" -c 
lt;

# Linking ---------------------------------------------------------------------
$(TARGET_ELF): $(CORE_LIB) $(LIB_OBJ) $(USR_OBJ)
    @echo $(COL_LINK)
    @echo [LD]  $@ $(COL_ERR)
    @$(CC) $(LD_FLAGS) -o "$@" $(USR_OBJ) $(LIB_OBJ) $(CORE_LIB) $(LIBS)
    @echo $(COL_OK)User code built and linked to libraries &&echo.

%.lst: %.elf
    @echo [LST] $@
    @$(OBJDUMP) -d -S --demangle --no-show-raw-insn "
lt;" > "$@"
    @echo $(COL_OK)Sucessfully built project$(COL_RESET) &&echo.

%.sym: %.elf
    @echo [SYM] $@
    @$(NM) $(NM_FLAGS) "
lt;" > "$@"

%.hex: %.elf
    @echo $(COL_LINK)[HEX] $@
    @$(OBJCOPY) -O ihex -R.eeprom "
lt;" "$@"

# Cleaning --------------------------------------------------------------------
cleanUser:
    @echo $(COL_LINK)Cleaning user binaries...$(COL_RESET)
    @if exist $(USR_BIN) rd /s/q "$(USR_BIN)"
    @if exist "$(TARGET_LST)" del $(subst /,\,$(TARGET_LST))

cleanCore:
    @echo $(COL_LINK)Cleaning core binaries...$(COL_RESET)
    @if exist $(CORE_BIN) rd /s/q "$(CORE_BIN)"
    @if exist $(CORE_LIB) del  $(subst /,\,$(CORE_LIB))

cleanLib:
    @echo $(COL_LINK)Cleaning user library binaries...$(COL_RESET)
    @if exist $(LIB_BIN) rd /s/q "$(LIB_BIN)"

# compiler generated dependency info ------------------------------------------
-include $(CORE_OBJ:.o=.d)
-include $(USR_OBJ:.o=.d)
-include $(LIB_OBJ:.o=.d)

This info may or may not not be necessary: I'm running a Teensy 3.2 on Visual Studio Code using Visual Teensy and TyCommander

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文