FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [November 2008 Threads] Stack on staticPosted by Enrico Dalla Mariga on November 7, 2008 Hi all, I'm using FreeRTOS on a board with external SDRAM and LPC2478. As I have some collision on external bus (as I located HEAP on external RAM), I would like to know if is possible to set STACK of each task on static (and for me) internal RAM If yes, I'm able to avoid access to external RAM on each PUSH/POP improving performance
Note that I placed HEAP on external ram as I need a lot of it, I'm using FLTK for GUI. Thank you Enrico Dalla Mariga
RE: Stack on staticPosted by Richard on November 7, 2008 The stacks are allocated from the FreeRTOS.org heap - normally from heap_1.c or heap_2.c. This is separate from the heap your linker script will probably setup, so if you main heap is in external RAM you should be able to setup the FreeRTOS.org heap to use internal RAM. How this is done will depend on the compiler and linker as each uses its own syntax for placement.
Regards.
RE: Stack on staticPosted by Enrico Dalla Mariga on November 11, 2008 But I used heap model heap_3.c, to be able to allocate dynamic object in secure section (with vTaskSuspendAll and xTaskResumeAll) I created 2 macros, "MALLOC" and "FREE" so that every allocation/free in any sources uses FreeRTOS function avoiding any conflict due to overlapped allocation. In other words, if I use malloc in 2 different task, I have to be sure to make it in critical region as if I will be interrupted during malloc by another task that want to make another malloc, I think (never tried) that it will soon crash!!! It would be useful to allow xTaskCreate to get pointer to static STACK, which can be in HEAP or not What do you think? I need these improvements as I'm working in critical condition (ARM7 LPC2478 with external RAM, LCD 800x480 and FLTK+nanoX+microwindows over FreeRTOS) Thanks in advance
RE: Stack on staticPosted by Enrico Dalla Mariga on November 11, 2008 Here follow a patch to apply FreeRTOS 5.1.0 to have STACK and TCB as static and not dynamic memory. It needs following macros:
#define configUSE_STATIC_STACK 1 #define configUSE_STATIC_TCB 1 #if (configUSE_STATIC_TCB == 1) #define configMAX_TASK_NUMBER 4 #endif
Patch is: --- D:/FreeRTOS_5.1.0/Source/tasks.cFri Oct 24 18:57:34 2008 +++ D:/FreeRTOS/Source/tasks.cTue Nov 11 14:43:36 2008 @@ -146 +146,3 @@ - +#if (configUSE_STATIC_TCB == 1) +static tskTCB tasks[configMAX_TASK_NUMBER]; +#endif @@ -364,0 +367,3 @@ +#if (configUSE_STATIC_STACK == 1) + pxNewTCB->pxStack = (portSTACK_TYPE *)pvParameters; +#endif @@ -396 +401,7 @@ -pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pvTaskCode, pvParameters ); + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pvTaskCode, +#if (configUSE_STATIC_STACK == 1) + 0 +#else + pvParameters +#endif + ); @@ -963 +974,3 @@ - +#if (configUSE_STATIC_STACK == 1) +static portSTACK_TYPE idleStack[tskIDLE_STACK_SIZE]; +#endif @@ -969 +982,7 @@ -xReturn = xTaskCreate( prvIdleTask, ( signed portCHAR * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); + xReturn = xTaskCreate( prvIdleTask, ( signed portCHAR * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) +#if (configUSE_STATIC_STACK == 1) + idleStack +#else + NULL +#endif + , tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); @@ -1784,0 +1804,3 @@ +#if (configUSE_STATIC_TCB == 1) + pxNewTCB = &tasks[uxCurrentNumberOfTasks]; +#else @@ -1787,0 +1810 @@ +#endif @@ -1788,0 +1812 @@ +#if (configUSE_STATIC_STACK == 0) @@ -1807,0 +1832 @@ +#endif
When you create a new task, you have to pass, on pvParameters, pointer to portSTACK_TYPE array of number of elements equal to usStackDepth. For example:
#define MY_STACK_SIZE 100 static portSTACK_TYPE myStack[MY_STACK_SIZE]; ... xTaskCreate(task1, "Task1", MY_STACK_SIZE, myStack, TASK_PRIORITY, NULL);
Make sure that configMAX_TASK_NUMBER is more or equal than xTaskCreate calls.
NOTES: - Tested on ARM7 LPC2000 porting (LPC2478 w/external memory and LCD) - No support for vTaskDelete!!! TCB location are not free'd - No check for array of TCB insufficient
These changes are very useful if you use dynamic allocation (malloc/free) in HEAP located on external memory. After these changes, my application duplicated speed on widgets drawing
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|