Implement xPortGetFreeHeapSize when using libc memory management
This commit is contained in:
parent
49268a33e1
commit
f0b5bc324c
1 changed files with 36 additions and 1 deletions
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue