virtual BOOL CWnd::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult );


리턴

이 메시지를 처리한다면 어플리케이션은 0이 아닌 값을 리턴하며, 그 외는 0을 리턴한다.


인수

wParam : 메시지가 컨트롤로부터 왔다면 그 메시지를 보내는 컨트롤을 식별한다. 그 외는 0값을 가진다.

lParam : 신호 코드와 부가적인 정보를 가진 기 메시지 (NMHDR) 구조체의 포인터. 어떤 기호 메시지들에서, 이 인수는 그것의 첫째 멤버처럼 NMHDR 구조체를 가지는 더 큰 구조체를 가르킨다.

pResult : 메시지가 핸들되었다면 결과 코트를 저장할 LRESULT 변수의 포인터


설명

프레임워크는 컨트롤 이벤트가 일어나거나 그 컨트롤이 어떤 종류의 정보를 요구하는 컨트롤의 부모 윈도우에게 알리기 위해 이 멤버 함수를 호출한다.


OnNotify는 컨트롤 신호에 대한 메시지 맵을 처리한다.

 

 

Example

 

- header file 부문

// ClassWizard generated virtual function overrides

virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);

 

- implementation file 부문

BOOL CIconExDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
     // TODO: Add your specialized code here and/or call the base class

     NMHDR* pNMHDR = (NMHDR*)lParam;

     switch (wParam)
     {
     case IDC_R:
          if(pNMHDR->code == TCN_SELCHANGE)
          {
               // IDC_R을 눌렀을 경우 행해지는 소스 입력
          }
          else
          {

               // IDC_R을 땟을 경우 행해지는 소스 입력
          }
          break;

     case IDC_RIGHT:
          // IDC_RIGHT을 눌렀을 경우 행해지는 소스 입력
          break;
     }


     return CDialog::OnNotify(wParam, lParam, pResult);
}

 

 

1. 라즈베리파이 업데이트 및 업그레이드 실시

 

  sudo apt-get update

  sudo apt-get upgrade 

 

2. 소스관리툴 git 를 다운로드 (오픈소스 https://github.com/WiringPi/WiringPi 의 소스를 가져오기위해)

 

  sudo apt-get install git-core

 

3. “wiringPi” 프로젝트를 받아온다.

 

  git clone git://git.drogon.net/wiringPi

 

4. 빌드 및 설치

 

  cd wiringPi
  ./build

 

5. 아래의 명령어로 설치 확인

  gpio -v gpio readall

  

gpio readall을 해서

 

핀 구조가 나오면 wiringPi 라이브러리 설치 완료가 된것이다.

 

 

LED 회로를 간단하게 구성

 

 

vi에디터를 이용해 C언어를 제작

#include <stdio.h>
#include <wiringPi.h> // 라즈베리파이의 GPIO를 하기위해 아까 받아놓은 라이브러리를 사용

 

#define LED1 4         // GPIO 23 의 핀번호를 정의하기위해 #define 사용

 

int main(void)
{

 if (wiringPiSetup () == -1)
 return 1;                        

 // wiringPisetup() 함수는 라즈베리파이에서 현재 핀 번호가 제대로 다 매핑되어 GPIO기능을 할 수 있는지 검사하는 함수 [-1일땐 GPIO 작업 불능]

 

 pinMode (LED1, OUTPUT); // pinMode()는 보통 센서를 정의하고 어디에 사용 될건지 명시

 

 for(;;)
 {
  digitalWrite(LED1, 1);  // digitalWrite() 혹은 digitalRead()로 센서로 부터 데이터를 읽거나 출력

  delay(1000);

  digitalWrite(LED1, 0);  // 1은 ON 2는 OFF

  delay(1000);
 }
 return 0;
}
 

 

프로그램 컴파일

 

gcc -o gpio-test1 gpio-test1.c -lwiringPi

 

 

위의 컴파일 명령을 실행해 주면 gpio-test1 이라는 실행 파일이 생성

 

5. 프로그램 실행

 GPIO 관련 프로그램 실행은 항상 루트 권한으로 실행 (sudo 명령어)

GPIO23에 연결된 LED가 켜진 후, 1초 대기, 그리고 두 LED가 모두 꺼지는 작업을 반복 수행

프로그램 종료는 Ctrl + C 로 종료

 

 

 

sudo ./gpio-test1

.

 

 

라즈베리파이 원격 연결하기 위해 많은 정보를 찾아보았지만 블루투스 키보드, 무선 wifi 동글이 없는 상태라

 

남들 정보를 이용해서 하기엔 많은 어려움이 있었다.

 

이걸 성공하는데 오래 걸렸지만 어렵지는 않았다.

 

 

1. (iptime을 이용하였음) 랜 선을 라즈베리파이에 연결해주었다.

 

2. http://192.168.0.1 로 접속을하면 iptime 설정 사이트에 들어갈 수 있다.

 

 

들어 갔을 때 관리자명과 비밀번호를 입력하라는 메세지가 떠서

 

wifi단말기 뒤에잇는 rst 버튼을 15초 꾹 눌러 리셋 시켜주었다. 다시 비밀번호를 묻지 않았다.

 

 

3. 관리도구에서

 

 

 

고급설정 - 내부 네트워크 정보를 보면 아이피 정보를 얻을 수 있다.

 

4. putty 혹은 xshell 등 원격 접속 프로그램을 이용해 접속한다.

 

나는 xshell 을 사용 해왔어서 xshell을 이용해 접속 했다.

 

라즈베리파이의 기존 아이디와 비밀번호는

pi/raspberry 로 설정 되어있다.

 

 

 

 

 

5. 기본 설정

 

$ sudo raspi-config

 

이명령어를 치면 언어, 시간, 키보드 등 설정을 할 수 있다.

 

 

6. 원격제어 설치

 

접속 후 라즈비안 xrdp를 설치

 

$sudo apt-get update

$sudo apt-get install xrdp

 

 

7. 원격 접속

윈도우 보조프로그램의 원격 데스크톱 연결을 실행

 

 

라즈베리파이2의 ip를 입력 후

위의 id/pwd 를 입력 하게 되면

라즈베리가 보입니다. 

 

완성!

 

 

 

라즈베리파이3을 구입하기 원했지만 해외배송이 너무 비싼지라

메카솔루션에서 제공하는 '라즈베리 종결키트'! 를 구입했다.

해당 사이트 : http://roboholic1.godo.co.kr/shop/goods/goods_view.php?goodsno=7748&inflow=naver&NaPm=ct%3Dimhbuo94%7Cci%3D9e15ad0ac38c6432801837d6e3b9bf4ec5bdd81c%7Ctr%3Dsls%7Csn%3D188145%7Chk%3D986871c786f96bbb1ef1cfcbb35468e1f036b90b

 

구성품으로는 아래와 같다. 

 옵션은 따로 추가할 시 추가 요금이 든다.

 

많은 센서를 사용해보고 싶다면 메카솔루션의 종결키트를 추천한다!

 

배송 물품을 개봉할 때 모습

 

학부생일 때도 자주 이용했지만 열심히 공부하는 고객을 위한 약과~ 정말 맛있다. 또 상품 손상을 고려해 틈틈히 감싼 뽁뽁이 안전하게 배달안오면 이상할 정도로 잘되있다.

고객을 향한 배려가 엿보이지 않는가 싶다. 

 

구성품은 하나도 빼먹지 않고 잘 도착했다.

 

드디어 라즈베리파이에 입문하게 되었다. 두근두근 설리설리~_~

 

메카솔루션 위에 url을 타고 들어가시면 해당 제품에 대한 자료들을 많이 제공한다.

제품에 대한 정보 뿐 아니라 사용법 등 2차 서비스까지 받을 수 있다.

 

이제 라즈베이파이를 만져보로 고고싱~

 

 

 

 

(1) 키(Key)의 개념

키(Key) : 튜플을 식별하기 위해 상ㅇ하는 속성이나 속성의 집합. 참조 또는 검색시에 사용

 

(2) 키의 종류

  1) 후보키(Candidate Key)

    - 각 튜플을 유일하게 식별할 수 있는 속성이나 속성의 집합

    - 후보키의 조건은 유일성최소성을 모두 만족해야 함

  2) 기본키(Primary Key)

    - 후보키 중에서 튜플을 식별하기 위해 특별히 선택된 키

    - 중복될 수 없고, NULL 값이 올수 없음

    - 유일성과 최소성을 만족해야함

        * 유일성 : 각 튜플을 유일하게 식별하는 성질

           최소성 : 각 튜플을 유일하게 식별할 수 있는 최소 구성의 성질

  3) 대체키(Alternate Key)

    - 후보키 중에서 기본키를 제외한 속성

  4) 외래키(Foreign Key)

    - 다른 테이블을 참조하기 위해 사용되는 속성

      * 식별관계 : 외래키가 기본키

         비식별관계 : 외래키가 일반 속성

   5) 슈퍼키(Super Key)

     - 후보키와 다른 속성들과의 모든 조합

 

