[summary] linux device driver


디바이스드라이버의 역할은?
- 응용프로그램이 H/W를 제어할 수 있도록 Interface를 제공해 주는 것이다.
- 시스템이 지원하는 하드웨어를 응용프로그램에서 사용할 수 있도록 커널에서 제공하는 라이브러리다.
- 디바이스와 시스템메모리 간에 데이터의 전달을 담당하는 커널 내부 기능이다.
- 디바이스를 제어하는 함수 집합

디바이스드라이버의 인터페이스
- 일반적으로 위로는 파일시스템(file system)과 아래로는 실제 디바이스와 인터페이스를 갖는다.

응용프로그램이 커널에게 자원 처리를 요청하는 두 가지 방법
- System call (S/W ISR)
- File I/O (Device Driver)

커널소스탐색
- http://lxr.linux.no/linux/

grep 명령의 활용
ex) grep readb * -r | grep include

이외에 include/linux, include/asm 활용. 한편, SourceInsight 는 코드 분석을 위해 유용하다.

module programming의 장점
부팅 중에도 디바이스드라이버를 수정할 수 있다.

리눅스에서 동작하는 프로그램은 H/W를 제어하기 위해 디바이스 파일을 이용해야만 한다.
디바이스 파일은 mknod로 생성한다. 이 파일에 대한 I/O는 저수준 함수를 사용한다.
open, close, read, write, ioctl, fsync, lseek
int fd = open("/dev/mem", O_RDWR | O_NONBLOCK); ....

문자 디바이스 드라이버(버퍼없는 디바이스드라이버)
- ex) 터미널 드라이버
http://lxr.linux.no/linux/drivers/char/tty_io.c
http://lxr.linux.no/linux/drivers/char/serial167.c


통합형 디바이스 드라이버란?
- ?

하나의 디바이스는 여러 개의 드라이버에 의해 동작할 수 있다.

Bus는 직/간접적으로 프로세서에 연결되고, 디바이스는 하나의 버스에 연결된다.

디바이스파일의 목적
- H/W 를 다루는 드라이버의 정보를 커널에 제공하는 데 있다.
- 응용프로그램은 시스템에 의해 할당된 메모리와 파일만 제어할 수 있고, H/W에 직접 접근할 수는 없다. 그래서, 디바이스파일이라는 특수 파일을 이용한다.
- 디바이스파일은 H/W를 제어하는 디바이스드라이버와 연결된다.

주번호와 부번호
- 주번호가 같다는 것은 같은 드라이버에 의해서 구동될 수 있다는 의미가 된다.

(문자)디바이스드라이버 구현 순서
1. 디바이스드라이버 함수 구현
2. 디바이스드라이버 커널 등록 (register_chrdev()) http://lxr.linux.no/linux/fs/char_dev.c#L266
3. 디바이스 파일 생성 (mknod)

문자디바이스드라이버 sample
- http://halkamalka.tistory.com/29

디바이스드라이버 read/write 구현 시 알아야 할 사항
1. User memory space와 Kernel memory space 사이에 데이터 이동
read 의 인자는 드라이버의 xxx_read의 인자로 연결되지만, User application에서 전달된 인자의 buffer에 드라이버에서 직접 접근할 수는 없다. 왜냐하면, 메모리 공간이 각각 Kernel과 User로 서로 다르기 때문이다. 따라서, 이렇게 다른 영역에 데이터를 전송하기 위해서는 다음의 함수를 사용한다.
- copy_to_user(to, from, n); // Kernel에서 User로 n만큼
- put_user(x, ptr) // 커널의 x값을 사용자 메모리(ptr) 값에 대입한다.
- H/W에서 직접 읽기: inb, outb, readb, writeb etc
cf) copy_from_user(to, from, n) , get_user(x, ptr)
위 함수들을 사용하기 위해서는 다음 header를 포함시켜야 한다.
#include <asm/uaccess.h>

verify_area example

ssize_t xxx_read(struct file* file, const char* buffer, size_t count, loff_t* f_pos)
{
int err;
err = verify_area(VERIFY_WRITE, (void*) arg, size);
if(err < 0)
return err;
return 0;
}


copy_to_user example

ssize_t xxx_write(struct file* file, const char* buffer, size_t count, loff_t* f_pos)
{
char* temp;
int err;
temp = kmalloc(count, GFP_KERNEL);
if(err = copy_to_user(temp, buf, count) < 0)
return err;
kfree(temp);
}

copy_from_user example

ssize_t xxx_read(struct file* file, const char* buffer, size_t count, loff_t* f_pos)
{
char* temp;
int err;
temp = kmalloc(count, GFP_KERNEL);
if(err = copy_from_user(temp, buf, count) < 0)
return err;
kfree(temp);
}

2. 처리 조건이 되지 않았을 때의 blocking처리
3. H/W 제어 함수
4. 여러 프로세스가 동시에 접근했을 때의 경쟁 처리
5. ISR와의 경쟁 처리

전역 변수 할당 시 참고 기준
1. H/W 관련 제어 변수는 전역 변수로 만든다.
2. 단독으로 사용되는 ISR에서 사용되는 변수들은 전역 변수로 만든다.
3. 프로세스마다 따로 관리해야 하는 변수(REENTRANT를 고려해야 하는) 들은 file구조체의 private_date필드 변수에 할당한다.
4. H/W와 연동하는 대기 큐는 전역 변수로 만든다.

I/O처리
H/W는 프로세서 입장에서 I/O 주소 영역으로 표현되는 메모리 공간이다. 이 메모리 공간을 제어하는 방법은 시스템마다 다르므로 이를 통일하기 위해 몇 가지 함수를 정의한다.
1. I/O mapped 입출력 함수
inb, inw, inl, insb, insw, insl : H/W에서 데이터를 읽는다.
outb, outw, outl, outsb, outsw, outsl : H/W에 데이터를 쓴다.
* 위 함수들은 MACRO이며, #include <asm/io.h>에 정의되어 있다.
* arch 마다 다르게 구현되어 있으므로, 참고할 필요가 있다.
2. Memory mapped I/O 함수
PCI 디바이스나 ARM같은 프로세서는 H/W가 I/O port에 연결되어 있지 않고 메모리 공간에 연결된다.
readb, readw, readl, memcpy_fromio
writeb, writew, writel, memcpy_toio


Getting started with an embedded Linux system emulator
ByLinux Devices

Foreword -- This article describes setting up an embedded Linux cross-development environment targeting a virtual machine running on the development host. It covers installing Qemu and using it to debug applications and kernels, both with supplied test-images and with custom kernel/filesystem images...

created with Buildroot.

The article was written by Gilad Ben-Yossef, co-founder of Israel-based embedded Linux training and consulting firm Codefidence. Ben-Yossef originally published the article on his Tuxology blog. Enjoy . . . !


Building an embedded Linux system emulator
by Gilad Ben-Yossef


One of the hallmarks of embedded system programming is working with specialized hardware. Unfortunately, embedded system developers do not always have the luxury to develop and test their code on the actual hardware they target. Often, the hardware is developed in tandem with the system software and therefore it it is not available for much of the embedded system software development cycle.

While one can develop and test much of our code on a PC running Linux, such a PC is a very different environment from the target board. More often then not, the target board is not even of the same architecture as the PC. A solution to this problem can be obtained by using an emulator - a software tool that executes software code of our target platform in a virtual machine that is running on our development host, and running our system software in it.

The following article describes how to build an embedded Linux system running inside an emulator which can be used to develop, test and debug target code even without access to target hardware.


The components

