FreeRTOS + Rowley Crossworks

Hi, because of the debugger and jtag interface i am stuck on Rowley Crossworks for ARM. I’ts quite a nice program, but I have a little program. I just imported all the freertos and source files + boot.s. Only thing differt is that Rowley uses xml files to create the memory map linker file. mine (ARM7 2106 RAM) looks like this: <!DOCTYPE Linker_Placement_File> <Root name="Internal RAM" >   <MemorySegment size="0x00010000" access="Read/Write" start="0x40000000" name="RAM" >     <ProgramSection inputsections="__stack_end__ = 0x40000000 + 64K – 4;" name="__stack_end__" />     <ProgramSection load="Yes" inputsections=" *(.startup)" name=".startup" />     <ProgramSection load="Yes" inputsections="*(.text)*(.rodata)*(.rodata*)*(.glue_7)*(.glue_7t)" name=".prog" />     <ProgramSection load="Yes" inputsections="__data_beg__ = .;         __data_beg_src__ = __prog_end__;*(.data)         __data_end__ = .;" name=".data" />     <ProgramSection alignment="0x4" load="Yes" inputsections="__bss_beg__ = .;*(.bss)" name=".bss" />   </MemorySegment> </Root> After compile, the program create this file: MEMORY {   RAM (wx) : ORIGIN = 0x40000000, LENGTH = 0x00010000 } SECTIONS {   __RAM_segment_start__ = 0x40000000;   __RAM_segment_end__ = 0x40010000;   __stack_end__ __RAM_segment_start__ (NOLOAD) :   {     ____stack_end___start__ = .;     __stack_end__ = 0x40000000 + 64K – 4;   }   ____stack_end___end__ = ____stack_end___start__ + SIZEOF(__stack_end__);   . = ASSERT(____stack_end___end__ >= __RAM_segment_start__ && ____stack_end___end__ <= (__RAM_segment_start__ + 0x00010000) , "__stack_end__ is too large to fit in RAM memory segment");   .startup ____stack_end___end__ :   {     __startup_start__ = .;      *(.startup)   }   __startup_end__ = __startup_start__ + SIZEOF(.startup);   . = ASSERT(__startup_end__ >= __RAM_segment_start__ && __startup_end__ <= (__RAM_segment_start__ + 0x00010000) , ".startup is too large to fit in RAM memory segment");   .prog __startup_end__ :   {     __prog_start__ = .;     *(.text)*(.rodata)*(.rodata*)*(.glue_7)*(.glue_7t)   }   __prog_end__ = __prog_start__ + SIZEOF(.prog);   . = ASSERT(__prog_end__ >= __RAM_segment_start__ && __prog_end__ <= (__RAM_segment_start__ + 0x00010000) , ".prog is too large to fit in RAM memory segment");   .data __prog_end__ :   {     __data_start__ = .;     __data_beg__ = .;         __data_beg_src__ = __prog_end__;*(.data)         __data_end__ = .;   }   __data_end__ = __data_start__ + SIZEOF(.data);   . = ASSERT(__data_end__ >= __RAM_segment_start__ && __data_end__ <= (__RAM_segment_start__ + 0x00010000) , ".data is too large to fit in RAM memory segment");   .bss (__data_end__ + 3) / 4 * 4 :   {     __bss_start__ = .;     __bss_beg__ = .;*(.bss)   }   __bss_end__ = __bss_start__ + SIZEOF(.bss);   . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00010000) , ".bss is too large to fit in RAM memory segment");   __stack_end__ __bss_end__ (NOLOAD) :   {     ____stack_end___start__ = .;     __stack_end__ = 0x40000000 + 64K – 4;   }   ____stack_end___end__ = ____stack_end___start__ + SIZEOF(__stack_end__);   . = ASSERT(____stack_end___end__ >= __RAM_segment_start__ && ____stack_end___end__ <= (__RAM_segment_start__ + 0x00010000) , "__stack_end__ is too large to fit in RAM memory segment");   .startup ____stack_end___end__ :   {     __startup_start__ = .;      *(.startup)   }   __startup_end__ = __startup_start__ + SIZEOF(.startup);   . = ASSERT(__startup_end__ >= __RAM_segment_start__ && __startup_end__ <= (__RAM_segment_start__ + 0x00010000) , ".startup is too large to fit in RAM memory segment");   .prog __startup_end__ :   {     __prog_start__ = .;     *(.text)*(.rodata)*(.rodata*)*(.glue_7)*(.glue_7t)   }   __prog_end__ = __prog_start__ + SIZEOF(.prog);   . = ASSERT(__prog_end__ >= __RAM_segment_start__ && __prog_end__ <= (__RAM_segment_start__ + 0x00010000) , ".prog is too large to fit in RAM memory segment");   .data __prog_end__ :   {     __data_start__ = .;     __data_beg__ = .;         __data_beg_src__ = __prog_end__;*(.data)         __data_end__ = .;   }   __data_end__ = __data_start__ + SIZEOF(.data);   . = ASSERT(__data_end__ >= __RAM_segment_start__ && __data_end__ <= (__RAM_segment_start__ + 0x00010000) , ".data is too large to fit in RAM memory segment");   .bss (__data_end__ + 3) / 4 * 4 :   {     __bss_start__ = .;     __bss_beg__ = .;*(.bss)   }   __bss_end__ = __bss_start__ + SIZEOF(.bss);   . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00010000) , ".bss is too large to fit in RAM memory segment"); } When I go to debug, I get kicked to .data abort. So something is wrong, but I can’t find what. There is no option to convert or import a GCC linker script.

