部分“ .text”不适用于区域iram1_0_seg'collect2:错误

时间:2019-01-29 11:26:51

标签: c esp8266

我对C没有太多经验,但是我正在尝试为ESP8266写一个基本的解释器,但是我无法编译它,这给了我一个错误,我无法修复。

这是我的代码:

static void testTimerCb(void *arg) {
    webprog_init();
}

void user_init(void) {
    ...
    os_timer_disarm(&testTimer);
    os_timer_setfn(&testTimer, testTimerCb, NULL);
    os_timer_arm(&testTimer, 10000, 0);    
}

在另一个文件中:

void webprog_init(){
    init("#1;2;0");
    scanCommand();
    print_result();
}

在另一个文件中:

#include <xml_parser.h>
#include <stdlib.h>
#include <mem.h>
#include <ctype.h>
#include "osapi.h"

char look[2] = "";
int indexx = 0;
char * input;

void init(char* code){
    input = code;
    indexx = 0;
    next();
}

void next(){
    if (indexx >= strlen(input))
    {
        look[0] = '\0';
    }else{
        look[0] = input[indexx]; 
        indexx = indexx + 1;
    }
}

Command scanCommand(){
    Command c;
    c.type = 0;
    c.arg1 = 0;
    c.arg2 = 0;

    if (look[0] == '\0') {
        return c;
    }

    else if (look[0] == '#') {

        int delimiterCount = 0;

        while (look[0] != '\0') {

            switch (look[0]) {

                case ';':
                    delimiterCount++;
                    break;

                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':

                    if (delimiterCount==0) {
                        c.type = appendCharToInt(c.type, look[0]);
                    }

                    else if(delimiterCount==1){
                        c.arg1 = appendCharToInt(c.arg1, look[0]);
                    }


                    else if(delimiterCount==2){
                        c.arg2 = appendCharToInt(c.arg2, look[0]);

                    }

                    else{
                        c.type = 0;
                        c.arg1 = 1;
                        c.arg2 = 0;
                        findEndOfCommand();
                        return c;
                    }

                    break;

                case '$':
                    next();
                    return c;
                    //break;

                default:
                    break;

            }

            next();


        }
    }

    else{
        c.type = 0;
        c.arg1 = 2;
        c.arg2 = 0;
        return c;
    }
    return c;
}

int charToInt(char c){
    return c-'0';
}

int appendCharToInt(int n, char c){
    return n*10 + charToInt(c);
}

void findEndOfCommand(){
    while (look[0] != '\0') {
        if (look[0] == '$') {
            next();
            return;
        }
        next();
    }
}

void print_result(){

    while (look[0]!='\0') {
        os_printf("%s, %d, %d, %c \n", token, kind, position, look[0]);
        next();
    }

}

错误是:

  

/卷/区分大小写/esp-open-sdk/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/../../../../xtensa- lx106-elf / bin / ld:   build / httpd.out部分.text' will not fit in region iram1_0_seg'   collect2:错误:ld返回1退出状态make:*** [build / httpd.out]   错误1

我也正在使用esphttpd project,但是它可以工作,并且在我编写了上面的代码之后,它显示了此错误。我发现,当我注释掉scanCommand方法时,错误消失了。你能帮我吗?

编辑: 这是我的makefile的内容:

#You can build this example in three ways:
# 'separate' - Separate espfs and binaries, no OTA upgrade
# 'combined' - Combined firmware blob, no OTA upgrade
# 'ota' - Combined firmware blob with OTA upgrades.
#Please do a 'make clean' after changing this.
OUTPUT_TYPE=separate
#OUTPUT_TYPE=combined
#OUTPUT_TYPE=ota

#SPI flash size, in K
ESP_SPI_FLASH_SIZE_K=1024
#0: QIO, 1: QOUT, 2: DIO, 3: DOUT
ESP_FLASH_MODE=0
#0: 40MHz, 1: 26MHz, 2: 20MHz, 15: 80MHz
ESP_FLASH_FREQ_DIV=0