To build our emulator we will need the following components:
  • Hardware emulator (we'll use Qemu)
  • Minimal Linux root file system containing a C library and Busybox
  • The Linux kernel

Installing Qemu

Created by Fabrice Ballard, Qemu is an open source machine emulator supporting seven target architectures, including x86, MIPS, ARM, and PowerPC. As first step, we will download and install the emulator. Depending on the Linux distribution you use on your workstation, you might be able to use the native package management system of the distribution to do so.

For Debian, Ubuntu and derivatives:

$ sudo apt-get install qemu

For Fedora and derivatives (as root):

# yum install qemu

For other distributions lacking a Qemu package, or for those wishing to obtain the very latest package (note that the "i386" label refers to the host running the emulator, and not the target platform):

$ wget http://bellard.org/qemu/qemu-0.9.1-i386.tar.gz
$ cd /
$ sudo tar zxvf qemu-0.9.1-i386.tar.gz

Or, as root:

# tar zxvf qemu-0.9.1-i386.tar.gz

Alternatively, you can download the sources and build the emulator from scratch. This has the added advantage that you can later adapt the emulator to more accurately reflect your actual hardware:

$ wget http://bellard.org/qemu/qemu-0.9.1.tar.gz
$ tar zxvf qemu-0.9.1.tar.gz
$ cd qemu-0.9.1/
$ ./configure
$ make
$ sudo make install

Or, as root:

# make install


Kernel and file system images

The Qemu emulator we have just installed provides a virtual machine mimicking our target hardware. To actually get Linux running on this virtual machine, however, we will need to download an image of the Linux kernel and a suitable root file system image for our target architecture.

Luckily, the Qemu project provides test images for several architectures that can be used to get a fast start with Qemu as an embedded Linux system emulator. Go to the Qemu project download page and choose one of the Qemu test disk images suitable for your embedded platform and download it to your Linux host (in this example we use ARM):

$ wget http://bellard.org/qemu/arm-test-0.2.tar.gz

Now extract the image:

$ tar zxvf arm-test-0.2.tar.gz
$ cd arm-test


Booting Linux on the emulator

Start up Qemu with the following command line, adjusting the architecture name, kernel file name, and root file system image name according to your specific architecture (again, we use ARM in this example):

$ qemu-system-arm -kernel zImage.integrator \
-initrd arm_root.img -tftp / -redir tcp:9999::9999

The above command line starts Qemu in system emulation mode, booting into the kernel image zImage.integrator while loading into the virtual machine RAM the arm_root.img file system, and instructing Qemu to make your entire host root file system available for access via TFTP from the emulated machine (more on this ahead).

You should now be seeing a window similar to the following in which the emulated LCD display of the board is shown:


Qemu screenshot
(Click to enlarge)


You can log-in with the user "root" -- no password is required.


Transferring files to and from the host

The emulator and file system are set up to automatically configure a virtual Ethernet interface in the virtual machine with an internal IP. Through that virtual network interface, the emulator is set up to enable transferring of files to and from the host machine file system using the TFTP protocol.

For example, the following command will copy the file "/home/gby/hello_emu" from the host file system to the current directory inside the emulator:

$ tftp -g -r /home/gby/hello_emu -l hello_emu 10.0.2.2

The following command will copy the file "/root/test.log" from the emulator to the host file system directory "/home/gby/":

$ tftp -p -l/root/test.log -r /home/gby/test.log 10.0.2.2

In addition, you can use the "wget" comment to transfer files using the FTP and HTTP protocol to the emulator from any compatible server accessible in the network:

$ wget http://codefidence.com/some/file

Qemu supports numerous other way to interact with the host and it's environment, including bridged virtual network interfaces (as opposed to the default NAT used in the example above). Bridged virtual network interfaces enable:
  • Using NFS to communicate with the host
  • Remote debugging from the host
  • VLAN support
  • Exposing the host file system as a FAT file system
  • Mounting disk, flash, or CDROM images from the host file system
  • Using USB devices connected to the host
For more information on these advanced options, please refer to the Qemu user manual.


Debugging user applications

Using the GNU debugger GDBserver agent, we can debug applications running inside the emulator using the GDB debugger on the host. To do this, first use one of the methods outlined above to copy the "gdbserver" executable to the emulator. Note that you will need a gdbserver executable that was built to run on the target architecture (such as ARM, in the example above), and not on that of the host!

Also note that since the test images do not contain debugging symbols for the system libraries, you will only be able to debug statically compiled applications using them. This limitation can be removed by building your own kernel and file system image (see below for more information on this topic).

$ tftp -g -r /home/gby/src/gdb/gdb/gdbserver/gdberver \
-l gdbserver 10.0.2.2

Next, assign the gdbserver binary execute permissions:

$ chmod u+x gdbserver

Now, run the gdbserver agent, instructing it to use port 9999 (which we previously redirected to the emulator, when we launched qemu-system-arm from the command-line) to listen for connections from the debugger:

$ gdbserver 0.0.0.0:9999 /bin/myprog

Or, if you wish to attach to an already running program, use:

$ gdbserver 0.0.0.0:9999 --attach 1234

Finally, run the GDB debugger on your host and instruct it to connect to the host local port 9999:

$ arm-linux-gdb target/bin/myprog
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
...
(gdb) set solib-absulote-prefix /dev/null
(gdb) set solib-search-path target/lib/
(gdb) target remote 127.0.0.1:9999


Debugging the kernel

Using the Qemu emulator to debug kernel code is quite straight forward, as Qemu incorporates a minimal GDB agent as part of the emulator itself. To debug the Linux kernel running inside the emulator, add the "-s" parameter to the command line used to start Qemu:

$ qemu-system-arm -kernel zImage.integrator \
-initrd arm_root.img -tftp / -redir tcp:9999::9999 -s

Now when the emulator starts, it will wait for a debugger connection on the default port "1234" (or a different port specific with the "-p" option), before proceeding with the boot. Once the emulator has started, you can debug the Linux kernel running inside it, using GDB on the host:

$ arm-linux-gdb linux/vmlinux
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
...
(gdb) target remote 127.0.0.1:1234

You can use GDB as you normally would. For example, type "cont" to launch the kernel:

(gdb) cont


Building your own kernel and file system images

So far we have seen how to use the Qemu emulator with the test kernel and file system images that are available on the Qemu site. To make full use of the emulator, we can create our own custom kernel and file system images that will better reflect the real target we are trying to develop for.

First, query Qemu regarding which boards it can emulate for your chosen architecture. Replace "arm" in the example above with one of: mips, x86_64, ppc, or sparc. For i386, simply use "qemu" as the command:

$ qemu-system-arm -M \?

Choose the board that most closely resembles your real target environment. Note that you can add support to Qemu of your specific true board. This requires some programming though, and we shall not cover it in this tutorial.

The creation of a kernel and file system for our emulated target is no different then doing the same task for real hardware. In fact, many tools are freely available to accomplish this task. In this example, we shall use the Buildroot framework. Buildroot is a set of make files and patches that simplify the generation of a cross-compilation tool chain and root file system for your target Linux system, using the uClibc C library.

First, we shall download the latest Buildroot release from the project web site and extract it:

$ wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2
$ tar jxvf buildroot-snapshot.tar.bz2
$ cd buildroot/

Next, let's configure Buildroot for our chosen target board:

$ make menuconfig

You will be presented with a menu enabling you to pick your architecture, sub-architecture, specific board to build for. Other options include GCC and uClibc versions, and related details. For each menu choice in the configuration tool, you can find associated help information describing the purpose of the entry.

At minimum, the following configuration options needs to be set:
  • Target Architecture option -- choose your target architecture (e.g., arm.)
  • Target Architecture Variant option -- Chose a specific model of the architecture (e.g., arm926t).
  • Target options menu -- If the target board you wish to emulate (that is supported by Qemu) is listed, turn on support for that board (e.g., enable the "ARM Ltd. Device Support" menu, and inside it choose the "Integrator arm926" option).
  • Toolchain menu -- Turn on "Build gdb server for the Target" option, and if you would like to test C++ programs on the emulator, also the "C++ cross-compiler support" option.
  • Target filesystem options menu -- Enable the "cpio the root filesystem" option, and choose the "gzip" compression method. You may also request the file system image to be copied to a specified directory once it is generated.
  • Kernel menu -- Choose the "linux (Advanced configuration)" option, and pick one of the offered Linux kernel versions of the list offered. Also, select the "zImage" binary format. Here, you can also specify a directory to copy the generated kernel to.

    In addition, you will need to supply a proper Linux kernel configuration file. Note that you can extract the kernel configuration file used to generate the kernel supplied as part of the test images, by issuing the following command from inside the emulator:

    $ zcat /proc/config.gz > linux.config

    Alternatively, Linux provides specific kernel configuration for optimal use with Qemu for some architectures. Run the following command to inspect the default kernel configuration included in a specific Linux kernel version:

    $ make help
When you're done configuring Buildroot, exit the configuration utility (making sure to OK saving the changes) and type: "make". Buildroot will now download all required sources, and build your new kernel and file system image for you. You should now be able to run the emulator using the kernel and file system image you have just created. Use the file name and path of the zImage binary as a parameter to Qemu's "-kernel" option, and the file name and path of the file system image with Qemu's "-initrd" parameter, like so:

$ qemu-system-arm -kernel zImage \
-initrd rootfs.arm.cpio.gz -tftp / -redir tcp:9999::9999 -s


As we have shown, the Qemu emulator provides a fairly simple way to develop, debug, and test Linux kernels, drivers, and applications for a variety of embedded architectures, even when no actual hardware is available. More information about the software used in this article can be found on the qemu, gdb, and Buildroot websites.



About the author -- Gilad Ben-Yossef is the co-founder and CTO of Codefidence Ltd, and has been helping OEMs make and use free and open source software in commercial products and services since 1998. He is also the co-author of the book "Building Embedded Linux Systems," 2nd Edition. In addition, he is co-founder of Hamakor, an NPO devoted to the promotion of FOSS in Israel, as well as a founding organizer of "August Penguin," an Israeli community FOSS conference.

Gilad is a member of the Israeli chapter of Mensa, the Israeli Information Technology Association and the Israeli chapter of the Internet Society. He holds a B.A. in Computer Science from Tel-Aviv Jaffa Academic College. When not trying to make FOSS software do something the authors never intended, Gilad likes to SCUBA dive, read science fiction, and spend time with his wife Limor and his and two adorable girls, Almog and Yael.



[컬럼] 초보자를 위한 임베디드 리눅스 학습 가이드

  목차   1.    개요   2.    저작권   3.    문서   4.    임베디드 리눅스를 공부하기 위하여 자신의 상태에 따라서 무엇을 해야 하는가?   4.1   임베디드리눅스를 공부하고자 하는분들이 가장 먼저 해야 할일   4.2   리눅스를 설치 해 본적도 없는 초 울트라 초차   4.3   리눅스 명령에 익숙하지 않다면   4.4   리눅스 디렉토리 구조를 모른다면   4.5   쉘 스크립트를 모른다면   4.6   유닉스 운영 체제를 모른다면    4.7   C 언어를 모른다면   4.8   리눅스에서 도는 어플리케이션을 작성한 적이 없다.    4.9   make 사용법을 모른다면   4.10  리눅스가 동작하기 위한 최소한의 기본 구성에 대해 아는 것이 없다.    4.11  커널 컴파일을 해 본적이 없다면.   4.12  커널의 구조를 모른다면   4.13  어셈블러를 모른다면   5.    윗글에서 제안한 리눅스의 개발과 관련한 기본을 다진후 진행하는 방법    5.1   디바이스 드라이버를 정복하라!!!   5.1.1 어떤 책이 좋을까?   5.1.2 디바이스 드라이버 프로그램을 직접 해본다.    5.1.3 프린터 포트를 이용한 캐랙터 디바이스를 만든다.    5.1.4 자신이 사용하는 커널 버전이외의 내용은 과감하게 삭제한다.    5.1.4 네트웍크용 디바이스 드라이버는 공부해라.   5.1.5 기존에 디바이스 드라이버를 한번쯤 스스로 재 작성해 보라.   5.2   커널을 이해하라....   5.3   커널을 이해하기 위한 방법론 및 어디까지?   6.    정말 임베디드 리눅스를 하려면    6.1   평가 보드를 구매하라...   6.2   평가 보드를 구매 했다면....   6.3   MCU를 공부하라..   6.4   평가 보드의 회로를 공부해라...   6.5   평가 보드에 사용되는 디바이스를 공부해라...   6.6   크로스 컴파일 환경을 구축하는 것을 공부하라...   6.7   부트 로더를 공부하라.   6.8   NFS 시스템에 대해서 공부하라...   6.9   그외 나머지는 어떻게?   6.9.1 MMU가 없다..   6.9.2 루트 디스크 이미지와 램 디스크    6.9.3 플래쉬 메모리에 대해서 공부 할것   6.9.4 계속 늘어 놓으면 한도 끝도 없을 것 같으므로 ...   7.    빨리 개발하는 방법....   7.1   이미 개발된 평가 보드를 이용할 것...   8.0   내가 하고 싶은 말은 ...   

1. 개요

이 문서의 내용은 정말 초보자가 임베디드 리눅스를 어떻게 접근하면 좋은가에 대한 생각을 적어 놓은 것이다.


2. 저작권

이 문서는 GNU 라이센스를 따른다.
단 최초 작성인은 유영창임을 표시하여야 한다.

3. 문서

버전 1.0 - 2001. 06. 11
버전 1.1 - 2001. 06. (html version)

이 문서에 불만이 있거나 다른 생각이 있다면 여기로 메일을 보내 줄것

frog6502@hanmail.net


4. 임베디드 리눅스를 공부하기 위하여 자신의 상태에 따라서 무엇을 해야 하는가?

4.1 임베디드리눅스를 공부하고자 하는분들이 가장 먼저 해야 할일
임베디드 리눅스를 해야 겠다는 생각만 가지고 있다가 이젠 시작해야지 라는 생각을 하셨다면 우선 숨을 크게 들이키시고 내벹는 행동을 반복하신후 임베디드 리눅스를 단번에 점령하겠다는 생각을 버린다. ^^; 정말 임베디드 리눅스는 한번 들어가 보면 끝이 없어서 한두달 만에 끝장을 보겠다는 생각을 가지셨다면 당장 그만 둘것! 당장 그만 두지 않더라도 조만간 그만 두게 될것이다. 왜? 한두달안에는 끝나지 않기 때문이다. 혹시 시작하는 시점의 여러분의 실력이 리눅스의 커널을 이미 분석이 끝난 실력이라면... 더구나 여러 아키텍쳐에 포팅까지 한 실력이라면 정말 한두달 사이에 끝날수 있을 것이다. 굳이 임베디드 리눅스를 따로 할 필요가 없는 실력자이므로...
4.2 리눅스를 설치 해 본적도 없는 초 울트라 초차
당장 리눅스 배포판을 구한다. PC에 리눅스를 설치한다.
4.3 리눅스 명령에 익숙하지 않다면
우선 리눅스에 관련된 책을 한권 산다. 그리고 한번 쭈욱 읽어 본다.
kldp.org 싸이트에 들락 날락 거리면서 man.kldp.org 도 참고 하면서.... 단 주의 할것은 암기력에 자신 있는 분을 제외하고는 명령을 굳이 외우려고 하지 말것 자주 사용하는 명령은 손가락이 외운다. 굳이 사용도 하지 않는 명령을 외우려고 스트레스 쌓이지 말고... 더구나 리눅스 명령어는 정말 정말 너무 많다.
4.4 리눅스 디렉토리 구조를 모른다면
최상위 디렉토리를 외운다. 몇 개 안되므로... 그리고 서점에 간다... 리눅스 관련 책들을 보면서 디렉토리에 관련된 내용을 중점적으로 읽는다. 읽어야 하는 내용은 디렉토리 구현에 대한 것이 아니라.. 각 디렉토리를 어떻게 구분해 놓았는가를 설명한 내용들을 읽는다. 대부분의 책들이 조금씩 만 소개하므로 굳이 책들을 사려고 하지 말 고 서점에서 여러권을 설렵하는 것이 났다. 그리고 이것저것 패케지들을 손수 설치해 본다. 그러면 저절로 깨닫게 될것이다.
4.5 쉘 스크립트를 모른다면
리눅스를 하면서 쉘 스크립트를 모르면 고생문이 훤하다 사실 내가 그렇다. 그러나 쉘 스크립트를 아주 잘 할 필요는 없다. 쉘 스크립트를 읽을 정도면 된다. 쉘 스크립트를 작성할 필요가 있다면 스크립트에 대한 강좌를 인터넷에서 보고 하거나 다른 스크립트를 보면서 하면 되니까....
4.6 유닉스 운영 체제를 모른다면
유닉스 운영체제에 대한 최대한 쉽게 설명한 책을 골라서 그냥 소설 읽는 셈 치고 읽어 본다. (참고) 쉽게 설명한 책들의 특징은
1. 그림이 많다.
2. 글씨가 크다.
3. 가격이 싸다.
4. 많은 사람들이 본다.
5. 두께가 얇다.
4.7 C 언어를 모른다면
이건 사람 얼굴에 입이 없는 셈이다. 밥 어떻게 먹으려나... 곧 굶어 죽게 될것이다. 바로 C의 기본적인 설명에 대한 책을 독파한다. 이건 정성 들여서 독파해야 한다. 임베디드 리눅스는 거의 C로 시작해서 C로 끝난다. 가끔 C++도 있지만....
4.8 리눅스에서 도는 어플리케이션을 작성한 적이 없다.
http://users.unitel.co.kr/~sangeun5/linux/lpg.html 에 가본다. 정말 도움이 될것이다
4.9 make 사용법을 모른다면
make 사용법을 아주 잘 알 필요는 없다 그러나 기본적인 사용법은 알고 있어야 한다. 아주 복잡한 사용법은 이미 기술된것을 이용하는 것으로 충분하다.
4.10 리눅스가 동작하기 위한 최소한의 기본 구성에 대해 아는 것이 없다.
부팅 디스크를 만들어 본다. 여기서 주의 할것! 대부분의 분들이 켈프에 있는 부팅 디스크 만들기를 따라만 하시는데 이건 별로 효과가 없다. 부팅 디스크를 만드는 목적은 리눅스가 동작하기 위한 최소한의 기본 구성을 알고자 하는데 목적이 있다. 또한 로더의 필요성 커널과 루트 이미지의 분리와 램디스크에서 동작하는 것에 대해서 또 커널이 동작한 후에 실행되는 최소한의 진행과정을 이해하기 위한 것이다. 이를 알고자 하는데 목적을 두어야지 만드는데에만 열중하면 안된다. 또한 다른 부팅 디스크 이미지를 이용하여 그 내용을 살표보고 공부하여야 한다.
4.11 커널 컴파일을 해 본적이 없다면.
임베디드 리눅스는 커널을 가지고 놀아야 한다. 물론 안하고 하는 방법은 있다. 그러나 대부분의 임베디드 리눅스에서 커널 컴파일과 환경 설정은 거의 필수이다. 임베디드상에서 리눅스의 커널 환경을 설정하고 컴파일하는 방식과 우리가 일반적으로 다루는 PC의 커널을 다루는 방법은 거의 대부분이 같다. PC상에서 커널을 자유자재로 가지고 논다는 것은 "임베디드상에서도 자유롭다"는 것을 의미한다.
4.12 커널의 구조를 모른다면
Uinx kernel 완전분석으로 가는길이라는 책을 한번 볼것
약간은 예전의 커널에 대한 이야기가 나오지만 커널이 어떻게 동작하는 지를 알수 있다.
4.13 어셈블러를 모른다면
임베디드 리눅스를 함에 있어서 어셈블러를 몰라도 가능한 영역은 있다. 그러나 많은 부분에서 부딪히게 된다. 고로 어셈블러는 필요 충분 조건이다. 어셈블러라는 것이 너무도 많은 종류가 존재하므로 모두 다 익히기는 어렵지만 자신이 사용하려는 MCU의 어셈블러는 익혀야 한다. 일단 PC를 이용한 임베디드에 대해서 익히려면 PC의 어셈블러는 알아야 한다. 자유 자재로 구사할 정도로 익힐 필요는 없다. 다른 쏘스의 명령을 이해하고 자신이 필요로 하는 기능을 추가하거나 수정 할수 있을 정도면 된다.

5. 윗글에서 제안한 리눅스의 개발과 관련한 기본을 다진후 진행하는 방법

임베디드 리눅스를 할때 많은 분들이 평가 보드를 이용한 학습을 준비한다. 그러나 이런 분들은 대부분 좌절한다. 왜? 기본기가 없는 분들이 평가 보드에 포팅하겠다고 덤비기 때문에 좌절하는 것이다. 포팅이 그리 쉬운 것은 아니다. 일단 PC에서 내공을 쌓은 후 접근하는 것이 수월하다. 임베디드 리눅스라고 PC의 리눅스와 다른 점은 거의 없다. 단지 아키텍쳐만이 다를 뿐이며 이 부분은 전체에 3%도 되지 않는다. PC에서 리눅스의 내부를 자유 자재로 드나드는 분이면 임베디드 리눅스에 접근은 너무도 쉽다. 사실 몇가지 사항을 제외하고는 임베디드 리눅스보다 PC 시스템이 더 복잡하다. 가격도 비교해보면 임베디드 장비가 더 싸다.. ^^; 자 이젠 PC에서 임베디드 리눅스를 하기 위한 접근 방법을 알아 보자. 그리고 공부하기 위하여 평가 보드를 구입하기에는 개인이 구입하는 가격이 너무 고가이다. 컴퓨터를 또하나 사는 셈인데...이게 말처럼 쉽겠는가? 고액 연봉자라면 모를까....
5.1 디바이스 드라이버를 정복하라!!!
임베디드 시스템을 개발하는 과정에서 하드웨어쪽을 제외한 나머지 소프트웨어 측면에서 개발 비중은 로더 및 하드웨어 테스트 프로그램 10% 커널 포팅 10% 디바이스 드라이버 40% 임베디드 어플리케이션 40% 이렇다. 물론 내 개인적인 생각이므로 상황에 따라 다르겠지만 .... 그만큼 디바이스 드라이버는 중요하다. 디바이스 드라이버를 개발 한다고 평가보드를 구매 해야 하는가? 이에 대답은 "아니오" 이다. PC는 매우 복잡한 시스템이다. 임베디드에 사용되는 대부분의 기능이 PC에는 있다. 그러므로 PC에 도는 하드웨어에 관련된 디바이스 드라이버를 스스로 만들 능력이 된다면 임베디드용 디바이스 드라이버를 만들 능력은 충분해 진다. 일단 돈 안드는 PC부터 정복해라. PC가 없다면 모를까 ^^; 자 그럼 디바이스 드라이버는 어떻게 정복하는 것이 좋을까? 한번 알아보자..
5.1.1 어떤 책이 좋을까?
디바이스 드라이버를 만드는 방법에 대한 책으로 대표적인것에는 오렐리의 책이 있다. 그러나 이책을 초보자가 보기에는 너무 어렵다. 그렇다고 마땅한 다른 책이 있는 것도 아니다. 고로 선택권이 없으므로 이 책을 여러번 읽어 본다. 완벽하게 이해하려고는 하지 말기를 부탁한다. 여러번 읽어 보면 어렴풋이 무슨 내용인지 이해하는 시점이 있을 것이다.
5.1.2 디바이스 드라이버 프로그램을 직접 해본다.
우선 오렐리의 책에 소개된 싸이트에 가서 쏘스를 가져 온다. 그리고 쏘스를 이해하려고 노력한다. 또한 KELP의 내가 쓰고 있는 디바이스 드라이버의 강좌를 계속 지켜 보거나 현재 진행되고 있는 박철님이 진행하고 있는 목요 세미나에 참가한다. 아니면 웹을 뒤지면 의외로 디바이스 드라이버 강좌를 하는 싸이트가 꽤 된다. 싸이트 이름을 내가 일일이 외우기는 힘들지만 ... ^^; ( 천재는 건망증이 심하다고들 한다. )
5.1.3 프린터 포트를 이용한 캐랙터 디바이스를 만든다.
대부분의 임베디드 장비에서 사용되는 디바이스는 캐랙터 디바이스로 충분하다. 고로 캐랙터 디바이스를 안다는 것은 임베디드용 디바이스 드라이버의 절반에 해당하는 내용을 안다는 의미도 된다.
5.1.4 자신이 사용하는 커널 버전이외의 내용은 과감하게 삭제한다.
현재 임베디드용 커널은 2.2대를 근거로 사용한다. 2.4대는 최근에 나왔으므로 아직은 적용중이다. 임베디드용 커널은 버전이 낮다. 또 2.0 대 이전 버전은 약간 적용 방식이 다른 것으로 기억한다. 이를 위해서 오렐리 책에서는 이런 저런 내용을 기술하고 있는데 실전에 사용되는 임베디드 리눅스는 사실 커널을 여러가지로 사용하겠끔 굳이 설계하지 않아도 된다. 즉 커널 버전을 덜 타는 것이다. 범용적인 PC용 디바이스 드라이버를 작성할때나 고려할 내용이다. 그러므로 여러분은 괜히 쏘스를 어지럽히는 커널의 버전 관리 에 대한 내용은 과감하게 제거하고 진행하는 것이 수명 연장에 지름길이 된다.
5.1.4 네트웍크용 디바이스 드라이버는 공부해라.
임베디드 장비에 리눅스를 사용하는 가장 큰 목적 중에 하나가 네트워크 스택을 이용하기 위한 것이다. 리눅스 자체가 덩치가 크므로 조그마한 임베디드 장비에는 아예 탑재하지 않는다. 채산성이 전혀 맞지 않기 때문이다. 더구나 리눅스의 대부분의 어플리케이션이 네트워크에 연관되어 있다. 고로 네트워크 디바이스 드라이버는 공부해야 한다.
5.1.5 기존에 디바이스 드라이버를 한번쯤 스스로 재 작성해 보라.
계속 말하는 것이지만 PC는 매우 복잡한 시스템이다. 고로 PC의 디바이스 드라이버를 구현 할수 있다는 것은 임베디드용 디바이스 드라이버를 구현 할 수 있는 능력이 된다는 것과 동일한 내용이다. 여기서 주의 할것은 PC에서 구현된 디바이스 드라이버들은 매우 안정된 상태이다. 여러분이 이렇게 완벽하게 안정된 디바이스 드라이버를 만들 수는 없다. 왜? 초짜이므로.... 똑같이 안정된 디바이스 드라이버를 작성할수 있다면 바로 리눅스의 개발에 앞장 서 주시길 부탁한다. 보통 많은 분들이 PC용 디바이스 드라이버를 재 작성할때 시리얼 포트용 디바이스 드라이버 부터 하는데 제발 시리얼 포트 부터 하지 말것... PC의 리눅스 상에서 시리얼은 정말 복잡하다. 보통 임베디드의 시리얼과는 상대가 되지 않는다. 터미날을 지원하는 기능과 가상 터미날과 연계 되어 있기 때문이다. 고로 차라리 프린터 포트나 마우스 같은 디바이스 드라이버 부터 만들어 가라... 어쩌면 랜카드용 디바이스 드라이버가 더 쉬울지도 모른다. 다시 당부 드리지만 시리얼 포트 부터 접근하지 말것....
5.2 커널을 이해하라....
디바이스 드라이버를 공부하다보면 많은 부분들이 커널과 연계되어 있음을 알게 된다. 그러므로 디바이스 드라이버에 대해서 공부가 끝났다면 커널의 40%쯤은 이해 했다고 볼 수도 있겠다. 커널을 공부함에 있어서 구분해야 할것이 있다. 하나는 아키텍쳐 의존적인 부분과 아키텍쳐와 독립적인 부분이 있다. 리눅스는 가급적 아키텍쳐 독립적으로 구성되려고 노력한 흔적이 여기저기 보인다. 그래서 리눅스가 다른 아키텍쳐에 포팅 될수 있었던 것이다. 만약 PC의 i386계열에 의존적인 부분이 매우 많았다면 지금처럼 임베디드용으로 사용되지도 못했을 것이다. 자 커널을 이해하는 방법은 어떤게 좋을까? 어디까지 이해해야 할까? 이에 대한 나의 생각을 풀어 보겠다.
5.3 커널을 이해하기 위한 방법론 및 어디까지?
커널을 이해하기 위해서 가장 좋은 방법은 쏘스에서 흐름을 쭈욱 쫒아가 보는 것이다. 이를 위한 방법은 켈프에서 제안한 숙제중 부팅 메세지를 시리얼로 보내는 방법을 제안한다. 물론 이때 "Uinx kernel 완전분석으로 가는길이라는 책" 을 옆에 끼고 있는 것이 좋을 것이다. 물론 켈프에 조형기님이 진행하고 있는 강좌란도 무척 도움이 될것이다. 너무 완벽하게 쫒아 가려고 하지 않는 것이 좋을 것이다. 이 놈의 리눅스 커널을 쫒아 가는 것에 맛이 들리면 도통 헤어나질 못하게 된다. 필요한 만큼만 쫓아 다니면 된다. 임베디드 리눅스를 구현함에 있어서 대부분은 기존에 이미 포팅되어 있는 아키텍쳐를 이용하게 되는데 이 방법이 의미하는 것은 커널을 완벽하게 이해하기 보다는 커널 쏘스의 어떤 부분에 어떤 기능이 있는가 정도를 파악하는 선이면 된다는 것이다. 필요할때 좀더 자세하게 쏘스를 쫒아 다니면 된다. 또 내가 권유하는 방식은 당신이 필요로 하는 기능은 대부분 다른 사람이 이미 해 놓았을 가능성이 높다는 것이다. 커널에 집중하기 보다는 웹싸이트를 뒤지는 시간이 더 짧을 수 있다. 요즘은 Know Where!! 아닌가....

6. 정말 임베디드 리눅스를 하려면

5항까지 진행된 분이라면 6항 이후에 설명하는 과정을 수행해도 문제가 없을 것이다. 여기서 부터는 보통 일반인들이 말하는 임베디드 시스템용 리눅스를 어떻게 하는가를 설명하는 것이다.
6.1 평가 보드를 구매하라...
만약 당신이 가난한 개발자라면 이 이후에 진행은 포기해 달라.. 왜? 개인이 하기에는 너무도 벅찬 돈이 든다. 그냥 평가 보드만 사서 될일이 아니다. (이것도 정말 비싸다) 물론 평가 보드만 사도 될수 도 있지만 새로운 하드웨어적인 기능을 추가하고 시험하려면 개발 장비가 보통 고가가 아니다. 그냥 개인이 취미로 하기에는 이미 금전적인 부담이 넘어선다. 단 평가보드상에서 만족한다면 평가보드 살 능력이 되야 한다. 평가보드만으로도 꽤 많은 것을 공부 할수 있다. 단 평가보드를 구매할때 JTAG가 지원되는 평가보드를 구매하라 그나마 JTAG를 사용하는 공부는 돈이 적게 든다.
6.2 평가 보드를 구매 했다면....
평가 보드를 보통 구매하면 대부분의 문서가 따라 오게 된다. 물론 사용되는 디바이스의 설명서들이 포함되 있거나 최소한 어디서 구하는지에 대한 설명은 있을 것이다. 이런 자료를 모두 일단 확보할 것
6.3 MCU를 공부하라..
평가 보드에 사용되고 있는 MCU에 대해서 공부해야 한다. MCU를 모르고 임베디드를 도전하는 것은 시간낭비의 지름길이다. MCU의 구조 MCU의 하드웨어 사양 MCU의 프로그램 방법 ( 어셈블러 ) MCU의 동작 방식 뭐 이런 것이 있겠다.
6.4 평가 보드의 회로를 공부해라...
평가 보드의 회로를 읽는 법을 알아야 한다. 회로를 읽지 못하고 임베디드를 공부하려 한다면 진행하는데 한계를 느낄수 있다. 회로를 읽을수 있어야 외부 연결 커넥터에 어떻게 연결하는지를 이해 할수 있다.
6.5 평가 보드에 사용되는 디바이스를 공부해라...
평가 보드에 사용되는 디바이스를 모두 공부할 필요는 없다. 자신이 사용하고자 하는 디바이스에 대해서 하드웨어적으로는 어떻게 연결되고 디바이스를 제어하기 위해서는 소프트웨어 적으로 어떻게 해야 하는 가를 이해 해야 한다. 이런 이해를 위해서는 해당 디바이스에 대한 리퍼런스 매뉴얼의 확보는 필수적이다. 항상 나에 가슴을 아프게 하는 것은 기술된 언어가 영어라는 점이다. 빨리 한글이 전세계 공통어로 되어야 하는데.... 나를 세계 대통령으로 밀어 주면 가장 먼저 한글을 공용어로 하고 모든 표기를 한글로 하는 세계법을 제정하겠다.
6.6 크로스 컴파일 환경을 구축하는 것을 공부하라...
임베디드 리눅스를 공부하는 것에 가장 큰 관문중에 하나가 크로스 컴파일 환경을 구축하는 것이다. 그나마 다행인것은 요즘은 아예 rpm 패케지로도 나온다는 점이다. 그래도 몇몇 cpu에 필요한 환경은 자신이 스스로 구축해야 한다. 또 평가 보드에 따라 구축하는 방법이 조금씩 다를 수 있다. 물론 평가보드에 따라오는 CD에는 일반적으로 크로스 컴파일에 필요한 화일도 따라오므로 좀 괜찮기는 하지만 아예 공부하지 않으면 조금만 문제가 생겨도 속수 무책일수 있다.
6.7 부트 로더를 공부하라.
임베디드 리눅스를 공부하기 위해서 가장 처음 부딪히는 것이 부트 로더다. PC에서는 그 개념이 별로 중요하지 않으므로 이 문제가 별로 대두되지 않지만 임베디드에서는 바로 대두 된다. 보통은 이미 개발된 오픈된 부트 로더를 자신의 시스템에 맞게 바꾸게 된다. 그러므로 부트로더의 쏘스는 어느정도 분석하고 있어야 한다.
6.8 NFS 시스템에 대해서 공부하라...
임베디드 시스템에는 커다란 보조 기억 장치가 없기 때문에 필히 네트워크를 이용한 다른 시스템의 보조 기억 장치를 마운트 사용해야 편리하다. 이를 위해 사용되는 것이 NFS이다. 고로 이에 대한 공부는 해두는 것이 좋다.
6.9 그외 나머지는 어떻게?
커널을 올리고 바꾸고 하는 것은 PC에서 공부했다면 별로 문제가 되지 않는다. 또 대부분 커널은 포팅했다. 단 일반적으로 부딪히는 문제를 늘어 놓는다면 다음과 같다.
6.9.1 MMU가 없다..
보통 PC에서는 MMU가 있으므로 문제가 되지 않지만 임베디드 시스템에서는 MMU가 없는 것이 일반적이다. 왜? 가격이 싸기 때문이다. 그렇다면 어떤 문제가 있을까 바로 이 문제에 대해서 공부해야 한다는 것이다. 50100용을 사용하거나 드래곤볼 을 사용한 임베디드 리눅스의 하우투 문서를 찾아 보고서 공부하는 것이 좋다.
6.9.2 루트 디스크 이미지와 램 디스크
임베디드 리눅스의 거의 대부분이 보조 기억 장치가 없거나 있어도 플래쉬 메모리 이다. 그래서 루트와 마운트 되는 기억 장치로 램 디스크를 많이 사용하게 된다. 문제는 램 디스크용 루트 이미지가 ROM에 있거나 플래쉬 메모리에 저장되기 때문이다. 커널의 루트 이미지 복사는 부분에 대한 공부를 필요로 하는 것이 이 때문이다.
6.9.3 플래쉬 메모리에 대해서 공부 할것
플래쉬 메모리는 하드 디스크 처럼 쓰고 읽을 수 있는 저장 장치이다. 더구나 읽는 속도가 매우 빠르다. 그러나 플래쉬 메모리는 쓰는 횟수에 한계가 있다. 이에 대한 공부를 미리 하지 않으면 당신이 납품한 임베디드 장비에 대해서 고생 할 가능성이 농후하다. 이에 대하여 다른 사람은 어떤 방법론이 있는가에 대하여 미리 공부해 두는 것도 좋을 것이다. 가끔 배신감 느끼게 플래쉬에 대한 몇가지 소프트웨어가 특허에 걸려 있다.
6.9.4 계속 늘어 놓으면 한도 끝도 없을 것 같으므로 ...
정말이다.. 임베디드 리눅스라는 분야는 PC이외에 모두 다 라고 할 정도로 다양하다. 이 모든 것을 미리 공부할수는 없다. 역시 실전에 부딪히면서 배우는 수밖에 ....

7. 빨리 개발하는 방법....

아마도 이 글을 읽고서 벌써 임베디드 리눅스를 공부하고 싶은 마음이 없어지는 사람들의 목소리가 들린다. 음.... 아마도 이글을 읽고 있는 분들 중에는 당장 1달안에 개발을 완료 해야 하는 분들도 있을 것이다. 이에 대한 해답은 아니지만 속성 코스에 대해서 이야기 하려고 한다. 단 이 방법은 엔지니어로써 어느정도 구력이 있는 분에 해당하는 것이지 완전 엔지니어 초짜에 해당되는 것은 아님을 미리 밝힌다.
7.1 이미 개발된 평가 보드를 이용할 것...
자 임베디드 리눅스를 이용한 시스템을 만든다는 것은 자신이 목적으로 하는 동작이 정확하게 수행되면 된다. 그러므로 구현하고자 하는 장비와 최대한 같은 기능을 담고 있는 평가보드(개발보드) 를 구한다. 이 평가 보드에는 리눅스가 모두 설치 되어 있어야 한다. 그리고 캐랙터 디바이스의 가장 최소한에 대한 공부만 한다. 이것 마저도 안한다면 어쩔수 없다. 그리고 평가보드의 회로를 최대한 그대로 수용한 목적 시스템을 만든다. 이런 상태라면 다음과 같은 할일만 남는다.

1. 부트로더에서 초기화와 커널 부팅을 수행하는 부분만 남겨 놓고 제거한다.
2. 커널을 그대로 사용한다.
3. 대부분의 디바이스 드라이버도 그냥 사용한다.
4. 추가된 디바이스의 드라이버만 작성한다.
5. 어플리케이션을 작성한다.

이것이 끝이다.

8. 내가 하고 싶은 말은 ...

내가 제안한 초짜가 임베디드 리눅스로 가는 길이 맞다고는 할수 없다.

아직도 나는 초짜이므로

하지만 기존에 개발하는 과정을 지켜본 나로써 내린 것은 위와 같은 것이다. 누군가 말했다. 임베디드 리눅스의 세계에 발을 들여 놓는 순간은 태산을 삽질해서 없에는 것과 같다는 것을 하지만 내가 해본 결과로는 임베디드 리눅스를 한다는 것은 리눅스의 본질을 파악하는 것과 거의 일맥 상통한다. 엔지니어라면 한번쯤 도전해서 이루고 싶은 영역이다. 또 생각보다 재미 있다. 당신도 해보라... 겁만 먹지 말고 천천히 가다보면 언젠가 이미 득도한 해커와 같은 반석위에 있는 자신을 발견 할 수 있을 지도 모른다. 어느날 저녁 새벽 3시쯤 근방에 이글을 마무리 하며..... PS: 배고프다.... 그리고 졸립다....

리눅스디바이스드라이버

USB 디바이스드라이버

디바이스드라이버실습

출처:한국전자통신연구원 : ETRI

1249204875_05디바이스드라이버.pdf

<Enterprise>

■ 엔터프라이즈의 정의

<공동의 목표를 추구하기 위하여 기술의 지원 하에 정의된 절차를 수행하는 조직의 집합체 >

Zachman : 공통의 미션이나 목표를 지원하는 모든 통합된 비즈니스기능과 자산들의 집합

Spewak : 고객과 상품 및 서비스가 존재하며 이를 유지하고 지원하기 위한 내부 프로세스가 정립된 최소한의 단위

TOGAF(The Open Group Architecture Framework) : 공통의 목표를 가진 조직의 집합체

■ 엔터프라이즈의 의미

엔터프라이즈는 제품 및 서비스를 제공하기 위한 모든 비즈니스 활동을 포함해야 합니다.

따라서 엔터프라이즈의 구분은 비즈니스 단위나 사업부, 자회사 등으로 나누는 것이 적절하며, 부서(예:인사, 재무, 마케팅) 등의 조직을 단위로 구분하는 것은 적절치 못합니다.

하나의 기업 내에서 고객 층이 다르거나 다른 성격의 제품 / 서비스를 제공하는 글로벌 기업이나, 반대로 각 사의 핵심역량을 기반으로 다수의 기업이 공동으로 제품이나 서비스를 제공하는 경우, 엔터프라이즈의 범위를 단순히 하나의 기업으로 정의해서는 안됩니다,

즉 엔터프라이즈의 범위를 정의할 때는 엔터프라이즈의 계층과 e-비즈니스 환경을 고려하여 정의하여야 한다.

<아키텍쳐>

아키텍쳐 : 많은 사람들이 정의 하려고 애쓰는 용어이나 공통적인 요소 두가지

- 하나의 시스템을 여러부분으로 분리하는 가장 높은 수준의 분해

- 변경하기 어려움

프로그램 혹은 컴퓨팅 시스템의 소프트웨어 아키텍처란, 소프트웨어 컴포넌트, 이들 컴포넌트의 가시적인 속성, 그리고 컴포넌트 사이에 관계로 구성된 시스템의 전체적인 구조를 말한다. - Bass, Clements, Kazman, 1998 “Software Architecture in Practice”에서 발췌

소프트웨어 아키텍처는 한마디로 개발하려고 하는 소프트웨어의 큰 밑그림을 그리는 것으로 소프트웨어 개발에 직간접적으로 영향을 미치면서 복잡도를 높이는 다양한 요소들을 체계적으로 다루기 위한 청사진이라 할 수 있다.

소 프트웨어 아키텍처의 학술적인 정의는 소프트웨어를 구성하는 컴포넌트들, 이들간의 상호작용 및 관계, 각 컴포넌트(구성요소, 부품)들의 특성 및 이들이 구성하는 소프트웨어의 설계 및 진화를 위한 각종 원칙들의 집합이라고 할 수 있다.

실제적으로 아키텍처는 대상이 되는 시스템에 관련된 여러 이해관계자(stakeholder)의 관심사항과 이에 따른 관점을 반영한 다양한 모델들의 집합이 된다. - 한국정보통신기술협회, 2004 “소프트웨어 아키텍처 연구 분야 및 IEEE 1471 국제표준” 에서 발췌

<디자인패턴>

- 패턴들은 시작점을 제공하는 데 도움을 주기 위해 작성된 것
- 모든 패턴은 불완전하며 이것을 완성하는 책임과 즐거움은 모두 여러분의 몫이라는 점을 항상 기억바람

> 패턴(Pattern)
어떤 작업을 할 때 같은 유형의 형태를 계속 적으로 반복하여 사용하게 되는데 이렇게 같은 형태를 반복적으로 사용하는 것을 어떤 작업에 대한 패턴이라 한다. 프로그램에도 이 같은 패턴이 적용 된다. 최근의 경향인 프레임워크(framework)의 설계를 위해서 또 융통성 있고 재사용성을 가진 소프트웨어 시스템의 개발을 위해서는 지금까지 제안된 다양한 설계 패턴을 활용할 필요가 있습니다. 범용적으로 제안된 23개의 Design Pattern이 있다.

> 생성 패턴 (Creational Pattern) - 5개

Abstract Factory, Builder, Factory Method, Prototype, Singleton
최 근의 객체지향 애플리케이션의 경우 적용 분야나 대상에 따라서 새로운 객체를 생성하고 이로부터 새로운 인스턴스들을 생성해야 새로운 애프리케이션을 손쉽게 개발 할 수 있다.Creational Pattern은 인스턴스화 과정을 추상화하여 시스템이 객체의 생성과 조합 및 객체 표현 방법에 독립적으로 개발할 수 있도록 지원한다. 클래스 Creational Pattern은 인스턴스화될 클래스를 다양화 하기 위해서 상속(inheritance)을 활용해야 한다.

> 구조적 패턴 (Structural Pattern) - 7개
Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy

Structural Pattern은 객체와 클래스가 하나의 복잡한 구조를 어떻게 형성하는 가의 방법에 관한 패턴이다. 구조적 클래스 패턴은 interface나 implementation을 합성하기 위해서 상속(inheritance)을 사용한다. 객체의 구성이나 interface를 합성하기 보다는 Structural Pattern을 이용하여 새로운 기능성을 실현하는 복합 객체(Complex Object)를 작성할 수 있는 방법이 더 효과적이다.

> 행위적 패턴 (Behavioral Pattern) - 11개
Chain of Responsilbility, Command, Interpreter, Iterator, Mediator, ... 등

Behavioral Pattern은 객체들간에 행위의 할당이나 알고리즘과 관련된 패턴이다. 최근의 소프트웨어들은 응용 분야에 따라 행위가 다른 객체로 옮겨 가거나 알고리즘이 대체되는 경우가 존재하게 마련이다. 이러한 변화의 개념을 잘 만족할 수 있는 것이 Behavioral Pattern이다. Behavioral Pattern은 객체나 클래스에 대한 패턴을 정의하는 것이 아니라 그들간의 교류 방법에 대하여 정의하는 것이다. 이러한 패턴은 실행시에 수행하기 어려운 제어 구조를 정의할 수 있다. 클래스간의 행위적 차이를 정의하기 위해서 상속(inheritance)을 사용할 수도 있지만 이보다는 객체 합성을 사용하여 처리한다

출처 : http://2005elc.elancer.co.kr/eTimes/page/eTimes_printFm.html?str=c2VsdW5vPTg0Ng==

1.아키텍쳐 서술의 추천 프랙티스 2005/12/13


 IT시스템에 대한 요구의 다양화, 아키텍쳐의 대규모화와 복잡화에 대응하기 위해서는 현실 세계나 시스템화 대상을 다양한 각도로 표현하는 방법이 필요하다. 이번엔 Zachman 체제나 UML의 각종 다이어그램 등에도 볼 수 있는 시스템 표현의 체계화 기반기술의 하나인「뷰포인트」를 취급한다.

 뷰포인트는 시스템 표현 모델의 적절한 이용 문맥을 정의하는 시점이라고 할 수 있다. 이것은 IT시스템의 stakeholder(이해관계자)에 대해서 적절한 문맥으로 시스템 표현을 실시하기 위해서 필요한, 시스템 표현 모델 체계화의 골조를 정의한다.

 아키텍트가 UML을 이용해 시스템 구축을 하는 경우,「어느 UML 다이어그램을 어느 순서로 정의해 나가야 할까」를 결정하는 골조가 개발 방법론이다. 아키텍트는 경험 원칙이나 채용하는 개발 방법론에서 정해진 순서에 따른다. 뷰포인트는 이러한 경험 원칙이나 프랙티스에 따르는 부분을 가능한 한 명확하게 정의된 골조를 준비해, 소프트웨어 개발에 공학적 어프로치를 적용해 나가려는 컨셉이있다.

아키텍쳐 서술의 추천 프랙티스

 소프트웨어 아키텍쳐에는 다양한 정의가 존재한다. 그 이유는 아키텍쳐를 표현하는 방법이 한개로는 정해지지 않기 때문이다. 아키텍쳐 자체가 복수의 각도에서 표현을 조합하지 않으면 엄밀한 정의를 할 수 없는 이유때문이다.

 건축물을 설계하는 경우, 통상 3 방향에서 본 시점에서의 도면이 필요하다. 또, 상세한 구조도, 배수관이나 전기 배선도, 소재나 부품표 등 많은 부대적인 도면도 필요하다. 시각적으로 뛰어난 관점에서는, 입체적인 3 차원 도면도 있으면 더욱 좋을 것이다. 이와 같이 완성해야 할 물리적인 건축물은 한개여도, 그것을 적절히 표현하기 위한 도면은 한개가 아니다.

 그러면 어떤 도형을 사용할지, 복수의 도형을 어떻게 조합할지를 명확하게 규정하려면 어떻게 해야 할까. 각각의 도형은 그 도형으로 표현하고 싶은 관심사로 한정하고 다른 관심사는 무시하면 된다. 예를 들면, 지하철 노선도는 지하철의 경로만을 취급하고 지상에 존재하는 도로나 건물의 정보를 취급하지 않는다. 이것은 일종의 관심 분리이다.

 같은 아키텍쳐의 표현에서도 구조를 취급하는 표현, 행동을 취급하는 표현, 배치를 취급하는 표현등이 존재한다. 이러한 관심을 분리 해서 각각의 관심에서 적절한 다이어그램을 적용할 것이 요구된다. 그것을 위해서 UML에서는 많은 다이어그램이 준비되어, Zachman 체제에서 많은 관심을 체계화하는 골조가 정해져 있다.

 이러한 기술 배경에 따라 관심 분리의 원칙과 stakeholder의 시점을 고려해 아키텍쳐 서술을 정의하고 있는 것이, IEEE std 1471-2000아키텍쳐 서술의 추천 프랙티스이다.

●IEEE std 1471-2000아키텍쳐 서술의 개념 모델

 그러면 우선 이 IEEE std 1471-2000의 아키텍쳐 서술을 보자.

그림 1 IEEE std 1471-2000의 아키텍쳐 서술의 개념 모델
모델도로 기록되고 있는 키 컨셉(Stakeholder나 Concern등)의 의미에 대해서는 이후에 게재하는 표 1을 참조해 주었으면 한다. 이 개념 모델을 간단하게 설명하면 다음과 같이 된다.
Stakeholder(이해관계자)의 Concern(관심)의 표현은, 그것을 표현하는 Model(모델) 정의를 규정하는 Viewpoint(뷰포인트)를 선택해 실시한다. 즉,
1. Stakeholder(이해관계자)는 1개이상의 Concern(관심)을 가지고 그러한 Concern을 표현하기 위한 Viewpoint(뷰포인트)를 선택한다.
2. Viewpoint의 선택은 Concern을 표현하는 Model(모델) 정의의 규정을 부여할지 말지를 판단해서 결정한다. 이 Viewpoint는 Concern의 표현에 적절한 관심 분리를 부여하는 Library Viewpoint(라이브러리화 된 뷰포인트)에서선택한다. 복수의 Mission(목적)을 가진 Environment(제약 조건)를 가지는 System(시스템화 대상)에 대한 Architecture(아키텍쳐)를 구축한다. 구축되는 Architecture는 Architecture Description(아키텍쳐 서술)로 정의된다. 아키텍쳐의 정의에는 정의 한 아키텍트가 설명 책임을 가진 Rationale(이유 부여)을 수반한다. 여기서,
3. 아키텍쳐(Architecture)는 복수의 Model를 사용한 View(뷰)로서 표현된다.
4. 게다가 복수의 View로 아키텍쳐가 기술되어(Architectural Description), Model 정의의 규정을 부여하는 Viewpoint에 의해서 View는 관심 분리의 원칙에 따른다.
5. Viewpoint에 의한 관심의 분리는 Stakeholder의 다차원적인 요구에 골조를 부여한다.
Software Factories는 이 일련의 Viewpoint 골조를 개발 기반기술에 적용하고 있다.

 그림 1은 IEEE std 1471-2000의 아키텍쳐 서술의 개념 모델을 정의하고 있다.

 이 그림에서는 키 컨셉과 그 관계를 메타 모델 표현으로서 정의하고 있다. 이 모델 자체는 어느 시스템이 단일 아키텍쳐로 구축되는지, 한 아키텍쳐가 단일 아키텍쳐 서술로 정의되는 지도 가정하고 있지 않다. 즉 시스템이 복수 아키텍쳐, 예를 들면 파이프라인과 이벤트 드리븐 아키텍쳐로 구축되어도, 각각의 아키텍쳐의 기술법을 통일해야 하는 강제력을 가지지 않는다.

 그림 1의 키 컨셉을 정리한 것이 다음의 표 1이다.

키 컨셉의미
Stakeholder:
이해관계자
시스템의 아키텍쳐의 이해관계자 .예를 들면 아키텍트, 프로그래머, 시스템 운용자, 데이타베이스 관리자, 최종 사용자, 경영자, 프로젝트 매니저, 비즈니스 분석자 등. 각각 다른 관심을 가지고 있어, 서로의 요구에 모순이나 부정합이 존재한다
Concern:
관심
기능 요구와 비기능 요구, 정적인 구조와 동적인 동작, 개념/논리/물리 레벨의 관점, 표시와 정보, 시큐러티나 성능, 서비스 내용과 서비스 배치 등, 개발과 관계되는 요소, 조건을 분할해 고려하는 경우의 스코프
Viewpoint:
뷰포인트
뷰를 기술, 분석하기 위한 모델(뷰포인트 언어)과 모델에 적용하는 모델링 수법, 분석 수법등의 규정. 아키텍쳐 서술에서는 1개이상의 뷰포인트을 선택한다
View:
(복수의) stakeholder의 (복수의) 관심에서 본 시스템 전체의 표현. 1개이상의 모델로 표현된다
Model:
모델
기법. 예를 들면 UML 다이어그램, DSL등의 표현. 1개이상의 뷰에 속하는 것도 있다
표 1 IEEE std 1471-2000의 키 컨셉(발췌)

 예를 들면, Web 어플리케이션에서 구축되는 서적 구입 사이트는 아키텍트의 관심으로서, Web 서버상의 UI프로세스, Web 페이지 레이아웃 정의, 비즈니스 논리의 컴퍼넌트 구조, 비즈니스 논리의 오브젝트의 순서(동작), 컴퍼넌트 배치, 데이터 액세스층, 데이타베이스의 테이블 정의등에서 구축된다.

 이 경우에는 UI프로세스등이 모델로, 이러한 모델을 모아 아키텍쳐가 서술된다. 모델은 복수의 stakeholder의 관심의 표현과 관계된다. 여기서의 컴퍼넌트 배치 모델은 아키텍트의 관심 모델로서 뿐만이 아니라 시스템 운용자의 관심 모델로서도 이용된다.

stakeholder에 의한 관심 분리

 여기서 좀 더 stakeholder의 관심의 표현을 보고 가자. 그림 2는 stakeholder에 의한 관심 분리의 예이다. 이 그림에서는 각각의 stakeholder의 역할에 따라서 필요로 하는 아키텍쳐 서술의 표현법이 다른 것을 나타내고 있다.

그림 2 stakeholder에 의한 관심의 분리
stakeholder의 역할에 따라 관심이 다르기 때문에 그 관심을 표현하는 모델도 다르다. 이 예에서는 비즈니스 분석자의 관심인 비즈니스 요구를 개념 레벨의 유스 케이스 모델로 표현한다. 같이 프로그래머는 구현해야 할 코드의 논리 모델을 구현에 활용한다. 데이타베이스 관리자는 관리 대상 데이타베이스의 데이터 모델로부터 데이터 구조를 파악한다.

 아래와 같이 stakeholder의 관심은 다양한 관점으로 분류할 수 있다.

(1) 관심을「정적 구조와 동적 행동」으로 분류하면 정적 구조에서는 아키텍트의 관심을 표현하는 비즈니스 논리의 컴퍼넌트 구조나, 시스템 운용자의 관심을 표현하는 컴퍼넌트 배치가 포함된다. 또, 동적 동작에는 아키텍트의 관심을 표현하는 비즈니스 논리의 오브젝트 순서도나, 시스템 운용자의 관심을 표현하는 메세지 제휴가 포함된다.

(2) 관심을「정보 도메인」으로 분류하면 아키텍트의 관심을 표현하는 데이타베이스 테이블 정의나, 비즈니스 분석자의 관심을 표현하는 정보 엔티티이다.

(3) 관심을「논리 레벨과 물리 레벨」로 분류하면 논리 레벨에는 아키텍트의 관심을 표현하는 비즈니스 논리의 컴퍼넌트 구조가 포함되고, 물리 레벨에는 데이타베이스 관리자의 관심을 표현하는 데이타베이스 정의가 포함된다.

 이것들 3 종류의 관심의 분류법은 각각

(1) UML 다이어그램의 정적/동적 모델(=정적 구조와 동적 동작)

(2) EA(Enterprise Architecture)의 비즈니스/정보/어플리케이션/기반구조(=정보 도메인)

(3) 개발 라이프 사이클의 개념/논리/물리 레벨

로 관심을 분류해 stakeholder의 관심 모델을 선택해서 표현하는 예이다.

 관심 분류법을 이정도로 한정하지 말고 아키텍쳐 서술에 적절한 관심을, 적절한 분류법을 기준으로해서 선택하면 좋겠다*1. 이 분류법은 아키텍쳐 서술에 필요한 모델의 편성을 규정하는 뷰포인트가 결정한다.

*1 예를 들면, Philippe Kruchten씨의 “4+1” 뷰 모델( 「The 4+1 View Model of Architecture」, IEEE Software, vol. 12, No. 6, November 1995, pp. 42-50이나 ISO/IEC 10746-2의 「Reference Model for Open Distributed Processing」(RM-ODP)은 다른 분류법을 정의하고 있다.

Plot Graphic Library

By Jonathan de Halleux

A library to plot data (lines, maps...) in MFC projects.

start sending you newsletters again.

Snapshot

Description

PGL is a library that encapsulates plot capabilities in a MFC project for VC6 and VC7. It is designed to be able to easily plot data generated in a project without the need of any external software. In fact, with CView and CDialog derived classes, you can have your app display chart in 5 minutes.

The aim of PGL is not to have a user-friendly environment but rather being able to generate any plot from the source code.

PGL was originally using OpenGL to raster graphics but now it uses GDI+ (so you need to install Microsoft SDK to compile PGL).

Licensing

The source available on CodeProject is licensed under LGPL. However, the next releases are not free anymore (Ooops, sorry). You can check the latest development at PGL Home Page. Anyway, enjoy beautiful charting.

Features

  • line strip, fully customisable:
    • color (RGBA),
    • line dashing,
    • point type (circle, box, triangle, etc...)
    • line width,
    • filled,
    • line shadow,
    • multiple line strip,
    • etc...
  • line strip with level of detail capabilities (based on Douglas-Peukler line simplification algorithm),
  • Vector map,
  • Height map,
  • Text,
    • variable scale,
    • multiple fonts,
    • orientable,
  • Unlimited sub-plotting,
  • Automatic axis,
  • Time labelling,
  • Export to EPS, SVG, JPEG, TIFF, PNG,
  • CView derived class for fast integration in existing project,
  • CDialog derived class, etc...

UML

A UML diagram is available in pdf here. It is not complete but it should help you in understanding the library.

Installation

Here are the installation steps to use PGL in one of your projects:
  1. Install GDI+ (part of Microsoft SDK).
  2. Download Gdiplus.dll and make sure it is in the path,
  3. Recompile the source, it will build .lib in the lib directory and the .dll in the bin directory
  4. Add the directory with PGL binaries to your path. (by default it is C:\Program Files\PGL\bin)
  5. Add the include directory and lib directory to Visual C++ include/lib directories.
  6. Make sure the headers are available

That's it!

Getting your project started

  1. Add the following in your StdAfx.h file :
    Collapse Copy Code
    #include "PGL.h"
  2. Since PGL is using GDI+, you must initialize it :
    • Add the following variable to your CWinApp derived class
      Collapse Copy Code
      ULONG_PTR m_ulGdiplusToken;
    • Add the following to the CWinApp::OnInitInstance function to initialize GDI+
      Collapse Copy Code
      // initialize <code>GDI+ (gdi+ is in Gdiplus namespace)Gdiplus::GdiplusStartupInput gdiplusStartupInput;Gdiplus::GdiplusStartup(&m_ulGdiplusToken, &gdiplusStartupInput,                         NULL);
    • Add the following to the CWinApp::OnExitInstance function to clean up GDI+.
      Collapse Copy Code
      // shutdown GDI+Gdiplus::GdiplusShutdown(m_ulGdiplusToken);

Your project should work fine now.

Examples

All these examples are accessible in the source. See the example menu of TestPGL.

Example 1 : Drawing a simple line

This is a first explanatory example. We suppose that the points (x,y) of the line have been generated and are stored in two array pX,pY of size nPoints ( note that you can also pass data as std::vector<double> to PGL).

Snapshot

Here's the code I used to generate the data: a simple sinusoid. Note that the y are in [-1.1, 1.1] but PGL will handle axe labelling the have nice units.

Collapse Copy Code
// generate dataint nPoints = 50;double* pX=new double[nPoints];double* pY=new double[nPoints];for (UINT i=0;i< nPoints;i++){	pX[i]=i;	pY[i]=sin(i/(double)nPoints*2*3.14)*1.1;}
  1. First, create a graph object:
    Collapse Copy Code
    CPGLGraph* pGraph = new CPGLGraph;
    Note that you can check all PGL object with ASSERT_VALID since they all inherit from CObject.
  2. Create a 2D line:
    Collapse Copy Code
    CPGLLine2D* pLine = new CPGLLine2D;
  3. Attach the data to the line. PGL will handle the memory afterwards. That is, it will delete the pointers of data at the object destruction. This means pX,pY MUST have been allocated on the heap !
    Collapse Copy Code
    pLine->SetDatas( nPoints /* number of points */,                    pX /* x(i) */, pY /* y(i) */);
  4. (Optional)Change some properties of the line: pLine->SetLineWidth(2);
  5. Add the line to the graph (note that an object can be added to only one graph):
    Collapse Copy Code
    pGraph->AddObject(pLine);
  6. Make PGL scale the plot (automatically)
    Collapse Copy Code
    pGraph->ZoomAll();
  7. Create a dialog box and display the plot:
    Collapse Copy Code
    CPGLGraphBitDlg graphdlg(this, pGraph);graphdlg.DoModal();
You should have the same as the image above. Note that this image (PNG) has been generated by PGL.

Example 2 : Adding a line with level of detail control

You may have to plot line with thousands of points. This can become very heavy and especially if you export it to EPS, the files can become very large. To overcome this problem, you can use a line with LOD included in PGL.

Snapshot

In this examples, we approximate the previous line. Starting from the previous example,
  1. Change the line of code
    Collapse Copy Code
    CPGLLine2D* pLine = new CPGLLine2D;
    to
    Collapse Copy Code
    CPGLLine2DLOD* pLine = new CPGLLine2DLOD;
  2. Change tolerance of level of detail
    Collapse Copy Code
    pLine->SetTol(0.05);
  3. Shrink the number of points by a desired compression ratio (here to 10% with 2% threshold)
    Collapse Copy Code
    pLine->ShrinkNorm(0.1,0.02);
On the figure above, you can see the original line and the approximated one. You can gain a serious amount of points using this technique!

Example 3: Customizing axis, labeling, etc...

As you can see in the previous image, all the parameters of the objects are changeable in the code. In this example, we shall
  • change the title text,
  • turn off horizontal grid,
  • show right label,
  • change number of ticks on the top axis,
  • switch to time labelling for the x-axis,
  • and more...

Snapshot

We start from the second example and add the following line of code before calling ZoomAll().
  1. Get a pointer the axis object (there a huge mistake of English but in French it's ok :)(axe -> axis))
    Collapse Copy Code
    CPGLAxe2D* pAxis = pGraph-&gtGetAxe();
  2. Change the title text and color
    Collapse Copy Code
    pAxis->SetTitle(str);
    or
    Collapse Copy Code
    pAxis->GetTitle()->SetString(str);
    Collapse Copy Code
    pAxis->GetTitle()->SetColor(0 /* red */,0.5f /* green */,                            0 /* blue*/ /* alpha optional */);
  3. Turn off vertical grid, (vertical -> 0, horizontal -> 1)
    Collapse Copy Code
    pAxis->SetShowGrid(1,FALSE);
  4. Show and change right label,
    Collapse Copy Code
    pAxis->GetRightLabel()-&gtShow(TRUE);pAxis->GetRightLabel()-&gtSetString("This is the right label");
  5. Show right numbering
    Collapse Copy Code
    pAxis->GetRightNumber()->Show();
  6. Changing number of ticks on the top axis,
    Collapse Copy Code
    pAxis->SetTopSecondTicksNb(5);
  7. Switch to time labelling the x-axis,
    Collapse Copy Code
    // enable time labellingpAxis->SetTimeLabel(TRUE);// set origin, time step and format (see COleDateTime.Format for details)pAxis->SetTimeLabelFormat(COleDateTime::GetCurrentTime()                                 /* Time at zero. */, 			COleDateTimeSpan(0,0,30,0) /* Time per unit */,			"%H:%M:%S" /* String format */);
I've also disabled the line drawing and set the tolerance to 0.025 for the LOD line. Of course, you can do much more. This is just an example.

Example 4: Sub-plotting !

What about putting multiple plots on a figure: that's possible in PGL in many ways. In fact you can add plots to plots, and so on.

Snapshot

The class CPGLGraph is inherited from a generic plot class : CPGLRegion. You can either
  • use the function Divide(m,n) to divide the region in an array of m rows and n columns (Note that this method erase all object in the region). After that, you can access the elements with GetChilds(i) (the regions are created row by row). You can get the number of children with GetNChilds():
    Collapse Copy Code
    // allocated somewhereCPGLRegion* pRegion;// dividingpRegion->Divide(m,n);// accessing region at row 2 and column 1 (zero based index)CPGLRegion* pChildRegion = pRegion->GetChild(2*n+1);
  • Create an add directly a region using AddRegion. To use this method you must SetNormBBox(...) to set the bounding box (in Normalized coordinates with respect to the parent region)
    Collapse Copy Code
    CPGLRegion* pChildRegion = pRegion->AddRegion();pChildRegion->SetNormBBox(0.1 /* llx */ , 0.2 /* lly */ ,                           0.7 /* urx */ , 0.8 /* ury */);
Of course, you can divide child regions and so on.

Example 5: Changing properties of objects at runtime

You can explore the object hierarchy by right clicking the view or dialog. Unfortunately, serialization is not working yet. So it is lost work...

Snapshot

Reference

The d0cumentation is generated with Doxygen and Doxygen studio. See Plot Graphic Library.dow file. Otherwize, it is shipped with the Microsoft Installer.

Download

You can download the Microsoft installer at the PGL Home Page

Compiling the sources

The sources of PGL are provided. Open the workspace

  • "Plot Graphic Library.dsw" for VC6 users
  • "Plot Graphic LibraryNET.dsw" for VC7 users

It contains 6 projects :

  • AlgoTools. Collection of Algorithmic classes. This project contains the algorithm for line approximation.
  • IGfx. Graphic library used by PGL. Multi-layer graphic interface to export in multiple graphic format such as EPS or SVG.
  • IGfxTest. Test project for IGfx.
  • OGLTools. A useful library to handle OpenGL with Windows. Not used anymore but useful anyway.
  • PGL. The graphic library.
  • Testpgl. An demo application.
Compile the sources. The .lib will be located in the lib directory, and dlls in bin directory.

History

  • 6-11-2002 Added VC7 build, fixed some stuff and updated DPHull.
  • 15 July 2002: Fixed ressource missing, change CP_THREAD_ACP to CP_ASP, fixed, export bug and text strip bug.
  • 5 June 2002 Updated downloads
  • 29 March 2002 Big Update !
  • 8 November 2001 Initial release.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Jonathan de Halleux


Member
Jonathan de Halleux is Civil Engineer in Applied Mathematics. He finished his PhD in 2004 in the rainy country of Belgium. After 2 years in the Common Language Runtime (i.e. .net), he is now working at Microsoft Research on Pex (http://research.microsoft.com/pex).

Occupation: Engineer
Location: United States United States


한동안 eclipse에서 PyDev를 사용했었는데 dynamic language의 특성상 suggestion을 정말 잘 못해서 다시 UltraEdit으로 돌아왔다.

단축키로 프로그램을 실행하기 위해서는

Advanced -> Tool Configuration 에서

여기에서 %modify% 를 넣으면 입력 파라미터를 물어보고,
생략하면 물어보지 않게 된다.



Syntax Highlighting은

Advanced -> Configuration 에서

Language 14 정도 빈 것을 선택하고

밑에 wordlist 파일을 Open 한다.


열린 파일의 제일 뒤에 syntax 를 붙여야 한다.

suntax는 http://www.ultraedit.com/downloads/extras.html 에서 받는다.

현재는 2.5까지 있으므로 할수 없이 Python 2.5를 클릭하면 텍스트 파일이 열린다.

전체를 copy & paste로 붙여 넣는다.


저장하고 나면 syntax highliting이 되는 것을 알 수 있다.


'파이썬 프로그래밍' 카테고리의 다른 글

Tkinter로 생각하기  (0) 2011.04.24
TKINTER 요약  (0) 2011.04.24
파이썬 데몬 만들기  (0) 2009.04.07
파이썬으로 재귀하향 파서 만들기(2)  (0) 2009.03.02
파이썬으로 재귀하향 파서 만들기(1)  (0) 2009.03.02

파이썬 (python) Ultraedit syntax highlighting

1246152732_UE_python2.txt

LUA[강좌] C,C++ 을 아는사람을 위한. 루아의 시작..|

"루아를 이용한 민첩하고 효과적인 게임 개발" - 류광 역 - 서적을 통해 학습한 내용을 복습 및 지식공유를 위해 작성합니다.

루아는 포르투갈어로 을 뜻한다.

스크립트에 대한 정의라던지 약관을 늘여놓은듯한 글은 생략한다...

1.루아 콘솔 프로그램

-첨부파일에 루아 콘솔 프로그램이 있다. (LuaConsole.exe)

- 간단한 코드 및 한줄로 실험해 볼만한것이라면 콘솔을 이용하면 된다.

sample code1

for indx=1,4 do print("line: ", indx) end

sample code2

for indx=1,4 do

print("line: ", indx)

end

청크(chunk)란!? : 루아에서는 하나의 명령 또는 일련의 명령들(스크립트 파일 전체 등)을 칭함.

잘 모르겠지만.. 청크라는 용어를 앞으로 많이 쓰일 모양입니다.

2. 주석처리..

- c 에서는 // , /* */ 두가지 방법을 사용하지요..

- 루아에서는 -- , --[[ --]] 두가지 방법을 사용합니다.

--[[ --]] 이녀석들... 마음에 안드는군요 -_-; --[[ ]]-- 이게 좀 더 그럴싸 했을텐데..

=> 류광님께서 글을 쓰셨더군요 ^^

제가 말한 --[[ ]]-- 이게 좀 더 그럴싸 했을텐데.. 라는 표현은,

대칭된 모습이 이쁘지 않을까? 라는 조크인데 오해를 샀네요 ㅎㅎ

08.10.8 - 문득 생각나서 적어봄..

3. lua 파일을 만들어 실행해보자!!

helloworld.lua 파일 작성

-- disc : hello world

myString = "Hello World"

print(myString)

※메모장으로 하면 안된다는 말을 얼핏 줏어들은것 같습니다.

울트라에디터, vc, 에디터플러스 등으로 하면 될겁니다.


드디어 헬로우월드를 마스터 했군요 :)

4. 자료형

- 루아는.. 플래시의 스크립트와 비슷하다. 정해놓고 쓰는 자료형이 없다.

즉, int iNum = 3; 이 아닌 iNum = 3 이라 하면 된다..

그렇지만, iNum = "삼이다" 이와같이 자료형 자체가 변할 수 있다..

- nil, bool, 문자열, 수치, 테이블 이와 같은 종류가 존재한다.

- type() 함수를 통하여 그래도 정체를 좀 알 수 있다니.. 다행이군요..

5. nil 과 local

- nil 과 local 이라는 특이한 녀석들이 있다..

- nil : 일종의 null 이라 생각하면 간단할것 같다..

Value = nil -- 변수를 삭제한다!? 삭제란 존재 자체가 지워지는가에 대해서는 잘 모르겠다..

- local : 지역 변수를 선언할때 사용

우선 루아는 기본적으로 모두 전역변수이다.

지역변수로 사용하기 위해서는 local 을 사용해야 한다

sample code 1

function Sample()

myDat_1 -- 전역변수가 된다..

local myDat_2 -- Sample 함수가 끝날때 소멸된다

end

sample code 2 ( 아래 for 문에 자세한 원리를 설명한다 )

function Sample(recvDat) -- recvDat 는 자동으로 지역변수가 된다. local 을 붙여줄 경우 오히려 에러를 낸다.

for local i = 1, 10 do-- 오류 for 문에 쓰이는 변수는 자동으로 지역변수가 된답니다... 일관성이 조금 부족하군요

end

6. 테이블

- ex) myTable = { 1, 2, 3, 4, 5 } myTable[1] 은 1입니다... c 의 배열과는 종이 한장 차이군요

myTable[6] = 6 이와 같이 컨테이너의가변 성향을 갖고 있군요

- 테이블은 일종의 포인터이다. 진짜 정체를 가르키는 포인터라 생각하면 된다.

그러므로 테이블간의 비교연산 등을 할 수 없다.

sample code)

tableA = [1, 2, 3]

tableB = [1, 2, 3]

if tableA == tableB then

print( " 같다 " )

else

print( " 틀리다 " )

eld

결과는 '틀리다'tableA 와 tableB 가 갖는 포인터는 다르기 때문이다.

- 배열을 사용하는 방식처럼 for 문 등을 돌려 비교해야 하는가 봅니다

7. 논리 연산자

- 일반적으로 우린 && || 두가지를 사용 하곤 하지요

- 그 뜻 또한 잘 아시다시피 그리고 와 또는 입니다.

- 책에서는 괜히 복잡하게 설명했다 생각되는군요.. 바로 예제 들어갑니다.

--------------------------------------------------------------------------------

sample code1

a = 5

b = 10

c = 20

if ( a < 10 ) and ( b < 20 ) then

print ( "true" ) ;

else

print ( "false" ) ;

end

위의 코드는 결과적으로 true 입니다.

c 코드로 표현을 해볼까요~

if ( a < 10 && b < 20 )

{

// .....

}

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

sample code2

if ( a < 10 )or ( b <1 ) then

print ( "true" ) ;

else

print ( "false" ) ;

end

위의 코드에서 a < 10 는 참입니다. 그렇지만 b < 1 은 거짓입니다. 결과는 true 입니다.

우리가 알다시피 or 연산자로 인해 1 0 = 1 이 되는군요~

c 코드로 표현을 해볼까요~

if ( a < 10 || b <1 )

{

// .....

}

--------------------------------------------------------------------------------

- not 연산자

이것 역시 책에서는 알송달송한 설명이다... 바로 c 코드로 확인해 보자.

if ( 0 ) // 이것은 0 이므로 if 문 안에 들어가지 않을것이다..

{

}

if ( 100 ) //if 문의 동작 원리는 아시다시피 0 이 아니면 들어가는 것이다.

{

}

그렇다면 not 은 무엇인가!?

if ( ! 100 )// 0은 1로 변하게 되고 0 이 아닌것은 0 이 되버린다... 그러므로 ! 1000 이 된다.

{

}

c 코드에서의 자주 쓰이는 방법이다.

#define FALSE 0

#define TRUE 1

static bool bFlg= FALSE ;

bFlg != bFlg ; // 결과는 FALSE -> TRUE 가 된다.

bFlg != bFlg ; // 결과는 TRUE-> FALSE가 된다.

bFlg != bFlg ; // 결과는 FALSE -> TRUE 가 된다.

bFlg != bFlg ; // 결과는 TRUE-> FALSE가 된다.

if ( bFlg ) // bFlg 가 0 이 아니라면 if 문 속으로 들어갈 것이다.

{

// .......

}

if ( ! bFlg ) // bFlg 가 0 과 같다면 if 문 속으로 들어갈 것이다. 이것은 if ( bFlg == 0 ) 과도 같은 식이다.

{

// .......

}

결과적으로 not 연산자는 c 에서 ! 와 같은 원리이다.

간단한걸 너무 어렵게 설명했나요? ㅜ_ㅜ

이것으로 논리 연산자 라는 녀석을 마칩니다.

8. while 문과 repeat 문

- while : 루아에서의 while 문은 c 와 사용법이 동일하다. 좀 더 구체적인 설명은 while 문으로 검색하여 c 에서의 사용법을 참조.

sample code

indx = 1

while indx < 10

do

print ( " loop pass: ", indx )

indx = indx + 1

end

- repeat : 루아에서의 repeat do while 문과 같은 원리이다. 일단 한번은 하고 보자는 식이다 :)

