[t:/]$ 지식_

Nucleus 메모리 할당과 IPC 메모

2005/04/23

누클리어스에서 제공하는 드라이버는 보면 누클리어스에서 제공한 모종의 템플릿에 맞춰서 설계한 놈과 그렇지 않고 걍 만든거 - 우리의 경우.

먼저 어느쪽인지 확인 후에 말한것처럼 태스크간 통신을 일일이 다 처리해줘야 합니다.

아니에용. 소스 함 열어보면 malloc calloc alloca 등이 있어요. 아까 야그한 NU_Create_Memory_Pool의 경우 일단 이 풀을 만들고 거기서 NU_Allocate_Memory를 사용해서 메모리를 ?어다 쓰는데, malloc 등을 쓰면 걍 힙에서 가져오니 그런 절차가 필요없죠 그래서 필요없다는 의미입니다만, 주의할 점이 누클리어스 파일 시스템을 쓴다면, 이 파일 시스템도 메모리를 필요로 하는데, 그게 글로벌도 설정된 NU_MEMORY_POOL System_Memory; 여기를 참조로 해서 가져옵니다.

반드시

status = NU_Create_Memory_Pool(&System_Memory, "SYSMEM", 
  (char *)first_available_memory, 200000, 50, NU_FIFO);
if (status != NU_SUCCESS)
  ERC_System_Error(status);

이 코드가 void Application_Initialize(void * first_available_memory)에 반드시 들어가야 하죠. 아 그럼 걍 풀잡는거랑 메모리 할당받는것은 모두 malloc으로 대체 하세요. 대신 힙 크게 잡구요.

NU_Create_Memory_Pool의 첫째 파리미터가 할당된 풀의 어드레스고 NU_Allocate_Memory의 첫째 파라미터가 메모리를 가져올 풀의 어드레습니다. 글고 아까 파이프나 기타 등등 통칭해서 IPC(인터 프로세스 커뮤니케이션) 라 합니다. 파이프나, 레터박스등은 글로벌로 하시고 어려운게 이벤트를 만들어줘야 되는데 이벤트는 또한 세마포어의 내부 구현에서도 필히 사용됩니다. 그래서 일단, 드라이버가 세마포어를 쓰는지 이벤트를 쓰는지 확인하시고 세마포어를 쓴다면 세마포어 대신 글로벌 변수로 레퍼런스 카운터를 하나 만들고 그 카운터를 참조해서 진입 여부를 결정짓게 하시고 아니면 원칙적으로는 거기서 블록킹 상태가 되어야 되는데 이를 걍 while로 처리해서 기다리게 만듭니다.

이렇게 하면 이번트를 사용하지 않아도 되나, 퍼포먼스가 많이 떨어지죠. 이벤트의 경우도 인터럽트나 혹은 글로벌 변수 등을 이용해서 처리하는 수 밖에 없을겁니다. IPC를 사용하지 않는다면 일은 훨 수월해질겁니다.

사실 요 놈은 내 맘대로 써도 하등의 상관이 있으랴 싶다.









[t:/] is not "technology - root". dawnsea, rss