Download presentation
Presentation is loading. Please wait.
1
MicroC/OS-II 3. Memory Management ITISN Technical Lab
2
메모리 관리의 필요성 필수는 아니다. 단, 효율적인 메모리 관리가 필요할 경우 사용 메모리 단편화 문제
malloc, free(ANSI C)사용시 불규칙한 크기의 메모리 할당 문제 제한된 메모리 사용의 효율성 악화 고정크기 블록을 이용한 해결 크기가 같으므로 할당시간 동일(시간 예측가능) 사용법 os_cfg.h 파일에서 OS_MEM_EN 1로 설정 OSMemCreate(), OSMemGet(), OSMemPut() 사용 가능 단, OSMemQuery()는 별도 ITISN Technical Lab
3
메모리 컨트롤 블록의 구조 microC/OS-II는 메모리를 파티션단위로 분할하여 관리
각 파티션당 하나의 메모리 컨트롤 블록(MCB)을 가짐 메모리 컨트롤 블록은 파티션 정보를 포함 typedef struct { void * OSMemAddr; void * OSMemFreeList; INT32U OSMemBlkSize; INT32U OSMemBlks; INT32U OSMemNFree; } OS_MEM; // 빈 다음 블록 or 파티션 내의 Free 리스트 // 파티션 생성여부에 따라 다른 용도로 쓰임 // 할당이 시작되는 파티션의 시작번지 // OSMCreate()시 초기화 이후 사용하지 않음 // 파티션 내의 사용 가능한 메모리 블록 개수 // (파티션 생성시 전달인자로 지정가능) // 파티션 내의 메모리 블록 크기 // 파티션 내에 남은 사용 가능한 블록 개수 ITISN Technical Lab
4
메모리 파티션의 구조 파티션의 최대 개수는 os_cfg.h의 MAX_MEM_PART에서 설정
C:\SOFTWARE\uCOS-II\Ports\AVR\ATmega128\GNU\jlu\DK128 파티션의 최대 개수는 os_cfg.h의 MAX_MEM_PART에서 설정 메모리 컨트롤 블록은 OSMemInit()에서 초기화됨 OSInit()이 해당함수를 자동 호출함 OSMemFreeList 파티션1 파티션2 파티션3 시작주소 osMemAddr OSMemFreeList OSMemblkSize OSMemNBlk OSMemFree osMemAddr OSMemFreeList OSMemblkSize OSMemNBlk OSMemFree osMemAddr OSMemFreeList OSMemblkSize OSMemNBlk OSMemFree 메모리 블록 메모리 블록 OS_MAX_PART = 파티션 최대 개수 (OS_CFG.H에 정의) ITISN Technical Lab
5
1. 메모리파티션 생성 함수 OS_MEM * OSMemCreate( void * addr, // 파티션용 메모리 영역의 시작주소 INT32U nblks, // 파티션에서 사용할 메모리 블록 수(2이상) INT32U blksize, // 파티션 내 각 메모리블록 크기(바이트) INT8U * err // 에러코드 ); // 리턴: MCB를 가리키는 포인터, NULL(실패) TYPE OS_MEM OS_MEM * CommMem; INT8U CommBuf[16][128]; Void main(void) { INT8U err; OSInit(); CommMem = OSMemCreate(&CommBuf[0][0], 16, 128, &err); OSStart(); } ITISN Technical Lab
6
2. 메모리블록 할당 함수 void * OSMemGet( OS_MEM * pmem, // 메모리 파티션 EBC 포인터 INT8U * err // 에러코드 ); // 리턴: 메모리 블록을 가리키는 포인터, NULL(실패) OS_MEM * CommMem; Void task(void *pdata) { INT8U * msg; pdata= pdata; for(;;) { msg = OSMemGet(CommMem, &err);//msg 메모리를 가리키는 포 인터 if(msg != (INT8U *) 0) {} // 할당된 메모리 블록 사용 } ITISN Technical Lab
7
3. 메모리블록 반환 함수 INT8U OSMemPut( OS_MEM * pmem, // 메모리 파티션 ECB 포인터 void * pblk // 반환할 메모리 블록 포인터 ); // 리턴값: 에러코드 1. 에러코드 OS_NO_ERR // 정상 처리 OS_MEM_FULL // 메모리 파티션이 가득 찬 경우 OS_MEM_INVALID_PMEM // pmem이 NULL OS_MEM_INVAlID_PBLK // pblk가 NULL OSMemAddr OSMemFreeList = addr … 메모리파티션 ECB pmem 할당된 메모리 블록 ITISN Technical Lab
8
예제) 3. 메모리블록 반환 함수 OS_MEM * CommMem; INT8U * CommMsg; Void Task(void * pdata) { INT8U err; pdata = pdata; for(;;) err= OSMemPut(CommMem, (void*) CommMsg); if(Err==OS_NO_ERR) {} // 메모리 블록 반환 성공 } return; ITISN Technical Lab
9
4. 메모리 파티션의 상태 얻기 INT8U OSMemQuery( OS_MEM * pmem, // 메모리파티션 포인터 OS_MEM_DATA * pdata // 정보를 담아올 구조체 ); //리턴: 에러코드 1. OS_MEM_DATA 구조체 정보 void * OSAddr; // 메모리파티션의 시작 주소 void * OSFreeList; // 자유메모리 블록리스트의 시작 주소 INT32U OSBlkSize; // 각 메모리 블록의 크기(바이트) INT32U OSNBlks; // 파티션에 있는 블록의 총 개수 INT32U OSNFree; // 자유 메모리 블록의 개수 INT32U OSNUsed; // 사용된 메모리 블록의 개수 ITISN Technical Lab
10
예제) 4. 메모리 파티션의 상태 얻기 OS_MEM * CommMem; Void Task(void * pdata) { INT8U err; OS_MEM_DATA mem_data; pdata= pdata; for(;;) err= OSMemQuery(CommMem, &mem_data); } return; ITISN Technical Lab
11
실습 예제 1. 256크기의 메모리 블록을 생성하고 0~255까지 저장시킨다. 이 값을 LED에 2진수로 표시하는 프로그램을 작성하시오. ITISN Technical Lab
Similar presentations