sample code

indx = 1

repeat

print ( " loop pass: ", indx )

indx = indx + 1

until indx > 10

- 결론 : while 문은 do end 로 이뤄지며 repeatrepeat until 이 사용된다.

9. 우리의 호프 for

- 무슨 말이 필요하랴 샘플 코드로 바로 들어갑니다.

sample code1

for indx = 1, 10

do

print ( indx )

end

c code

for ( int indx = 1 ; i <= 10 ;i += 1)

{

printf ( indx ) ;

}

첫 예제에 보면 indx = 1, 10 이라 되있다. 1 부터 10 까지 인데 증가치는 얼마인지 보이질 않는다.

일종의 증가치를 생략한 경우인데 기본값 1 이 증가된다. 이것 역시 일관성이 부족하다...

sample code2

for indx = 10, 1,-1

do

print ( indx )

end

c code

for ( int i = 10 ; i >= 1 ; -- i )

{

printf( indx ) ;

}

for loop = 0 , 100 , 1

do

-- ...............

end

loop 변수는 for 문이 끝남과 동시에 소멸한다.

이는, 지역변수의 성질에 대해 이해가 필요하다.

c 코드로 보는 지역변수의 개념 정복

void SampleFunc()

{

{

int i =0 ;

for ( ; i < 100 ; ++ i )

{

printf ( " %d", i ) ;

}

} // int i = 0 ; 변수 i 는 이 라인을 통과 함으로써 지역변수로써 존재가 소멸된다.

i = 200 ; // error

{

int i = 1 ; // ok 위의 int i = 0 ; 과는 별개의 지역변수이다.

// ......

}

}