(3) 무결성(Integrity) 제약조건

무결성 : 정확성과 안정성을 나타내는 것으로, 무결성 제약조건은 정확성과 안정성을 유지하기 위한 제약조건

    1) 개체 무결성

       - 기본키는 NULL 값이 올 수 없고, 중복될 수 없음

       - 개체 식별에 오류가 없도록 하기 위한 조건

    2) 참조 무결성

       - NULL값이 올수 없고, 참조 테이블의 기본키와ㅏ 같아야 하는 제약조건으로 테이블 참조 시 오류가 없도록 하기위한 조건

    3) 도메인 무결성

       - 속성값의 범위가 정의된 경우 그 속성값은 정해진 범위 이내의 값을 구성해야 하는 조건

    4) 고유(Unique) 무결성

       - 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 그 속성 값은 모두 달라야 함

    5) NULL 무결성

       - 특정 속성값에 NULL이 올 수 없다는 조건이 주어진 경우, 그 속성값은 NULL이 올수 없음

    6) 키 무결성

       - 한 릴레이션에는 최소 하나의 키가 존재해야 하는 조건

'Certification > 정보처리기사' 카테고리의 다른 글

관계 데이터 모델  (0) 2016.03.28
개체-관계 모델(E-R Model)  (0) 2016.03.28
데이터베이스 설계  (0) 2016.03.23
데이터베이스 구조(스키마)  (0) 2016.03.23
데이터베이스 관리 시스템  (0) 2016.03.23

(1) 관계 데이터 모델

 - 2차원 구조의 표로 표현하는 방법을 말함

 

 릴레이션(Relation)

 자료 저장의 형태가 2차원 구조의 테이블로 표현

 속성(Attribute)

 각 열 ( Column - 항목 )

 튜플(Tuple)

 한 행을 구성하는 속성들의 집합 ( Tuple = Row = Record )

 도메인(Domain)

 값 들의 범위

 릴레이션 스키마(Relation Schema)

 속성 이름의 집합 (릴레이션의 구조)

 릴레이션 인스턴스(Relation Instance)

 튜플들의 집합

 차수(Degree)

 속성(항목)의 수

 카디널리티(Cardinality)

 튜플(행)의 수

* 릴레이션(Relation) = 테이블(Table) = 표

  속성(Attribute) = 열(Column) = 항목(Field)

  튜플(Tuple) = 행(Row) = 레코드(Record)

 

릴레이션의 특징

  - 튜플들은 모두 상이하다

  - 튜플들은 유일하며 순서에는 의미가 없다

  - 속성들 간의 순서는 의미가 없다

  - 속성은 원자값으로 구성되며 분해가 불가능하다

 