FreeRTOS + Rowley Crossworks

Don’t know about Rowley program, but as there is a warning on every section ".ABC is too large to fit in RAM" it looks like the link failed so a data abort would be expected.

FreeRTOS + Rowley Crossworks

I think the messages are just defined in case when there is a error. The program itself does not give any message, just a perfect build (and I did had error befor, when I was creating the linker script). Just take al look to the configuration itself please.

FreeRTOS + Rowley Crossworks

Is that a standard linker file?  If so I doubt there is anything wrong with it. Are you building for the Olimex board? I may be able to have a look at the build if you could send me a small application that is built with the -g option as follows: + in main.c remove all the lines that create tasks – other than the flash tasks. (remove lines such as vStartIntegerMathTasks()). + also remove the line that starts: sTaskCreate( vErrorChecks + delete the functions vErrorChecks(), prvCheckOtherTasksAreStillRunning(), and vMemCheckTask() [all in main.c]. + in the makefile remove the lines    ../Common/Minimal/integer.c    ../Common/Minimal/PollQ.c    ../Common/Minimal/comtest.c    ../Common/Minimal/flop.c    ../Common/Minimal/semtest.c    ../Common/Minimal/dynamic.c    ../Common/Minimal/BlockQ.c    serial/serialISR.c and    serial/serial.c The build should then create a small application with nothing but the flash tasks. If you then send the entire FreeRTOS directory – including all the object files, makefiles, hex file, etc in a zip file to the address on the FreeRTOS contacts page. Can’t promise anything but I can have a look. Regards.

FreeRTOS + Rowley Crossworks

That costs me alot of time to that, plus it’s not nessesary. Just copy/paste my linker script in a file (lpc2106-ram.ld), and compile it with the freertos standard application for the omilex LPC2106 board. Try if you are able to debug with gdb, if so, then something is wrong with my hardware (what i doubt). Like i said; all the files of freertos in crossworks is standard, accept the linker script. So I had to port it to the "Crossworks" standard, which is a XML file. (see 1st part of my fist post). When I compile freertos in Crossworks (is not a GNU compiler), it creates from the XML file a linker script file, (2nd part of my first post), which does look like as a normal GNU linker script. Regards, Bart

FreeRTOS + Rowley Crossworks

> That costs me alot of time to that Thats up to you.  As it happens I cannot simulate programs built to execute in RAM anyway. >Just copy/paste my linker script in a file >(lpc2106-ram.ld), and compile it with the >freertos standard application for the omilex >LPC2106 board. Try if you are able to debug with >gdb, if so, then something is wrong with my >hardware (what i doubt).  Done that already.  It does not link due to the .bss section being too large.  Is there a separate heap aread allocated?  You could try setting portTOTAL_HEAP_SIZE down.

FreeRTOS + Rowley Crossworks

There is now a demo application that uses Rowley CrossWorks available for download from the WEB site.  See the TCP/IP demo pages.