L14-Click 1.0
STM32WLE5CC LoRaWAN Sensor Platform
Loading...
Searching...
No Matches
sysmem.c
Go to the documentation of this file.
1/**
2 ******************************************************************************
3 * @file sysmem.c
4 * @author Generated by STM32CubeIDE
5 * @brief STM32CubeIDE System Memory calls file
6 *
7 * For more information about which C functions
8 * need which of these lowlevel functions
9 * please consult the newlib libc manual
10 ******************************************************************************
11 * @attention
12 *
13 * Copyright (c) 2025 STMicroelectronics.
14 * All rights reserved.
15 *
16 * This software is licensed under terms that can be found in the LICENSE file
17 * in the root directory of this software component.
18 * If no LICENSE file comes with this software, it is provided AS-IS.
19 *
20 ******************************************************************************
21 */
22
23/* Includes */
24#include <errno.h>
25#include <stdint.h>
26
27/**
28 * Pointer to the current high watermark of the heap usage
29 */
30static uint8_t *__sbrk_heap_end = NULL;
31
32/**
33 * @brief _sbrk() allocates memory to the newlib heap and is used by malloc
34 * and others from the C library
35 *
36 * @verbatim
37 * ############################################################################
38 * # .data # .bss # newlib heap # MSP stack #
39 * # # # # Reserved by _Min_Stack_Size #
40 * ############################################################################
41 * ^-- RAM start ^-- _end _estack, RAM end --^
42 * @endverbatim
43 *
44 * This implementation starts allocating at the '_end' linker symbol
45 * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack
46 * The implementation considers '_estack' linker symbol to be RAM end
47 * NOTE: If the MSP stack, at any point during execution, grows larger than the
48 * reserved size, please increase the '_Min_Stack_Size'.
49 *
50 * @param incr Memory size
51 * @return Pointer to allocated memory
52 */
53void *_sbrk(ptrdiff_t incr)
54{
55 extern uint8_t _end; /* Symbol defined in the linker script */
56 extern uint8_t _estack; /* Symbol defined in the linker script */
57 extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
58 const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
59 const uint8_t *max_heap = (uint8_t *)stack_limit;
60 uint8_t *prev_heap_end;
61
62 /* Initialize heap end at first call */
63 if (NULL == __sbrk_heap_end)
64 {
65 __sbrk_heap_end = &_end;
66 }
67
68 /* Protect heap from growing into the reserved MSP stack */
69 if (__sbrk_heap_end + incr > max_heap)
70 {
71 errno = ENOMEM;
72 return (void *)-1;
73 }
74
75 prev_heap_end = __sbrk_heap_end;
76 __sbrk_heap_end += incr;
77
78 return (void *)prev_heap_end;
79}
static uint8_t * __sbrk_heap_end
Definition sysmem.c:30
void * _sbrk(ptrdiff_t incr)
_sbrk() allocates memory to the newlib heap and is used by malloc and others from the C library
Definition sysmem.c:53