ifeq ("$(OUTPUT_TYPE)","separate")
#In case of separate ESPFS and binaries, set the pos and length of the ESPFS here. 
ESPFS_POS = 0x18000
ESPFS_SIZE = 0x28000
endif

# Output directors to store intermediate compiled files
# relative to the project directory
BUILD_BASE  = build
FW_BASE     = firmware

# Base directory for the compiler. Needs a / at the end; if not set it'll use the tools that are in
# the PATH.
XTENSA_TOOLS_ROOT ?= /Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin/

# base directory of the ESP8266 SDK package, absolute
#SDK_BASE   ?= /Volumes/case-sensitive/esp-open-sdk/sdk
SDK_BASE = /Users/halasz/Projects/Iskola/Mgr/Lienka/esp_iot_sdk_v1.4.0

# Opensdk patches stdint.h when compiled with an internal SDK. If you run into compile problems pertaining to
# redefinition of int types, try setting this to 'yes'.
USE_OPENSDK?=no

#Esptool.py path and port
ESPTOOL     ?= /Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin/esptool.py
ESPPORT     ?= /dev/cu.usbserial
#ESPDELAY indicates seconds to wait between flashing the two binary images
ESPDELAY    ?= 3
ESPBAUD     ?= 460800

#Appgen path and name
APPGEN      ?= $(SDK_BASE)/tools/gen_appbin.py

# name for the target project
TARGET      = httpd

# which modules (subdirectories) of the project to include in compiling
MODULES     = mdns driver user
EXTRA_INCDIR    = include libesphttpd/include library

# libraries used in this project, mainly provided by the SDK
LIBS        = c gcc hal phy pp net80211 wpa main lwip crypto
#Add in esphttpd lib
LIBS += esphttpd

# compiler flags using during compilation of source files
CFLAGS      = -Os -ggdb -std=gnu99 -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \
        -nostdlib -mlongcalls -mtext-section-literals  -D__ets__ -DICACHE_FLASH \
        -Wno-address

# linker flags used to generate the main object file
LDFLAGS     = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static


# various paths from the SDK used in this project
SDK_LIBDIR  = lib
SDK_LDDIR   = ld
SDK_INCDIR  = include include/json

# select which tools to use as compiler, librarian and linker
CC      := $(XTENSA_TOOLS_ROOT)xtensa-lx106-elf-gcc
AR      := $(XTENSA_TOOLS_ROOT)xtensa-lx106-elf-ar
LD      := $(XTENSA_TOOLS_ROOT)xtensa-lx106-elf-gcc
OBJCOPY := $(XTENSA_TOOLS_ROOT)xtensa-lx106-elf-objcopy

#Additional (maybe generated) ld scripts to link in
EXTRA_LD_SCRIPTS:=


####
#### no user configurable options below here
####
SRC_DIR     := $(MODULES)
BUILD_DIR   := $(addprefix $(BUILD_BASE)/,$(MODULES))

SDK_LIBDIR  := $(addprefix $(SDK_BASE)/,$(SDK_LIBDIR))
SDK_INCDIR  := $(addprefix -I$(SDK_BASE)/,$(SDK_INCDIR))

SRC     := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c))
ASMSRC      = $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.S))
OBJ     = $(patsubst %.c,$(BUILD_BASE)/%.o,$(SRC))
OBJ     += $(patsubst %.S,$(BUILD_BASE)/%.o,$(ASMSRC))
APP_AR      := $(addprefix $(BUILD_BASE)/,$(TARGET)_app.a)


V ?= $(VERBOSE)
ifeq ("$(V)","1")
Q :=
vecho := @true
else
Q := @
vecho := @echo
endif

ifeq ("$(USE_OPENSDK)","yes")
CFLAGS      += -DUSE_OPENSDK
else
CFLAGS      += -D_STDINT_H
endif

ifeq ("$(GZIP_COMPRESSION)","yes")
CFLAGS      += -DGZIP_COMPRESSION
endif

ifeq ("$(USE_HEATSHRINK)","yes")
CFLAGS      += -DESPFS_HEATSHRINK
endif