* Mapping Rule : - 개념적 데이터베이스 모델링 결과를 관계형 데이터베이스 이론에 근거하여 데이터베이스 구조로 변화하는 과정

                         - 개체는 릴레이션으로 속성은 릴레이션의 항목으로, 키 속성(식별자)은 기본키로, 관계는 외래키로 변환

 

* 교차 엔티티(Intersection Entity) : 다대다 관계의 E-R Model을 릴레이션으로 표현하는 경우 보다 하나의 릴레이션을 더 만들게 됨

 

 

 

 

'Certification > 정보처리기사' 카테고리의 다른 글

키(Key)와 무결성 제약조건  (0) 2016.03.28
개체-관계 모델(E-R Model)  (0) 2016.03.28
데이터베이스 설계  (0) 2016.03.23
데이터베이스 구조(스키마)  (0) 2016.03.23
데이터베이스 관리 시스템  (0) 2016.03.23

(1) 개체-관계 모델 (E-R Model) (=개념적설계)

- 개념적 설계 단계에서 사용되는 설계 기법

- P.Chen 박사에 의해 최초로 제안

 

(2) E-R Model의 기호

 

 

(3) 데이터베이스 모델

  1) 관계 데이터 모델

    -  2차원 구조의 표(테이블) 형태로 표현

    - 구조가 단순하며 사용이 편리해 가장 많이 사용

    - n:m 표현이 가능

 

  2) 네트워크 데이터 모델

    - 망데이터 모델이라고 하며, 레코드간 관계를 도형으로 표현

 

  3) 계층 데이터 모델

    - 트리 구조로 표현

'Certification > 정보처리기사' 카테고리의 다른 글

키(Key)와 무결성 제약조건  (0) 2016.03.28
관계 데이터 모델  (0) 2016.03.28
데이터베이스 설계  (0) 2016.03.23
데이터베이스 구조(스키마)  (0) 2016.03.23
데이터베이스 관리 시스템  (0) 2016.03.23

 

-여러 개의 태스크들 중에서 다음번 수행시킬 태스크를 선택하여 CPU라는 자원을 할당하는 과정을 스케줄링 이라고 함

-  리눅스의 태스크는 실시간 태스크와 일반 태스크로 나뉘며 각각 스케줄링 알고리즘이 구현

* 리눅스가 총 140단계의 우선순위 제공

실시간 태스크 (0~99)

일반 태스크 (100~139)

 

(1) 런 큐와 태스크

- 운영체제는 스케줄링 작업 수행을 위해, 수행 가능한 상태의 태스크를 자료구조를 통해 관리

- 이 자료구조를 런 큐(Runqueue)라 함

- 운영체제의 구현에 따라 런큐는 한개 혹은 여러개 존재 가능

- 자료구조의 모양이나 관리 방법도 달라짐

- ~/kernel/sched/sched.h 파일 내에 struct rq라는 이름으로 정의

- 부팅 이후 각 CPU별로 하나씩의 런큐를 유지

복수개의 CPU를 가진 시스템에서 리눅스의 런큐 자료구조와 태스크의 관계

 

- 새로 생성된 태스크는 부모 태스크가 존재하던 런 큐로 삽입 (더 높은 캐시 친화력 (cache affinity)를 얻을 수 있기 때문에)

- 대기 상태에서 깨어난 태스크는 대기전에 수행되던 CPU의 런 큐로 삽입

 

* 스케줄러가 수행되면 해당 CPU의 런큐에서 다음번 수행시킬 태스크를 고를 때 고려사항

1. 어떤 태스크를 선택할 것인가

   - 일반 태스크를 위해 CFS를 사용하며 실시간 태스크를 위해서 FIFO, RR, DEADLINE 정책을 제공

2. 런 큐간의 부하가 균등하지 않은 경우 어떻게 할 것인가

   - 부하 균등 (load balancing)기법을 제공

        # load_balance() 함수 : 특정 CPU가 많은 작업을 수행하고 있느라 매우 바빠 한가한 다른 CPU에 태스크를 이주(migration) 시켜서 성능 향상

 

 

