Donate Share

FreeRTOS Real Time Kernel

The forum address has changed, you have been automatically redirected. Please update any bookmarks to use the new URL.

Subscribe

Stack problem?

You are viewing a single message from this topic. View all messages.

  1. 2009-03-24 10:49:18 UTC
    Hallo

    I may have some stack/heap problem!?? But im not sure.

    Im using the latest FreeRTOS on my LPC2478. I have 5 tasks and they are working fine.

    But know I whant to add some graphics task to my project. So I create a new task, which draw some graphics in my framebuffer in a given interval. But when the task runs, then I get an Abort exception. If I check the excpetion cause and extract the assembly where it happens, then its in the context switch rutine.

    What I can see in the debugger before the exception(Keil uVision), a structure passed to a graphics function is suddenly out of scope... So when the function returns I get the data abort exception.

    My guess is that maybee my stack is to small? The graphics function uses many bytes of RAM. Could that be a the cause?
    If I call the graphics function from the main, before the scheduler is started, then there is no problem, but when called from the task I get an exception.

    Does tasks run in supervisor mode? or user mode?

    This is my stack and heap setup:

    UND_Stack_Size EQU 0x00000008
    SVC_Stack_Size EQU 0x00000400
    ABT_Stack_Size EQU 0x00000008
    FIQ_Stack_Size EQU 0x00000008
    IRQ_Stack_Size EQU 0x00000400
    USR_Stack_Size EQU 0x00000008

    ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
    FIQ_Stack_Size + IRQ_Stack_Size)

    AREA STACK, NOINIT, READWRITE, ALIGN=3

    Stack_Mem SPACE USR_Stack_Size
    __initial_sp SPACE ISR_Stack_Size

    Stack_Top

    ;// <h> Heap Configuration
    ;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF>
    ;// </h>

    Heap_Size EQU 0x00000000

    AREA HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem SPACE Heap_Size
    __heap_limit


    If I look in my Startup.s file, I do not set the user mode stack pointer? Schouldnet I do that?

    ; Setup Stack for each mode ----------------------------------------------------

    LDR R0, =Stack_Top

    ; Enter Undefined Instruction Mode and set its Stack Pointer
    MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
    MOV SP, R0
    SUB R0, R0, #UND_Stack_Size

    ; Enter Abort Mode and set its Stack Pointer
    MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
    MOV SP, R0
    SUB R0, R0, #ABT_Stack_Size

    ; Enter FIQ Mode and set its Stack Pointer
    MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
    MOV SP, R0
    SUB R0, R0, #FIQ_Stack_Size

    ; Enter IRQ Mode and set its Stack Pointer
    MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
    MOV SP, R0
    SUB R0, R0, #IRQ_Stack_Size

    ; Enter Supervisor Mode and set its Stack Pointer
    MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
    MOV SP, R0
    SUB R0, R0, #SVC_Stack_Size

    EXPORT __initial_sp
    ; Enter User Mode and set its Stack Pointer
    ; MSR CPSR_c, #Mode_USR
    ; IF :DEF:__MICROLIB

    ; EXPORT __initial_sp

    ; ELSE

    ; MOV SP, R0
    ; SUB SL, SP, #USR_Stack_Size

    ; ENDIF

    ; Enter the C code -------------------------------------------------------------

    IMPORT __main
    LDR R0, =__main
    BX R0


    IF :DEF:__MICROLIB

    EXPORT __heap_base
    EXPORT __heap_limit

    ELSE
    ; User Initial Stack & Heap
    AREA |.text|, CODE, READONLY

    IMPORT __use_two_region_memory
    EXPORT __user_initial_stackheap
    __user_initial_stackheap

    LDR R0, = Heap_Mem
    LDR R1, =(Stack_Mem + USR_Stack_Size)
    LDR R2, = (Heap_Mem + Heap_Size)
    LDR R3, = Stack_Mem
    BX LR
    ENDIF


    END


    /Thomas





< Previous | 1 | Next >

Add a Reply

This forum does not allow anonymous participation.

Log in to add a reply. Not registered? Create an account to participate and receive email updates when replies are posted to this topic.