Atmel website | ARM Community | AVR freaks | Technical Support
Banner
 FAQ •  Search •  Register •  Login 

All times are UTC + 1 hour [ DST ]




Post new topic Reply to topic  [ 2 posts ] 
Author Message
 Post subject: Code Limit in FreeRTOS with AT91SAM7X512
PostPosted: Sat May 30, 2009 6:09 am 
Offline

Joined: Wed Aug 13, 2008 1:25 pm
Posts: 2
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 / 8);
}
. = ALIGN(32 / 8);
_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


Top
 Profile  
 
 Post subject: Re: Code Limit in FreeRTOS with AT91SAM7X512
PostPosted: Sat Sep 25, 2010 3:31 am 
Offline

Joined: Fri Sep 24, 2010 10:00 pm
Posts: 3
I'd check the low-level initialization function and ensure it's enabling EFC1 as well as EFC0.

-Steve


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 2 posts ] 

All times are UTC + 1 hour [ DST ]


Who is online

Users browsing this forum: No registered users and 22 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to: