diff options
Diffstat (limited to 'nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c')
-rw-r--r-- | nuttx/arch/arm/src/sam3u/sam3u_allocateheap.c | 117 |
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 |