위의 코드는 빌드 되지 않는다.

컴파일러는 i = 200 ; 이라는 부분에서 오류를 낼것이다. i 는 존재하지 않기 때문이다.

이에 따른 지역변수의 완벽한 이해개념 역시 c, c++ 등의 언어를 통해 연마해야 할 것이다..

10. break

- c 와 용도 및 원리가 동일하다.

※ C, C++ 에선 없는것..

- "1" + 1 은 2 가 됩니다.

- "1 + 1 " 은 문자열로 "1 + 1" 이 됩니다.

- "abcd" + 1 은 오류를 냅니다.

※ 이러한 형의 선언이 없는것들끼리 섞이는건.. 혼선이 일어나는건 아닐련지..

- if a ~= b then 이와 같은 문법은 c 에서 표현할 경우 if( a != b ) 가 된다. (부등)

이 외의 다른 관계연산은 c 와 같다.

※루아에서 없는것..

- 루아는 나머지 연산자 ( % ) 가 존재 하지 않는다. ( 이게 얼마나 중요한건데 --; )

차기 버전에 추가될 것이라 한다. ( 5.0 이하 버전엔 없음 )

- switchcase 가 없다.. 이로 인해 if 신공만이 만병통치약이 되겠군요

TIP

◈ 단정도 실수형 float 4 바이트 -1.2E - 38 ~ 3.4E38

