반응형

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