|
@@ -1042,6 +1042,64 @@ void rt_kprintf(const char *fmt, ...)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef RT_USING_HEAP
|
|
|
+/**
|
|
|
+ * This function allocates a memory block, which address is aligned to the
|
|
|
+ * specified alignment size.
|
|
|
+ *
|
|
|
+ * @param size the allocated memory block size
|
|
|
+ * @param align the alignment size
|
|
|
+ *
|
|
|
+ * @return the allocated memory block on successful, otherwise returns RT_NULL
|
|
|
+ */
|
|
|
+void* rt_malloc_align(rt_size_t size, rt_size_t align)
|
|
|
+{
|
|
|
+ void *align_ptr;
|
|
|
+ void *ptr;
|
|
|
+ rt_size_t align_size;
|
|
|
+
|
|
|
+ /* align the alignment size to 4 byte */
|
|
|
+ align = ((align + 0x03) & ~0x03);
|
|
|
+
|
|
|
+ /* get total aligned size */
|
|
|
+ align_size = ((size + 0x03) & ~0x03) + align;
|
|
|
+ /* allocate memory block from heap */
|
|
|
+ ptr = rt_malloc(align_size);
|
|
|
+ if (ptr != RT_NULL)
|
|
|
+ {
|
|
|
+ if (((rt_uint32_t)ptr & (align - 1)) == 0) /* the allocated memory block is aligned */
|
|
|
+ {
|
|
|
+ align_ptr = (void*) ((rt_uint32_t)ptr + align);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ align_ptr = (void*) (((rt_uint32_t)ptr + (align - 1)) & ~(align - 1));
|
|
|
+ }
|
|
|
+
|
|
|
+ /* set the pointer before alignment pointer to the real pointer */
|
|
|
+ *((rt_uint32_t*)((rt_uint32_t)align_ptr - sizeof(void*))) = (rt_uint32_t)ptr;
|
|
|
+
|
|
|
+ ptr = align_ptr;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ptr;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This function release the memory block, which is allocated by rt_malloc_align
|
|
|
+ * function and address is aligned.
|
|
|
+ *
|
|
|
+ * @param ptr the memory block pointer
|
|
|
+ */
|
|
|
+void rt_free_align(void* ptr)
|
|
|
+{
|
|
|
+ void* real_ptr;
|
|
|
+
|
|
|
+ real_ptr = (void*)*(rt_uint32_t*)((rt_uint32_t)ptr - sizeof(void*));
|
|
|
+ rt_free(real_ptr);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#if !defined (RT_USING_NEWLIB) && defined (RT_USING_MINILIBC) && defined (__GNUC__)
|
|
|
#include <sys/types.h>
|
|
|
void *memcpy(void *dest, const void *src, size_t n) __attribute__((weak, alias("rt_memcpy")));
|