summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c')
-rw-r--r--nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c117
1 files changed, 38 insertions, 79 deletions
diff --git a/nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c b/nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c
index 5b5c6b810..249777d69 100644
--- a/nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c
+++ b/nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c
@@ -78,68 +78,6 @@
# warning "CONFIG_DRAM_END is before end of SRAM0... not all of SRAM0 used"
#endif
-#ifdef CONFIG_MM_KERNEL_HEAPSIZE
-# if CONFIG_MM_KERNEL_HEAPSIZE < (1 << 5) /* Kernel heap size < 2**5 */
-# define KHEAP_SIZE (1 << 4) /* Use size 2**4 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 6) /* Kernel heap size < 2**6 */
-# define KHEAP_SIZE (1 << 5) /* Use size 2**5 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 7) /* Kernel heap size < 2**7 */
-# define KHEAP_SIZE (1 << 6) /* Use size 2**6 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 8) /* Kernel heap size < 2**8 */
-# define KHEAP_SIZE (1 << 7) /* Use size 2**7 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 9) /* Kernel heap size < 2**9 */
-# define KHEAP_SIZE (1 << 8) /* Use size 2**8 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 10) /* Kernel heap size < 2**10 */
-# define KHEAP_SIZE (1 << 9) /* Use size 2**9 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 11) /* Kernel heap size < 2**11 */
-# define KHEAP_SIZE (1 << 10) /* Use size 2**10 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 12) /* Kernel heap size < 2**12 */
-# define KHEAP_SIZE (1 << 11) /* Use size 2**11 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 13) /* Kernel heap size < 2**13 */
-# define KHEAP_SIZE (1 << 12) /* Use size 2**12 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 14) /* Kernel heap size < 2**14 */
-# define KHEAP_SIZE (1 << 13) /* Use size 2**13 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 15) /* Kernel heap size < 2**15 */
-# define KHEAP_SIZE (1 << 14) /* Use size 2**14 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 16) /* Kernel heap size < 2**16 */
-# define KHEAP_SIZE (1 << 15) /* Use size 2**15 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 17) /* Kernel heap size < 2**17 */
-# define KHEAP_SIZE (1 << 16) /* Use size 2**16 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 18) /* Kernel heap size < 2**18 */
-# define KHEAP_SIZE (1 << 17) /* Use size 2**17 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 19) /* Kernel heap size < 2**19 */
-# define KHEAP_SIZE (1 << 18) /* Use size 2**18 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 20) /* Kernel heap size < 2**20 */
-# define KHEAP_SIZE (1 << 19) /* Use size 2**19 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 21) /* Kernel heap size < 2**21 */
-# define KHEAP_SIZE (1 << 20) /* Use size 2**20 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 22) /* Kernel heap size < 2**22 */
-# define KHEAP_SIZE (1 << 21) /* Use size 2**21 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 23) /* Kernel heap size < 2**23 */
-# define KHEAP_SIZE (1 << 22) /* Use size 2**22 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 24) /* Kernel heap size < 2**24 */
-# define KHEAP_SIZE (1 << 23) /* Use size 2**23 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 25) /* Kernel heap size < 2**25 */
-# define KHEAP_SIZE (1 << 24) /* Use size 2**24 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 26) /* Kernel heap size < 2**26 */
-# define KHEAP_SIZE (1 << 25) /* Use size 2**25 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 27) /* Kernel heap size < 2**27 */
-# define KHEAP_SIZE (1 << 26) /* Use size 2**26 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 28) /* Kernel heap size < 2**28 */
-# define KHEAP_SIZE (1 << 27) /* Use size 2**27 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 29) /* Kernel heap size < 2**29 */
-# define KHEAP_SIZE (1 << 28) /* Use size 2**28 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 30) /* Kernel heap size < 2**30 */
-# define KHEAP_SIZE (1 << 29) /* Use size 2**29 */
-# elif CONFIG_MM_KERNEL_HEAPSIZE < (1 << 31) /* Kernel heap size < 2**31 */
-# define KHEAP_SIZE (1 << 30) /* Use size 2**30 */
-# else
-# define KHEAP_SIZE (1 << 31) /* Use size 2**31 */
-# endif
-
-# define KHEAP_MASK (KHEAP_SIZE - 1)
-#endif
-
/****************************************************************************
* Private Data
****************************************************************************/
@@ -170,35 +108,41 @@
void up_allocate_heap(FAR void **heap_start, size_t *heap_size)
{
#if defined(CONFIG_NUTTX_KERNEL) && defined(CONFIG_MM_KERNEL_HEAP)
- uintptr_t kbase = ((uintptr_t)g_heapbase + KHEAP_MASK) & ~KHEAP_MASK;
- uintptr_t ubase = kbase + KHEAP_SIZE;
+ /* Get the unaligned size of the user-space heap */
+
+ uintptr_t ubase = (uintptr_t)g_heapbase + CONFIG_MM_KERNEL_HEAPSIZE;
size_t usize = CONFIG_DRAM_END - ubase;
+ int log2;
DEBUGASSERT(ubase < (uintptr_t)CONFIG_DRAM_END);
- /* Return the heap settings */
+ /* Adjust that size to account for MPU alignment requirements.
+ * NOTE that there is an implicit assumption that the CONFIG_DRAM_END
+ * is aligned to the MPU requirement.
+ */
+
+ log2 = (int)mpu_log2regionsize(usize);
+ DEBUGASSERT((CONFIG_DRAM_END & ((1 << log2) - 1)) == 0);
+
+ usize = (1 << log2);
+ ubase = CONFIG_DRAM_END - usize
+
+ /* Return the user-space heap settings */
up_ledon(LED_HEAPALLOCATE);
*heap_start = (FAR void*)ubase;
*heap_size = usize;
- /* Allow access to the heap memory */
+ /* Allow user-mode access to the user heap memory */
sam3u_mpu_uheap((uintptr_t)ubase, usize);
#else
- size_t size = CONFIG_DRAM_END - g_heapbase;
-
/* Return the heap settings */
up_ledon(LED_HEAPALLOCATE);
*heap_start = (FAR void*)g_heapbase;
- *heap_size = size;
-
- /* Allow user access to the user heap memory */
-
- sam3u_mpu_uheap((uintptr_t)g_heapbase, size);
-
+ *heap_size = CONFIG_DRAM_END - g_heapbase;
#endif
}
@@ -215,14 +159,29 @@ void up_allocate_heap(FAR void **heap_start, size_t *heap_size)
#if defined(CONFIG_NUTTX_KERNEL) && defined(CONFIG_MM_KERNEL_HEAP)
void up_allocate_kheap(FAR void **heap_start, size_t *heap_size)
{
- uintptr_t kbase = ((uintptr_t)g_heapbase + KHEAP_MASK) & ~KHEAP_MASK;
+ /* Get the unaligned size of the user-space heap */
- DEBUGASSERT((kbase + KHEAP_SIZE) < (uintptr_t)CONFIG_DRAM_END);
+ uintptr_t ubase = (uintptr_t)g_heapbase + CONFIG_MM_KERNEL_HEAPSIZE;
+ size_t usize = CONFIG_DRAM_END - ubase;
+ int log2;
- /* Return the heap settings */
+ DEBUGASSERT(ubase < (uintptr_t)CONFIG_DRAM_END);
+
+ /* Adjust that size to account for MPU alignment requirements.
+ * NOTE that there is an implicit assumption that the CONFIG_DRAM_END
+ * is aligned to the MPU requirement.
+ */
- *heap_start = (FAR void*)kbase;
- *heap_size = KHEAP_SIZE;
+ log2 = (int)mpu_log2regionsize(usize);
+ DEBUGASSERT((CONFIG_DRAM_END & ((1 << log2) - 1)) == 0);
+
+ usize = (1 << log2);
+ ubase = CONFIG_DRAM_END - usize
+
+ /* Return the kernel heap settings */
+
+ *heap_start = (FAR void*)g_heapbase;
+ *heap_size = ubase - (uintptr_t)g_heapbase;
}
#endif