ifeq ("$(ESPFS_POS)","")
#No hardcoded espfs position: link it in with the binaries.
LIBS += webpages-espfs
else
#Hardcoded espfs location: Pass espfs position to rest of code
CFLAGS += -DESPFS_POS=$(ESPFS_POS) -DESPFS_SIZE=$(ESPFS_SIZE)
endif

ifeq ("$(OUTPUT_TYPE)","ota")
CFLAGS += -DOTA_FLASH_SIZE_K=$(ESP_SPI_FLASH_SIZE_K)
endif


#Define default target. If not defined here the one in the included Makefile is used as the default one.
default-tgt: all

define maplookup
$(patsubst $(strip $(1)):%,%,$(filter $(strip $(1)):%,$(2)))
endef


#Include options and target specific to the OUTPUT_TYPE
include Makefile.$(OUTPUT_TYPE)

#Add all prefixes to paths
LIBS        := $(addprefix -l,$(LIBS))
ifeq ("$(LD_SCRIPT_USR1)", "")
LD_SCRIPT   := $(addprefix -T$(SDK_BASE)/$(SDK_LDDIR)/,$(LD_SCRIPT))
else
LD_SCRIPT_USR1  := $(addprefix -T$(SDK_BASE)/$(SDK_LDDIR)/,$(LD_SCRIPT_USR1))
LD_SCRIPT_USR2  := $(addprefix -T$(SDK_BASE)/$(SDK_LDDIR)/,$(LD_SCRIPT_USR2))
endif
INCDIR  := $(addprefix -I,$(SRC_DIR))
EXTRA_INCDIR    := $(addprefix -I,$(EXTRA_INCDIR))
MODULE_INCDIR   := $(addsuffix /include,$(INCDIR))

ESP_FLASH_SIZE_IX=$(call maplookup,$(ESP_SPI_FLASH_SIZE_K),512:0 1024:2 2048:5 4096:6)
ESPTOOL_FREQ=$(call maplookup,$(ESP_FLASH_FREQ_DIV),0:40m 1:26m 2:20m 0xf:80m 15:80m)
ESPTOOL_MODE=$(call maplookup,$(ESP_FLASH_MODE),0:qio 1:qout 2:dio 3:dout)
ESPTOOL_SIZE=$(call maplookup,$(ESP_SPI_FLASH_SIZE_K),512:4m 256:2m 1024:8m 2048:16m 4096:322m-c1)

ESPTOOL_OPTS=--port $(ESPPORT) --baud $(ESPBAUD)
ESPTOOL_FLASHDEF=--flash_freq $(ESPTOOL_FREQ) --flash_mode $(ESPTOOL_MODE) --flash_size $(ESPTOOL_SIZE)

vpath %.c $(SRC_DIR)
vpath %.S $(SRC_DIR)

define compile-objects
$1/%.o: %.c
    $(vecho) "CC $$<"
    $(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS)  -c $$< -o $$@

$1/%.o: %.S
    $(vecho) "CC $$<"
    $(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS)  -c $$< -o $$@
endef

.PHONY: all checkdirs clean libesphttpd default-tgt

all: checkdirs $(TARGET_OUT) $(FW_BASE)

libesphttpd/Makefile:
    $(Q) echo "No libesphttpd submodule found. Using git to fetch it..."
    $(Q) git submodule init
    $(Q) git submodule update

libesphttpd: libesphttpd/Makefile
    $(Q) make -C libesphttpd USE_OPENSDK=$(USE_OPENSDK)

$(APP_AR): libesphttpd $(OBJ)
    $(vecho) "AR $@"
    $(Q) $(AR) cru $@ $(OBJ)

checkdirs: $(BUILD_DIR)

$(BUILD_DIR):
    $(Q) mkdir -p $@

clean:
    $(Q) make -C libesphttpd clean
    $(Q) rm -f $(APP_AR)
    $(Q) rm -f $(TARGET_OUT)
    $(Q) find $(BUILD_BASE) -type f | xargs rm -f
    $(Q) rm -rf $(FW_BASE)


$(foreach bdir,$(BUILD_DIR),$(eval $(call compile-objects,$(bdir))))

0 个答案:

没有答案