◈ 배정도 실수형 double 8바이트 2.2E - 308 ~ 1.8E308

- 현재 루아 5.0 에는 배정도 부동소수점만 쓴답니다.

- 그렇지만 컴파일시 단정도 부동소수점을 사용하도록 설정하는것이 가능하다 합니다.

- 루아 5.1 버전에서 정수 형식이 추가될것이라 하는군요..

3.14e8 ( 3.14 * 10의 8승, 314,000,000 == 3.14 * 100,000,000 )

3.14e-2 ( 3.14* 10의 -2승, 0.314 == 3.14 * 0.1 )

최근 업데이트 : 2006. 1. 13

작성자 : 되엔자앙 ( 권진영 ) - rpna@korea.com

from - http://cafe.naver.com/createwindow.cafe

정보란 공유를 위함이다. 수정 및 배포는 자유입니다.

다만, 출처를 분명히 하며 절대 상업적 목적에 사용될 수 없습니다.

대한민국이 강해질 그날까지..

edwin에서 자주쓰이는 기능만 추려 정리. SICP

edwin.

요거 참 골때리는 것 같다.

마우스로 되는 거라고는 포인터 움직이는 것 밖에 없다.

요즘은 emacs도 안그런 것 같던데.

검색해보니 다른 구현도 많고, GUI지원되는 구현도 있는 것 같지만.