(2) 실시간 태스크 스케줄링 (FIFO, RR and DEADLINE)

  - 가장 급한 태스크를 한가한 태스크보다 먼저 수행될 수 있도록 해줌 -> 높은 반응성을 보임

  - 어떤 기준에 근거하여 태스크를 골라내는지?

         -> task_struct 구조체는 policy, prio, rt_priority 등의 필드가 존재

  - 실시간 태스크 ( SCHED_FIFO, SCHED_RR, SCHED_DEADLINE)

  - 일반 태스크 (SCHED_NORMAL) , 이와 더불어 중요하지 않은 일을 수행하는 태스크가 CPU 점유를 막기 위해 SCHED_IDLE 정책, SCHED_BATCH정책이 존재

     * 리눅스 실시간 태스크란?  sched_setscheduler()등의 함수를 통해 태스크의 스케줄링 정책을 위 세가지 중 하나로 바꾸게 되면 실시간 태스크가 되는 것

  - 우선순위 설정을 위해 task_struct 구조체의 rt_priority 필드를 사용

      -> 0~99까지의 우선순위를 가질 수 있으며 태스크가 수행을 종료하거나 스스로 중지하거나 혹은 자신의 타임 슬라이스를 다쓸때까지 CPU를 사용

           => 즉 RR인 경우 동일 우선순위를 가지는 태스크가 복수개인 경우 타임 슬라이스 기반으로 스케줄링

 

  -

(1) 상태 전이와 실행 수준 변화

태스크는 생성 뒤 자신에게 주어진 일을 수행하며, 이를 위해 디스크 I/O나 락 등 CPU이외의 자원을 요청

 

특정 태스크가 당장 제공해 줄 수 없는 자원을 요청한다면?

1. 커널은 이 task를 잠시 '대기' 하도록 만듬

2. 다른 태스크를 먼저 수행

3. 태스크가 요청한 자원이 사용 가능해 지면 대기상태의 태스크를 다시 '수행'

 

 

□ EXIT_ZOMBIE 상태

- 말 그대로 죽어있는 상태. Task에게 할당되어 있던 자원을 대부분 커널에게 반납한 상태.

- 자신이 종료된 이유를 부모 태스크에게 알려주기 위해 유지 되고 있는 상태

 

□ EXIT_DEAD 상태

- 부모 Task가 wait()을 호출하면 자식 태스크의 상태가 EXIT_DEAD로 바뀜

- 부모는 자식의 종료 정보를 넘겨받고 자식태스크는 자신이 유지하던 자원을 모두 반환하고 최종 종료됨

 * 부모 task의 wait()함수 호출 전 먼저 사라지게 되면 고아 태스크가 영원히 존재해 시스템의 오버헤드로 작용됨

     --> 이 문제를 해결하기 위해 커널은 고아 task의 부모를 init task로 바꾸어줌 (task_struct 구조체에 real_parent와 parent 2개의 필드가 존재하는 이유)

 

□  TASK_RUNNING 상태

- 실제 수행중인 task의 상태 (running)과 수행되던 task가 자신에게 할당된 CPU 시간을 모두 사용하여 다시 준비중인 상태 (ready)

 

□  TASK_INTERRUPTIBLE 상태

- 실행 상태에 있던 태스크가 특정한 사건을 기다려야 할 대기상태로 전환되어 기다리는 사건에 따라 특정 큐(queue)에 매달려 대기중인 상태

- 대기하는 동안 자신이 기다리는 그 사건 외에는 일체 방해받아선 안 되는 경우가 있을 수 있는데 이 경우가 TASK_UNINTERRUPTIBLE.

- 이후 기다리던 사건 발생 시 대기 상태에 있던 TASK가 다시 준비(ready)상태로 전이하게 되며 다시 다른 태스크들과 함께 스케줄링 되기 위해 경쟁함.

  * TASK_UNINTERRUPTIBLE 상태의 Task가 시그널에 반응하지 않기때문에 생기는 문제

     -> (예> 쉘에서 'kill -9 pid' 등의 명령을 수행해도 태스크가 종료되지 않음)

         => 이를 해결하기 위해 TASK_KILLABLE 상태가 도입

 

