I am using YAGARTO Tool to compile my project based on AT91SAM7X512. I have developed one project without RTOS. Its code size become higher than 265K and ram size around 64K. It works Ok. Now, i want to add TCP/IP. So, that i first make working webserver on my hardware. The TCP/IP Stack which i have used is for AT91SAM7X256. So, i modified every where with AT91SAM7X512 header file with its flash and ram size. The stack which i have used is based on uIP with FreeRTOS. Currently this webserver is working ok. This stack size around 80K. Now, as i mearge this STACK (based on FreeRTOS) with my previous developed project, it stop working after total code size become higher than 265K. I am just adding code. I m not calling any function. As i remove some functions code and as code size less than 264K then it works ok but as it reach limit of 265K, webserver code stop working. I think this problem is created either by STARTUP File or some makefile command which limit code to AT91SAM7X256 flash size. So, How can i solve this problem ?
For refrence i have added below code of boot.s, atmel-rom.ld & Makefile.
/************** boot.s file code **************/
/* Sample initialization file */
.extern main
.extern exit
.extern AT91F_LowLevelInit
.extern vPortYieldProcessor
.text
.code 32
.align 0
.extern __stack_end__
.extern __bss_beg__
.extern __bss_end__
.extern __data_beg__
.extern __data_end__
.extern __data+beg_src__
.global start
.global endless_loop
/* Stack Sizes */
.set UND_STACK_SIZE, 0x00000004
.set ABT_STACK_SIZE, 0x00000004
.set FIQ_STACK_SIZE, 0x00000004
.set IRQ_STACK_SIZE, 0X00000400
.set SVC_STACK_SIZE, 0x00000400
/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
.set MODE_USR, 0x10 /* User Mode */
.set MODE_FIQ, 0x11 /* FIQ Mode */
.set MODE_IRQ, 0x12 /* IRQ Mode */
.set MODE_SVC, 0x13 /* Supervisor Mode */
.set MODE_ABT, 0x17 /* Abort Mode */
.set MODE_UND, 0x1B /* Undefined Mode */
.set MODE_SYS, 0x1F /* System Mode */
.equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */
.equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */
start:
_start:
_mainCRTStartup:
/* Setup a stack for each mode - note that this only sets up a usable stack
for system/user, SWI and IRQ modes. Also each mode is setup with
interrupts initially disabled. */
ldr r0, .LC6
msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */
mov sp, r0
sub r0, r0, #UND_STACK_SIZE
msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */
mov sp, r0
sub r0, r0, #ABT_STACK_SIZE
msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */
mov sp, r0
sub r0, r0, #FIQ_STACK_SIZE
msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */
mov sp, r0
sub r0, r0, #IRQ_STACK_SIZE
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
mov sp, r0
sub r0, r0, #SVC_STACK_SIZE
msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* System Mode */
mov sp, r0
/* We want to start in supervisor mode. Operation will switch to system
mode when the first task starts. */
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT
bl AT91F_LowLevelInit
/* Clear BSS.
mov a2, #0 /* Fill value
mov fp, a2 /* Null frame pointer
mov r7, a2 /* Null frame pointer for Thumb
ldr r1, .LC1 /* Start of memory block
ldr r3, .LC2 /* End of memory block
subs r3, r3, r1 /* Length of block
beq .end_clear_loop
mov r2, #0
.clear_loop:
strb r2, [r1], #1
subs r3, r3, #1
bgt .clear_loop
.end_clear_loop:
/* Initialise data.
ldr r1, .LC3 /* Start of memory block
ldr r2, .LC4 /* End of memory block
ldr r3, .LC5
subs r3, r3, r1 /* Length of block
beq .end_set_loop
.set_loop:
ldrb r4, [r2], #1
strb r4, [r1], #1
subs r3, r3, #1
bgt .set_loop
.end_set_loop:
*/
/********************************************************************/
/* Clear BSS. */
mov a2, #0 /* Fill value */
mov fp, a2 /* Null frame pointer */
mov r7, a2 /* Null frame pointer for Thumb */
ldr r1, .LC1 /* Start of memory block */
ldr r3, .LC2 /* End of memory block */
subs r3, r3, r1 /* Length of block */
beq .end_clear_loop
mov r2, #0
.clear_loop:
strb r2, [r1], #1
subs r3, r3, #1
bgt .clear_loop
.end_clear_loop:
/* Initialise data. */
ldr r1, .LC3 /* Start of memory block */
ldr r2, .LC4 /* End of memory block */
ldr r3, .LC5
subs r3, r3, r1 /* Length of block */
beq .end_set_loop
.set_loop:
ldrb r4, [r2], #1
strb r4, [r1], #1
subs r3, r3, #1
bgt .set_loop
.end_set_loop:
/********************************************************************/
mov r0, #0 /* no arguments */
mov r1, #0 /* no argv either */
ldr lr, =main
bx lr
endless_loop:
b endless_loop
.align 0
.LC1:
.word __bss_beg__
.LC2:
.word __bss_end__
.LC3:
.word __data_beg__
.LC4:
.word __data_beg_src__
.LC5:
.word __data_end__
.LC6:
.word __stack_end__
/* Setup vector table. Note that undf, pabt, dabt, fiq just execute
a null loop. */
.section .startup,"ax"
.code 32
.align 0
b _start /* reset - _start */
ldr pc, _undf /* undefined - _undf */
ldr pc, _swi /* SWI - _swi */
ldr pc, _pabt /* program abort - _pabt */
ldr pc, _dabt /* data abort - _dabt */
nop /* reserved */
ldr pc, [pc,#-0xF20] /* IRQ - read the AIC */
ldr pc, _fiq /* FIQ - _fiq */
_undf: .word __undf /* undefined */
_swi: .word vPortYieldProcessor /* SWI */
_pabt: .word __pabt /* program abort */
_dabt: .word __dabt /* data abort */
_fiq: .word __fiq /* FIQ */
__undf: b . /* undefined */
__pabt: b . /* program abort */
__dabt: b . /* data abort */
__fiq: b . /* FIQ */
/**************** atmel-rom.ld code ****************/
MEMORY
{
/*
flash : ORIGIN = 0x00100000, LENGTH = 256K
ram : ORIGIN = 0x00200000, LENGTH = 64K
*/
flash : ORIGIN = 0x00100000, LENGTH = 512K
ram : ORIGIN = 0x00200000, LENGTH = 128K
}
/*
__stack_end__ = 0x00200000 + 64K - 4;
*/
__stack_end__ = 0x00200000 + 128K - 4;
SECTIONS
{
. = 0;
startup : { *(.startup)} >flash
prog :
{
*(.text)
*(.rodata)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
} >flash
__end_of_text__ = .;
.data :
{
__data_beg__ = .;
__data_beg_src__ = __end_of_text__;
*(.data)
__data_end__ = .;
} >ram AT>flash
.bss :
{
__bss_beg__ = .;
*(.bss)
} >ram
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections. */
. = ALIGN(32 /

;
}
. = ALIGN(32 /

;
_end = .;
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
PROVIDE (end = .);
/************** Makefile Code **************/
#RTOS_SOURCE_DIR=../../../Source
#DEMO_COMMON_DIR=../../Common/Minimal
#DEMO_INCLUDE_DIR=../../Common/include
#UIP_COMMON_DIR=../../Common/ethernet/uIP/uip-1.0/uip
RTOS_SOURCE_DIR=C:/pdf/ARM/FreeRTOSV4.7.0/FreeRTOS/Source
DEMO_COMMON_DIR=C:/pdf/ARM/FreeRTOSV4.7.0/FreeRTOS/Demo/Common/Minimal
DEMO_INCLUDE_DIR=C:/pdf/ARM/FreeRTOSV4.7.0/FreeRTOS/Demo/Common/include
SATURN_INCLUDE_DIR=C:/Eclipse_Def_WorkSpace/SATURN-II_Webserver/RTOSDemo/inc
SATURN_SOURCE_DIR=C:/Eclipse_Def_WorkSpace/SATURN-II_Webserver/RTOSDemo/src
UIP_COMMON_DIR=C:/pdf/ARM/FreeRTOSV4.7.0/FreeRTOS/Demo/Common/ethernet/uIP/uip-1.0/uip
CC=arm-elf-gcc
OBJCOPY=arm-elf-objcopy
LDSCRIPT=atmel-rom.ld
LD = arm-elf-ld -v
CPFLAGS = --output-target=binary
ODFLAGS = -x --syms
#LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map $(OBJECTS) libm.a -mno-thumb-interwork -lm
#LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map $(OBJECTS) libm.a -mno-thumb-interwork -lc
LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map $(OBJECTS) libm.a -lm
#LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map $(OBJECTS) libc.a libm.a libgcc.a -mno-thumb-interwork -lc
#LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.out -Xlinker -M -Xlinker -Map=rtosdemo.map $(OBJECTS) libm.a -lm
#$(OBJECTS) libc.a libm.a libgcc.a
DEBUG=-g
#OPTIM=-O3
OPTIM=-O2
CFLAGS= $(DEBUG) \
$(OPTIM) \
-T$(LDSCRIPT) \
-I . \
-I $(SATURN_INCLUDE_DIR) \
-I $(RTOS_SOURCE_DIR)/include \
-I $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S \
-I $(DEMO_INCLUDE_DIR) \
-I ./webserver \
-I $(UIP_COMMON_DIR) \
-I ./SrcAtmel \
-I ./USB \
-D SAM7_GCC \
-D THUMB_INTERWORK \
-mcpu=arm7tdmi \
-D PACK_STRUCT_END=__attribute\(\(packed\)\) \
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \
-fomit-frame-pointer \
-mthumb-interwork
THUMB_SOURCE= \
main.c \
./ParTest/ParTest.c \
$(DEMO_COMMON_DIR)/BlockQ.c \
$(DEMO_COMMON_DIR)/blocktim.c \
$(DEMO_COMMON_DIR)/flash.c \
$(DEMO_COMMON_DIR)/integer.c \
$(DEMO_COMMON_DIR)/GenQTest.c \
$(DEMO_COMMON_DIR)/QPeek.c \
$(DEMO_COMMON_DIR)/dynamic.c \
./webserver/uIP_Task.c \
./webserver/httpd.c \
./webserver/httpd-cgi.c \
./webserver/httpd-fs.c \
./webserver/http-strings.c \
$(UIP_COMMON_DIR)/uip_arp.c \
$(UIP_COMMON_DIR)/psock.c \
$(UIP_COMMON_DIR)/timer.c \
$(UIP_COMMON_DIR)/uip.c \
$(RTOS_SOURCE_DIR)/list.c \
$(RTOS_SOURCE_DIR)/censored.c \
$(RTOS_SOURCE_DIR)/tasks.c \
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/port.c \
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c \
./USB/USBSample.c
#./webserver/SAM7_EMAC.c \
ARM_SOURCE= \
enc28j60.c \
$(SATURN_SOURCE_DIR)/initSystem.c \
$(SATURN_SOURCE_DIR)/TFT_TouchScreen.c \
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/portISR.c \
./webserver/emac_isr.c \
./SrcAtmel/Cstartup_SAM7.c \
./USB/USB_ISR.c \
# $(SATURN_SOURCE_DIR)/Global_Var.c \
# $(SATURN_SOURCE_DIR)/Relay.c \
# $(SATURN_SOURCE_DIR)/AT45DB_Flash.c \
# $(SATURN_SOURCE_DIR)/i2c_devices.c \
# $(SATURN_SOURCE_DIR)/cs5463.c \
# $(SATURN_SOURCE_DIR)/Alarm_PF_Control.c \
# $(SATURN_SOURCE_DIR)/TFT_TouchScreen.c \
# $(SATURN_SOURCE_DIR)/Alarm_PF_Control.c \
# $(SATURN_SOURCE_DIR)/cs5463.c \
# $(SATURN_SOURCE_DIR)/i2c_devices.c \
# $(SATURN_SOURCE_DIR)/TFT_TouchScreen.c \
# ./src/timerisr.c \
# ./src/timersetup.c \
# ./src/isrsupport.c \
# ./src/lowlevelinit.c \
# ./src/blinker.c \
# ./src/Relay.c \
# ./src/TFT_TouchScreen.c \
# ./src/Global_Var.c \
# ./src/i2c_devices.c \
# ./src/AT45DB_Flash.c \
# ./src/cs5463.c \
# ./src/int_isr.c \
# ./src/Alarm_PF_Control.c \
# ./src/modbus_485.c \
# ./src/cdc_enumerate.c \
# ./src/main.c \
THUMB_OBJS = $(THUMB_SOURCE:.c=.o)
ARM_OBJS = $(ARM_SOURCE:.c=.o)
all: RTOSDemo.bin
#all: RTOSDemo.out RTOSDemo.bin
# @ echo "...copying"
# $(arm-elf-objcopy) $(--output-target=binary) RTOSDemo.out RTOSDemo.bin
# $(OD) $(ODFLAGS) main.out > main.dmp
# $(arm-elf-ld -v) $(LINKER_FLAGS) -o RTOSDemo.out RTOSDemo.bin
RTOSDemo.bin : RTOSDemo.hex
$(OBJCOPY) RTOSDemo.elf -O binary RTOSDemo.bin
RTOSDemo.hex : RTOSDemo.elf
$(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.hex
#RTOSDemo.out : $(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.hex
# $(arm-elf-objcopy) $(CPFLAGS) RTOSDemo.out RTOSDemo.bin
#RTOSDemo.out : RTOSDemo.elf
# $(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.out
# LINKER_FLAGS
#all: RTOSDemo.out
# @ echo "...copying"
# $(CP) $(CPFLAGS) RTOSDemo.out RTOSDemo.bin
# $(OD) $(ODFLAGS) RTOSDemo.out > RTOSDemo.dmp
#RTOSDemo.out: $(THUMB_OBJS) $(ARM_OBJS) atmel-rom.ld
# @ echo "..linking"
# $(LD) $(LFLAGS) -o main.out $(OBJECTS) libc.a libm.a libgcc.a
# $(LD) $(LINKER_FLAGS) -o RTOSDemo.out
#RTOSDemo.out : $(THUMB_OBJS) $(ARM_OBJS) boot.s Makefile
# $(CC) $(CFLAGS) $(ARM_OBJS) $(THUMB_OBJS) $(LIBS) boot.s $(LINKER_FLAGS)
RTOSDemo.elf : $(THUMB_OBJS) $(ARM_OBJS) boot.s Makefile
$(CC) $(CFLAGS) $(ARM_OBJS) $(THUMB_OBJS) $(LIBS) boot.s $(LINKER_FLAGS)
$(THUMB_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
$(CC) -c $(CFLAGS) -mthumb $< -o $@
$(ARM_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
$(CC) -c $(CFLAGS) $< -o $@
clean :
rm $(THUMB_OBJS)
rm $(ARM_OBJS)
touch Makefile
rm RTOSDemo.elf
rm RTOSDemo.bin
rm RTOSDemo.hex