귀찮아서 그냥 MIT Scheme과 기본제공되는 edwin으로 하는 중.

이게......

edwin에 대한 사용법은 공식사이트에 쥐꼬리만큼 있고 찾아봐도 잘 나오질 않는다.

그러면. 핵심 사항만 추려서 가보자.

우선, edwin을 실행시키면

<ctrl+x-ctrl+f>로 파일열기 명령어를 준다음에

아무 내용이나 입력하자.

sicp를 보는 중이라면 "ex1-31.scm"이런식으로

확장자를 scm으로 주면, scheme모드로 자연스레 들어간다.

우선 코드를 작성하고, 평가를 할때,

()로 둘러쌓인 블록단위로 평가하려면 그 블록에 커서를 갖다놓고

<alt+z>를 살표시 눌러준다.

그러면 그 블록만 평가가 된다.

바뀐부분이 있어서 다시 평가해야 할때 유용하다.

그렇지 않을경우에 지금 작성중인 버퍼에 있는 모든 명령어를 평가하려면

<alt+o>를 눌러준다.

그러면 모든게 평가가된다.

참고로, 평가하면, 맨 밑줄에 마지막으로 평가된 내용만 한줄 나오는데,

모든 내용은 Scheme에 가면 떠있다.

무슨 말인고 허니, edwin을 실행시키면 scheme이 뜨고

