Implement xPortGetFreeHeapSize when using libc memory management

This commit is contained in:
Angus Gratton 2015-06-16 12:10:10 +10:00
parent 49268a33e1
commit f0b5bc324c

View file

@ -69,8 +69,10 @@
* which is in turn based on the ARM CM3 port. * which is in turn based on the ARM CM3 port.
*----------------------------------------------------------*/ *----------------------------------------------------------*/
/* Scheduler includes. */
#include <xtensa/config/core.h> #include <xtensa/config/core.h>
#include <malloc.h>
#include <unistd.h>
#include <stdio.h>
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
@ -79,6 +81,14 @@
unsigned cpu_sr; unsigned cpu_sr;
char level1_int_disabled; char level1_int_disabled;
/* Supervisor stack pointer entry. This is the "high water mark" of how far the
supervisor stack grew down before task started.
After tasks start, task stacks are all allocated from the heap and
FreeRTOS checks for stack overflow.
*/
static uint32_t xPortSupervisorStackPointer;
/* /*
* Stack initialization * Stack initialization
*/ */
@ -181,12 +191,37 @@ portBASE_TYPE xPortStartScheduler( void )
vTaskSwitchContext(); vTaskSwitchContext();
/* mark the supervisor stack pointer high water mark. xt_int_exit
actually frees ~0x50 bytes off the stack, so this value is
conservative.
*/
__asm__ __volatile__ ("mov %0, a1\n" : "=a"(xPortSupervisorStackPointer));
sdk__xt_int_exit(); sdk__xt_int_exit();
/* Should not get here as the tasks are now running! */ /* Should not get here as the tasks are now running! */
return pdTRUE; return pdTRUE;
} }
/* Determine free heap size via libc sbrk function & mallinfo
sbrk gives total size in totally unallocated memory,
mallinfo.fordblks gives free space inside area dedicated to heap.
mallinfo is possibly non-portable, although glibc & newlib both support
the fordblks member.
*/
size_t xPortGetFreeHeapSize( void )
{
struct mallinfo mi = mallinfo();
uint32_t brk_val = (uint32_t) sbrk(0);
uint32_t sp = xPortSupervisorStackPointer;
if(sp == 0) /* scheduler not started */
__asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp));
return sp - brk_val + mi.fordblks;
}
void vPortEndScheduler( void ) void vPortEndScheduler( void )
{ {
/* No-op, nothing to return to */ /* No-op, nothing to return to */