(2) TASK_RUNNING(running) 상태의 수준

- 실제로 실행중인 TASK_RUNNING(running) 상태는 다시 사용자 수준 실행 상태와 커널 수준 실행 상태로 구분할 수 있음

 

□ 사용자 수준 실행 (user level running)

- CPU에서 사용자 수준 프로그램의 제작자가 만든 프로그램이나 라이브러리 함수를 수행하고 있는 상태로 사용자 수준의 권한으로 동작

 

□ 커널 수준 실행 (kernel level running)

- CPU에서 커널 프로그램의 일부분을 수행하고 있는 상태로, 사용자 수준 권한보다는 더 강력한 커널 수준 권한으로 동작

 

* 사용자 수준에서 커널수준 실행상태로 전이하는 방법

  1. 시스템 호출

  2. 인터럽트 발생

 

(3) 커널 수준의 프로그램

- 커널 수준의 프로그램은 바로 리눅스 그 자체임

- 리눅스도 C와 어셈블리어로 작성된 S/W이기 때문에 수행되기 위해서는 스택을 필요로 함

 

 

- 리눅스 커널은 태스크가 생성될 때마다 태스크 별로 task_struct 구조체와 8KB의 스택을 할당해 줌

- 8KB의 스택은 thread_union이라 불림, thread_info(프로세스 디스크립터) 구조체도 포함 되어있음.

-Pt_regs는 수행을 마친 task가 사용자 수준 실행상태로 복귀하기 이전 수행 작업에 대한 정보 저장 

(root 계정에서 수행)

vim 설치

# yum install vim -y

 

gcc 설치

# yum install compat-gcc-34 -y

 

#vim a.c   ( a.c라는 파일을 생성하며 내용 작성 )

 

 

:wq로 저장 후 나옴

 

gcc [옵션] [바이너너리파일] [.c파일]

 

# gcc -o a a.c

a라고 초록색으로 바이너리 파일이 생성됨

 

#./a ( 바이너리파일 a를 실행 )

 

 

* vim 환경을 제작편하도록 변경

 

# vim ~/.vimrc (새파일 생성)

 

 "새로운 행의 인덴트를 현재행과 같게 한다
set autoindent
"백업파일을 만드는 디렉토리
set backupdir=$HOME/vimbackup
"파일 보존 다이얼로그의 초기 디렉토리를 버퍼 파일 위치로 설정
set browsedir=buffer
"클립보드를Windows(와)과 제휴
set clipboard=unnamed
"Vi호환을 오프
set nocompatible
"스ž
set directory=$HOME/vimbackup
"탭 대신에 공백 문자를 삽입한다
set expandtab
"변경중의 파일에서도, 보존하지 않고 다른 파일을 표시
set hidden
"인크리멘탈 서치를 실시한다
set incsearch
"탭 문자, 줄 끝 등 불가시 문자를 표시한다
set list
"list그리고 표시되는 문자의 포맷을 지정한다
set listchars=eol:$,tab:>\ ,extends:<
"행 번호를 표시한다
set number
"시프트 이동폭
"set shiftwidth=4
"닫아 괄호가 입력되었을 때, 대응하는 괄호를 표시한다
set showmatch
"검색시에 대문자를 포함하고 있으면 대/소를 구별
set smartcase
"새로운 행을 만들었을 때에 고도의 자동 인덴트를 실시한다
set smartindent
"줄머리의 여백내에서 Tab (을)를 박으면,'shiftwidth' 의 수만큼 인덴트 한다.
set smarttab
"파일내의 <Tab> 하지만 대응하는 공백의 수
"set tabstop=4
"커서를 줄머리, 줄 끝으로 멈추지 않게 한다
set whichwrap=b,s,h,l,<,>,[,]
"검색을 파일의 선두에 루프 하지 않는다
set nowrapscan

 

 

+ Recent posts