그 다음에 edwin이 뜬다.

scheme위에서 edwin이 돌도록 되어 있는 것이다.

그리고 각 작업중인 내용은 버퍼라는 단위에 들어있는데

scheme은 "*scheme*" 작업중인 코드는 "파일이름"이라는 버퍼에 있다.

(ex1-31.scm이라면 버퍼이름이 ex1-31.scm이다.

이 내용은 <ctrl+x ctrl+b>를 눌러보면 확인할 수 있다.)

그래서 <ctrl+x b>를 눌러보자.

(ctrl+x를 누른다음에 ctrl에서 손을떼고 그냥 b만.

<ctrl+x ctrl+b>는 ctrl을 누른채로 x,b를 누르라는 이야기)

"switch to buffer (default is *scheme*) :"

이런 메세지가 뜬다.

그러면, 그냥 엔터키를 누르면 default인 *scheme*으로 넘어가고

이름을 입력하면 그 버퍼로 넘어간다.

엔터를 처서 scheme으로 가보면, 평가한 내용들 에러들이

전부다 기록되어 있는 것을 볼 수 있다.

그리고 평가를 했는데,

아무 응답이 없다면, 밑에서 두번째 시커먼줄을 주목하자.

여기가 listen인데 반응이 없다면, 에러가 난것이므로

scheme으로 가서 에러를 확인하거나 <ctrl+c ctrl+c>로 평가를 취소 시킨다.

그리고 여기거 eval로 된 상태로 응답이 없다면. 무한 루프에 빠진것이다.

참고하자.

그리고 유용한 명령어는

<ctrl+x ctrl+s> 파일저장하기

<ctrl+x ctrl+w> 다른 이름으로 저장하기

<ctrl+x 1> 창이 분할되었을때 창 하나만 보이기

<ctrl+x k> 작업중인 버퍼 지우기

<ctrl+x ctrl+c> edwin종료

뭐 이정도 되겠다.

더 자세항 명령어가 많지만.

귀찮아서 이만. ㅋ

+ Recent posts