2013-07-24 40 views
10

Tôi hiện đang phát triển trên Sega Saturn.thư viện malloc đơn giản và di động

Bàn điều khiển có một số chip chuyên dụng; một số trong số đó có RAM riêng và/hoặc VRAM. Một ví dụ sẽ là làm thế nào RAM chính được chia thành hai khu vực 1MB khác nhau.

Tôi đang tìm thư viện chung, di động và nhỏ malloc cho phép tôi khai báo các vùng RAM khác nhau và sau đó cho phép tôi malloc hoặc free trong các khu vực đó.

Ví dụ sẽ là chip đồ họa vdp2. Nó có vùng VRAM chuyên dụng cho bảng màu của chế độ màn hình 8b.

Ở đây, tôi có thể sử dụng phương pháp cổ điển và bảng màu tải trước hoạt động cho tất cả đồ họa trò chơi, nhưng tại sao không chỉ tải bảng màu thực sự đang sử dụng đồ họa hiện tại của tôi?

Ở đây tôi cần một hệ thống để phân bổ và miễn phí màu (mục nhập bảng), nhưng tôi muốn nó thất bại nếu người dùng cố gắng phân bổ hơn 255 màu - vì đây là kích thước bảng tối đa.

Về cơ bản, tôi muốn để có thể khai báo một vài động khu bộ nhớ và alloc/miễn phí vào chúng:

u32 palRam = defineMallocZone(COLOR_PALETTE,COLOR_PALETTE_SIZE); 
u32 m68kRam = defineMallocZone(M68KVRAM,M68KVRAMSIZE); 
u32 highRam = defineMallocZone(HIGHRAM,1024*1024); 

u16* my64colors = (u16*)magicMalloc(palRam,64*sizeof(u16)); 

Các chính malloc của công cụ chuỗi đi kèm với Saturn đã không làm việc ra khỏi hộp, vì vậy tôi đã nhanh chóng viết bài này:

#define mallocSizeK 512 
#define mallocSizeB mallocSizeK*1024 

void * mymalloc(u32 n) 
{ static u8 m[mallocSizeB]; 
    static u32 c=0; 
    if(!n) return (void*)&c; 
    while(n%4) n++; 
    u32 nn = c+n; 
    if(nn > mallocSizeB) return 0; 
    u8 * p = &m[c]; c = nn; memset(p,0,n); 
    return (void*)p; 
} 

Đó là ok cho các thử nghiệm hiện tại của tôi, nhưng sẽ không ổn trong thời gian dài (Nó thực sự cần miễn phí! Nhưng đây không phải là điều tôi muốn tổng thể =))

Để tóm tắt, tôi cần một đoạn mã đơn giản, cơ bản và đơn giản để xử lý các vùng bộ nhớ như được nêu ở trên. Bây giờ, thuật toán quản lý bộ nhớ không cần hiệu quả, tôi chỉ muốn nó hoạt động. Hoặc có thể bạn gửi cho tôi một liên kết đến một thuật toán quản lý bộ nhớ cổ điển và đơn giản mà tôi có thể tự mình thực hiện?

chỉnh sửa> ok tôi thực hiện nó bản thân mình, here is a gist

không phải là rất phát triển nhưng hoạt động tốt với thử nghiệm này:

u32* b1 = bnew(M68KVRAM,512); 
void*mtest[500]; u32 allocSize = 8; 
u32 n = 0, nb=0, total=0; 

while(n<500){ 
    u32 sz = rand()%(allocSize*1024); 
    void *a = bmalloc(b1,sz); 
    if(!a) break; 
    memset(a,1,sz); 
    mtest[n++] = a; 
    total += sz; 
}; 

nb = n; printlr("allocated %u/512 kb in %u 0~%uk blocs",total>>10,nb,allocSize); 

printl("free them all .. "); 
u32 freertn = 0; for(n=0;n<nb;n++) freertn |= (u32)bfree(b1,mtest[n]); 
if(freertn) printlr("fail"); else printlr("ok"); 

*mtest = bmalloc(b1,512*1024); 
if(*mtest) memset(*mtest,200,512*1024); 
printlr("final 512k allocation return : 0x%x",*mtest); 
+0

Thật khó để nói những gì bạn đang yêu cầu. Bạn đang tìm kiếm thư viện malloc? ví dụ malloc? một tự do để đi cùng với malloc của bạn? Vui lòng chỉnh sửa và bao gồm một câu hỏi ngắn gọn. – jwiscarson

Trả lời

2

Về cơ bản, bạn cần hai thói quen quản lý bộ nhớ: Một mà các cửa hàng làm việc nội bộ của mình trong một phần của RAM trong khi quản lý một RAM khác (trong trường hợp này là VRAM) và một phần khác có thể là bất kỳ thường trình malloc nào. Đối với VRAM, bạn có cần nó để xử lý cả bảng màu 16 và 256 hay chỉ 256? Nếu một kích thước duy nhất, sau đó một thuật toán loại "Unit Allocator" sẽ phù hợp với bạn tốt.

Đối với RAM chính của bạn, thuật toán kiểu danh sách được liên kết có thể sẽ là đủ. An implementation được thực hiện ở đây, nhưng chỉ với một chút công việc chân, bạn có thể tìm thấy MANY, MANY triển khai trên internet.

Tôi chưa xem bản thân Saturn trong 16 năm, vì vậy đây là một điều thú vị để đọc và chỉnh sửa cho bạn :)

+0

có, bảng màu không phải là một ví dụ tuyệt vời vì nó phải hỗ trợ chia sẻ màu sắc giữa các sprites và nhận được bộ nhớ kích thước cố định, vì vậy một mã chuyên dụng sẽ được yêu cầu, nhưng tôi muốn có khả năng chỉ cung cấp 64 hoặc 96 màu cho hệ thống này mà không cần tính lại ram của mình bù đắp và chỉ để cho nó được năng động. Tôi muốn hỗ trợ tất cả các loại chế độ bảng màu mà saturn nhận được, mỗi nền vdp2 có thể có chế độ màu, độ phân giải và bảng màu riêng, nhưng đó chỉ là trường hợp sử dụng có thể, tại sao tôi yêu cầu một hệ thống chung. Các triển khai bạn đã liên kết rất đơn giản, tôi +1 cho nó và thử thực hiện miễn phí của riêng tôi :) thx để chỉnh sửa, nhưng tôi không phải là tiếng anh ^^ – r043v

+0

Bạn có quan điểm của mình chỉ là tốt :) Tôi chỉ làm sạch nó một chút cho người khác , những người không điều khiển để hiểu rõ hơn một chút. –