메뉴 건너뛰기

NEOS White Paper

주의 : 본 기능은 NEOS V5에만 적용됩니다.

1. 메모리 디스크 만들기

 

NEOS의 파일시스템은 디스크와 같은 물리적인 저장매체가 없는 환경에서 하드디스크와 같은 블럭디바이스 인터페이스를 사용할 수 있도록 메모리 디스크를 지원한다.

 

제공되는 메모리 디스크는 타깃시스템 메모리의 일부를 블록 디바이스처럼 사용할 수 있도록 관리해주는 하나의 블록 디바이스 드라이버라고 생각하면 된다. NEOS에서 메모리 디스크를 사용하기 위해서는 연속적인 메모리 영역을 블록 디바이스 드라이버 영역으로 등록하고, 파일시스템에 마운트하는 일련의 절차를 수행 하여야 한다.

 

다음은 NEOS에서 메모리 디스크 기능을 사용할 수 있도록 제공하는 함수 인터페이들이다.

RamDiskDevCreate()

RamDiskDevCreate()함수는 지정된 메모리 영역을 하드디스크와 같은 블럭 디바이스로 사용할 수 있도록 메모리 디스크를 등록하는 기능을 제공한다.

MkfsMsdos()

하드디스크와 같은 블록 디바이스 장치를 NEOS의 입출력 서브시스템과 연동하여 사용하기위해서는  생성한 메모리 디스크에  FAT이나 Ext2와 같은 디스크를 효과적으로 관리할 수 있는 파일시스템을 생성하여야 한다.

NEOS에서는 MkfsMsdos() 함수를 이용하여 하드디스크나 메모리 디스크에 MSDOS 호환 파일시스템을 생성하며, 디스크 드라이브의 크기에 따라 FAT12, FAT16, FAT32 등을 지원한다.

파일시스템이 생성되면 사용자들은 open(),read(),write(),fopen(),fread(),fwrite() 같은 표준 인터페이스들을 이용하여 생성된 메모리 디스크를 사용할 수 있게된다.

mount()

메모리 디스크를 생성하고 디스크에 파일시스템을 생성하였다면 마지막으로 생성된 디스크를 NEOS의 파일시스템을 통하여 사용할 수 있도록 파일시스템에 등록해 주어야 한다.

mount() 함수는 디스크의 파일시스템 타입을 지정하고 메모리 디스크의 root path등을 지정하여 파일시스템에 등록해 준다.

 

다음은 위에서 설명한 함수들을 이용하여 NEOS 응용프로그램에서 메모리 디스크를 생성하는 예제이다.

/*
 * usrRamdisk.c
 *
 *  Created on: 2018. 5. 8.
 *      Author: mds
 */

#include <sys/memHeap.h>
#include <sys/ramDisk.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <dosfs.h>
#include <strings.h>
#include <neos.h>
#define RAMDISK_SECTOR_SIZE         512     /* 512 bytes */
#define RAMDISK_NUM_BLOCKS          40960    /* 40960 blocks */

void UserRAMdiskInit(void)
{
    Status              status;
    struct DosFsOptions opts;

    /* create RAM disk */
    status = RamDiskDevCreate("rd", NULL, RAMDISK_SECTOR_SIZE, RAMDISK_NUM_BLOCKS, RAMDISK_NUM_BLOCKS, 0);

    if (status != E_OK)
    {
        eprintf("RAM disk creation failed\n");
        return;
    }

    bzero(&opts, sizeof(opts));
    status = MkfsMsdos("/dev/rd0", &opts);

    if (status != E_OK)
    {
        eprintf("Formatting disk failed\n");
        return;
    }

    status = mount("msdos", "/dev/rd0", "/", MNT_ROOTFS | MNT_NOATIME, NULL);
    if (status != E_OK)
    {
        eprintf("Mounting disk failed\n");
        return;
    }

    mkdir("/tmp", 0766);
    mkdir("/etc", 0766);
    mkdir("/share", 0766);
}

void
UserAppInit(void)
{
    /* 메모리 디스크 생성 */
    UserRAMdiskInit();
}

 

 

 

위 예제 프로그램을 수행한 후 NEOS의 mount 쉘 명령어를 이용하여 현재 등록되어 있는 디스크 드라이브와 마운트 포인트,

마운팅된 파일시스템 타입등을 확인 할 수 있다.

