43 #include "sysconfig.h" 54 #define tprintf printf 55 #define eprintf printf 58 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 59 #ifndef GSC_MEMORY_HEAP_SIZE
60 #define GSC_MEMORY_HEAP_SIZE 0x8000 63 typedef union memhdr {
72 unsigned char gs_heap_mem[GSC_MEMORY_HEAP_SIZE] __attribute__ ((aligned(256)));
73 void *MEM_END = &gs_heap_mem[GSC_MEMORY_HEAP_SIZE];
75 #define GHALIGN (sizeof(memhdr)*4) 76 unsigned char gs_heap_mem[(GSC_MEMORY_HEAP_SIZE/GHALIGN)*GHALIGN] __attribute__ ((aligned(GHALIGN)));
77 void *MEM_END = &gs_heap_mem[(GSC_MEMORY_HEAP_SIZE/GHALIGN)*GHALIGN];
79 void *MEM_START = gs_heap_mem;
83 #else // GSC_MEMORY_HEAP_IS_NEWLIB 85 #ifdef GSC_TARGET_SYSTEM_EMU 87 unsigned int system_heap_total_size(
void) {
return 0; }
90 extern unsigned int system_heap_total_size(
void);
92 #endif // GSC_MEMORY_HEAP_IS_NEWLIB 99 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 100 base = (memhdr *)(((
unsigned long)MEM_START -
101 sizeof(memhdr)-1) & ~(
sizeof(memhdr)-1));
102 base->s.next = base + 1;
104 freep = base->s.next;
105 freep->s.next = base;
106 freep->s.size = ((
char*)MEM_END - (
char*)freep) /
sizeof(memhdr);
108 tkprintf(
"GS Memory Alloc API is newlib API\n");
117 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 118 DKPRINTF(0x02,
"### memhdr = %d\n",
sizeof(memhdr));
119 DKPRINTF(0x02,
"### base = 0x%p\n", base);
120 DKPRINTF(0x02,
"### freep = 0x%p\n", freep);
122 tkprintf(
"Heap area : 0x%p - 0x%p\n",
126 unsigned long ms = system_heap_total_size();
127 tkprintf(
"%ld K byte free\n", ms/1024);
140 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 141 memhdr *p, *prevp = freep;
144 DKPRINTF(0x02,
"### alloc size = %08lX(%ld)\n", size, size);
145 DKPRINTF(0x02,
"### freep = %p\n", freep);
146 DKPRINTF(0x02,
"### freep->s.next = %p\n", freep->s.next);
148 nunits = (size +
sizeof(memhdr)-1)/
sizeof(memhdr) + 1;
149 DKPRINTF(0x02,
"### nunits = %08lX(%ld)\n", nunits, nunits);
150 for(p = prevp->s.next; ; prevp = p, p = p->s.next) {
151 DKPRINTF(0x02,
"### p = %p\n", p);
152 DKPRINTF(0x02,
"### prevp = %p\n", prevp);
153 DKPRINTF(0x02,
"### p->s.size = %08lX(%ld)\n", p->s.size, p->s.size);
154 if(p->s.size >= nunits) {
158 SYSERR_PRINT(
"Memory empty(size=%ld)\n", size);
162 if(p->s.size == nunits) {
163 prevp->s.next = p->s.next;
165 DKPRINTF(0x02,
"### newmem(%ld)\n", nunits);
166 DKPRINTF(0x02,
"### p->s.size = %08lX(%ld)\n", p->s.size, p->s.size);
168 DKPRINTF(0x02,
"### p->s.size = %08lX(%ld)\n", p->s.size, p->s.size);
169 DKPRINTF(0x02,
"### p = %p\n", p);
171 DKPRINTF(0x02,
"### p = %p\n", p);
172 DKPRINTF(0x02,
"### p->s.size = %08lX(%ld)\n", p->s.size, p->s.size);
174 DKPRINTF(0x02,
"### p->s.size = %08lX(%ld)\n", p->s.size, p->s.size);
175 DKPRINTF(0x02,
"### prevp = %p\n", prevp);
178 DKPRINTF(0x02,
"### freep = %p\n", freep);
180 DKPRINTF(0x02,
"### address = %p\n", (p + 1));
182 DKPRINTF(0x01,
"alloc ptr=%p size=%ld\n", (p + 1), size);
184 return (
void *)(p+1);
197 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 200 DKPRINTF(0x01,
"free ptr=%p\n", ptr);
203 DKPRINTF(0x02,
"### free ptr = %p\n", ptr);
204 DKPRINTF(0x02,
"### freep = %p\n", freep);
205 DKPRINTF(0x02,
"### freep->s.next = %08lX\n", (
unsigned long)freep->s.next);
208 bp = (memhdr *)ptr -1;
209 for(p = freep; !(bp > p && bp < p->s.next); p = p->s.next) {
210 if(p >= p->s.next && (bp > p || bp < p->s.next)) {
215 if(bp + bp->s.size == p->s.next) {
216 bp->s.size += p->s.next->s.size;
217 bp->s.next = p->s.next->s.next;
219 bp->s.next = p->s.next;
222 if(p + p->s.size == bp) {
223 p->s.size += bp->s.size;
224 p->s.next = bp->s.next;
243 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 244 return (((memhdr *)ptr -1)->s.size -1) *
sizeof(memhdr);
257 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 259 unsigned long size = 0;
261 for(p= freep->s.next; ; p = p->s.next) {
263 if(p == freep)
break;;
265 return size *
sizeof(memhdr);
278 #ifndef GSC_MEMORY_HEAP_IS_NEWLIB 279 return (
unsigned long)(MEM_END - MEM_START);
281 return system_heap_total_size();
291 #include <sys/reent.h> 293 void * _sbrk_r(
struct _reent *r,
int incr)
299 void * _sbrk(ptrdiff_t incr)
304 #endif // TARGET_SYSTEM_EMU 311 #define MEMSIZE 0x10000 312 static unsigned char mem[MEMSIZE];
314 void * memalloc(
unsigned long size)
317 printf(
"MALLOC(%ld)\n", size);
322 printf(
"pointer : %08X\n", mp - MEM_START);
329 void memfree(
void *ptr)
331 printf(
"FREE(%08x)\n", ptr - MEM_START);
338 memhdr *p, *prevp = freep;
339 for(p= prevp->s.next; ; prevp = p, p = p->s.next) {
340 if(p == freep)
return;
341 tprintf(
"alloced : %08lx (%ld)\n", (
unsigned long)p+1,
342 (
unsigned long)p->s.size*
sizeof(memhdr));
346 int main(
int argc,
char *argv[])
351 for(i=0; i< MEMSIZE; i++) {
356 MEM_END = &mem[MEMSIZE];
362 printf(
"base = %08lx\n", (
unsigned long)base);
363 printf(
"freep = %08lx\n", (
unsigned long)freep);
365 mp[0] = memalloc(100);
366 mp[1] = memalloc(100);
369 mp[2] = memalloc(100);
370 mp[3] = memalloc(1000);
371 mp[4] = memalloc(10000);
373 mp[5] = memalloc(10000);
380 mp[6] = memalloc(20000);
381 mp[7] = memalloc(30000);
383 mp[8] = memalloc(15280);
385 mp[9] = memalloc(100);
unsigned int system_heap_size(void)
< $gsc ヒープメモリ管理をnewlibで行う
void init_memory(void)
メモリ管理の初期化
unsigned long heap_total_size(void)
全てのメモリのバイト数を取得する
void free_memory(void *ptr)
確保したメモリを開放する
void display_memory_info(void)
メモリ状態表示
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
unsigned long memory_size(void *ptr)
確保したメモリのバイト数を取得する
void * alloc_memory(unsigned int size)
メモリを確保する
int tprintf(const char *fmt,...)
簡易printf
unsigned long heap_free_size(void)
未確保のメモリの合計バイト数を取得する