## Starting application at 0x00100000 ...
  ____  _____   ________     ___      ______
 |_   \|_   _| |_   __  |  .'   `.  .' ____ \
   |   \ | |     | |_ \_| /  .-.  \ | (___ \_|
   | |\ \| |     |  _| _  | |   | |  _.____`.
  _| |_\   |_   _| |__/ | \  `-'  / | \____) |
 |_____|\____| |________|  `.___.'   \______.'
 NEOS Real-Time Operating System
 Copyright(c) Hancom MDS Inc. 2003-2018
 Runtime: NEOS version 5.2.0
 Kernel: version 2.2.0(SMP)
 ARCH: PowerPC CPU: e6500 VARIANT: generic
 BSP: T2080RDB version 1.00
 Build date: May 16 2018 11:27:18

-> mount
devfs on /dev (devfs, nodev)
mfs on /mem (mfs, nodev)
/dev/rd0 on / (msdos, noatime)
->

 

쉘의  “ls” 명령어를 이용하여 파일시스템에 생성된 디렉터리를 확인할 수 있다.

-> ls
tmp/
etc/
share/
-> 

 

2. 디스크에 파일 추가 하기

 

메모리 디스크는 타겟보드의 RAM에 만들어지기 떄문에 전원이 꺼지면 디스크의 내용은 모두 사라진다. 따라서 사용자 응용프로그램에서 파일시스템에 항상 저장된 파일이 필요할 경우 메모리 디스크 생성과 함께 필요한 파일도 함께 생성할 수 있도록 해주면 된다.

다음은 메모리 디스크에 필요한 파일을 넣는 방법에 대하여 간단히 설명한다.

 

첫쨰, 디스크에 넣고자 하는 파일을 헥사 코드로 변환하여 헤더 파일을 만든다. 다음은 파일을 헥사 코드로 변환하여 주는 프로그램이다.

 

#include <stdio.h>      // puts()
#include <string.h>     // strlen()
#include <fcntl.h>      // O_WRONLY
#include <unistd.h>     // write(), close()
#include <stdlib.h>

#define  BUFF_SIZE   1024

int main(int argc, char *argv[])
{
   FILE *fp_sour;
   FILE *fp_dest;
   char  buff[1024];
   size_t   n_size;
   unsigned char  data;
   char  arrstart[80];
   char  arrend[8] = "};";
   char  ofname[80];

   if (argv[1] == NULL)
   {
    printf("usage: testfile  filename ...\n");
    exit(0);
   }

   sprintf(arrstart, "unsigned char %s[] = {", argv[1]);
   sprintf(ofname, "%s.h", argv[1]);

   /* 변환 하고자 하는 파일은 연다 */
   fp_sour  = fopen( argv[1], "r");

   /* 변환된 파일을 헤더 파일로 만들기 위한 파일을 생성 */
   fp_dest  = fopen( ofname, "w");

   fwrite (arrstart, 1, strlen(arrstart), fp_dest);
   while( 0 < (n_size = fread( &data, 1, 1, fp_sour)))
   {
     /* 파일에서 데이터를 한바이트씩 읽어서 헥사코드로 변환 */
     fprintf(fp_dest, "0x%x,", data);
   }
   fwrite (arrend, 1, strlen(arrend), fp_dest);
   fclose( fp_sour);
   fclose( fp_dest);
   return 0;
}

 

컴파일 하여 변환 프로그램 실행파일 생성:

위 프로그램을 리눅스나 맥과 같은 호스트 개발환경에서 컴파일한 후 생성된 실행파일을 이용하여 아래와 같이 변환하고자 하는 파일을 변환하면 된다. 

gcc -o conv2data conv2data.c

 

변환 프로그램을 이용하여 변환할 파일 예제

예제 파일: dp-bit.c

#include <stdio.h>

int main()
{
    int i, total;

    total = 0;
    for (i=0; i<10; i++)
        total += 1;

    if (total != 45)
    {
        printf("Failure\n");
    }
    else
    {
        printf("Success\n");
    }
    return 0;
}

 

파일 변환 실행

> conv2data dp-bit.c

 

dp-bit.c 파일을 변환하면 dp-bit.c.h 파일이 생성되고 내용은 다음과 같다. 파일의 내용을 hex 값으로 변환하여 데이터 배열로 만든것이며, NEOS 응용프로그램에서 아래 배열을 디스크에 쓰면 본래의 파일로 생성하게 된다.

unsigned char dp_bit_c[] = {
0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x73,0x74,0x64,0x69,0x6f,0x2e,
0x68,0x3e,0x0a,0x0a,0x69,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,
0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x2c,0x20,0x74,0x6f,0x74,0x61,
0x6c,0x3b,0x0a,0x0a,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x20,0x3d,0x20,
0x30,0x3b,0x0a,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x3d,0x30,
0x3b,0x20,0x69,0x3c,0x31,0x30,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x20,0x2b,0x3d,0x20,0x31,0x3b,
0x0a,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x6f,0x74,0x61,0x6c,0x20,
0x21,0x3d,0x20,0x34,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,
0x72,0x69,0x6e,0x74,0x66,0x28,0x22,0x46,0x61,0x69,0x6c,0x75,0x72,0x65,0x5c,0x6e,
0x22,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x28,0x22,0x53,0x75,0x63,
0x63,0x65,0x73,0x73,0x5c,0x6e,0x22,0x29,0x3b,0x0a,0x0a,0x20,0x20,0x20,0x20,0x72,
0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,};

 

NEOS 응용프로그램에서 메모리 디스크에 파일추가 예제:

데이터로 변환된 헤더 파일을 응용프로그램에 include 해서 메모리 파일에 쓴다.

#include <neos.h>
#include <time.h>
#include <sys/errno.h>
#include <stdio.h>
#include <fcntl.h>
#include “dp-bit.c.h”

/* 배열에 저장된 데이터를 디스크에 파일로 생성 */
int createFileFromBuff(const char *filename, const unsigned char buff[], int buffsize)
{
    FILE    *fp_dest;
    int     status;

    fp_dest  = fopen( filename, "wb+");
    if (fp_dest == NULL)
    {
        printf("fopen: error (%d)\n", errno);
        return (-1);
    }

    status = fwrite (buff, 1, buffsize, fp_dest);
    if (status < buffsize) {
        printf("fwrite: error (%d)\n", errno);
        return (-1);
    }

    fclose( fp_dest);
    return 0;
}

void UserAppInit(void)
{   
    printf("sizeoflong(%d)\n", sizeof(long));
    createFileFromBuff("dp-bit.c", dp_bit_c, sizeof(dp_bit_c));
}

 

 
위로