Ubuntu 에서

Creator need a compiler set up buil. Configure a compiler in the kit options

라는 에러 문구 나올때

sudo apt-get install g++

restarte computer

sudo pat-get install libgl1-mesa-dev libglu1-mesa-dev



이렇게 한 후 컴파일시

"Could not start process "make"..

위와 같은 에러 발생시

 apt-get install build-essential 설치



gdb 에러 발생시

apt-get install gdb 추가로 설치

해당 프로젝트에 마우스 오른쪽클릭 -> Add new 를 하거나 혹은 ctrl+N(단축키) 를 누르면 New 라는 팝업 화면이 뜬다.

여기서 Files and Classes 목록에 Qt 를 선택하면 오른쪽에 목록이 나오고 목록중에 Qt Resource file 을 선택하고 Choose... 버튼을 누른다.

New Qt Resource file 창이 뜨고 리소스파일(.qrc) 의 이름과 생성 위치를 정하는 부분이 나온다.

적당한 이름을 작성하고 적당한위치(프로젝트폴더)른 선택한 후 Next 버튼 -> Finish 버튼을 누른다.

프로젝트 폴더 안에 Resources 라는 폴더가 생기고 그 아래에 xxx.qrc 라는 리소스 파일이 생성된다.

더블클릭하여 오른쪽 창에서 Add Prefix 를 선택하면 트리 구조의 리스트가 생성되고 그 리스트를 선택하여 Add Files 해서 추가할 Resource 파일을 선택하면된다.

프로그램 소스에서 사용방법은 :/prefix이름/리소스이름.확장자 를 이용하여 사용하면된다.

예) prefix : /image  , resource: test.png 일때

프로그램에서 ":/image/test.png" 로 해당 리소스를 이용 할 수 있다.

QT 를 설치한 폴더에 컴파일러 폴더에 bin 폴더 안에 들어가면 uic.exe 파일이 있다

이파일을 이요하여 .ui 파일을 .h 파일로 변환 가능

명령프롬프트에서 uic 가 있는 경로까지 디렉토리를 옮겨서

다음과 같이 명령어를 입력하면

 uic xxx.ui > xxx.h

헤더파일로 변경되어 출력된다.

이전에 씨언어 콘솔로 만든 짝맞추기 게임입니다.

터보씨를 이용해서 얼추 잘 돌아가게 만들어 보았던 기억이다.

실행파일을 찾은김에 블로그에 올려본다.

ㅋㄷㅋㄷ 그때는 정말 열심히 만들었었던 기억이..

 

 

Wook's 짝맞추기_게임.exe

'Study > C Language' 카테고리의 다른 글

S-DES  (0) 2015.08.11
serial commutnication escape charater  (0) 2014.04.24
베스킨 라빈스 31 게임  (6) 2012.04.27
해밍코드  (0) 2012.04.12

우선 avr studio 6(atmelstudio) 를 설치한 후에 atmega128을 프로그램 다운로드를 하려고하면 항목이 없어서 당황스럽다 avr studio 4.18 정도의 버전을 보면 stk500을 이용 하여 프로그래머로 다운로드를 하기 쉬었는데 말이지..

이번에 새로 atmel studio(avr studio 6)을 설치해서 가지고 놀다가 알아낸 방법입니다.

다른 블로그 및 카페에 보니 다른 방법도 여러가지가 있던데, 저의 귀차니즘 발동으로 인해 알아낸방법이 상당히 간단해서 메모해 두는겸 포스팅 합니다.

테스트 환경은 운영체제 window XP , avr studio 6(atmel studio), USB ISP 를 이용하였습니다.

다운방법 설명 시작합니다! GOGO!

USB ISP 프로그래머를 피시에 연결하여 드라이버를 설치합니다. 저는 COM3에 설치가 되었습니다.

그리고 Atmel studio 6 (avr studio6)를 켜고, 도구 -> Add STK500... 을 클릭

 

위와 같은 창이 뜹니다. 여기서 해당 COM 포트를 선택하시고 Apply 해줍니다.

그리고 도구 -> Device Programming 을 선택합니다.

 

위와 같은 그림이 나오면 STK500 을 선택합니다.

최초에 선택을 하여 디바이스 목록을보면 ATMEGA128이 항목에 없는것을 볼 수 있습니다.

그리고 Atmel Studio 가 설치된 경로에 tools 폴더 아래에 STK500폴더 아래에 xml폴더로 들어갑니다.

예)C:\Program Files\Atmel\Atmel Studio 6.0\tools\STK500\xml

여기에 들어가보면 디바이스 별로 xml 파일이 다 정의 되어 있는데, Atmega128관련 문서가 없는 것을 확인할 수 있습니다.

 

모든 xml 파일의 정의가 아래와 같이 되어있으면서 device name 만 다른것을 알 수 있습니다. 

<?xml version="1.0" encoding="UTF-8" ?>
- <avr-tools-part-file xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../schema/avr_tools_part_file.xsd">
- <devices>
- <device name="ATmega8">
- <tools>
  <tool name="STK500" type="com.atmel.avrdbg.tool.stk500" />
  </tools>
  </device>
  </devices>
  </avr-tools-part-file>

 

ATmega128_stk500.xml

그래서 파일내용을 수정한 위와같은 xml 파일을 만들어서 폴더에 추가 해 보았습니다.

그리고나서 avr studio 6 (atmel studio6)를 종료하고 다시 실행합니다.

아트메가와 프로그래머를 연결하고 도구 -> Device Programming을 선택 합니다.

Tool 을 아까 추가해주었던 STK500으로 선택을 하고 Device목록을 보면 ATmega128이 생긴것을 확인할 수 있습니다. 선택하고 Apply를 눌러줍니다.

어머나! 연결이 되는것을 확인할 수 있습니다. 물론 프로그램 다운로드까지 실행해보았고 아무 문제 없이 잘 되었습니다.

이상 끝!!!

참고) 헥사 파일의 경로가 한글이 들어있을경우 파일을 찾지못하여 다운로드가 안되는 경우가 있었습니다. 왠만하면 영문으로 하시는것이 좋을것 같습니다.

그리고 혹시 다른 환경에서 해보시고 잘 된다면 댓글좀 부탁드립니당! ^^

'Study > Embedded' 카테고리의 다른 글

AVR(ATmega128) 인공호흡 하기  (0) 2012.05.30
Common-anode 방식 Common-cathode 방식  (0) 2012.04.13

public class FrameTest5 {
    public static void main(String[] args) {

        JFrame frame = new JFrame("Frame Test.. 5th");
        frame.setSize(200, 200);
       
        /*
         * 여기서는 화면이 뜰 때 스크린의 가운데서 실행되게끔 설정한다.
         */
        // 요놈은 프레임의 크기를 구하는 놈이고
        Dimension frameSize = frame.getSize();

        // 요놈은 내 모니터 화면의 크기를 구하는 놈이다.
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        /*
         * 그래서 프레임의 위치를
         * (모니터화면 가로 - 프레임화면 가로) / 2,
         * (모니터화면 세로 - 프레임화면 세로) / 2 이렇게 설정한다.
         */
        frame.setLocation((screenSize.width - frameSize.width)/2, (screenSize.height - frameSize.height)/2);

        // 이놈은 프레임에서 컨테이너를 가져온다.
        Container contentPane = frame.getContentPane();

        // 그리곤 라벨을 하나 생성하고... 정렬은 가운데로...
        JLabel label = new JLabel("Timothy Jung Software.....", JLabel.CENTER);

        // 이 라벨을 컨테이너에 집어 넣는다..., 위치는 북쪽에....ㅎㅎㅎ
        contentPane.add(label, BorderLayout.NORTH);
       
        // 이제 프레임을 보여줘...
        frame.setVisible(true);
    }
}

참고사이트 : http://tjsoftware.tistory.com/9

'Study > Java' 카테고리의 다른 글

자바 스윙 확인창 대화상자 띄우는 방법  (0) 2012.06.10

JOptionPane 를 이용하여 대화상자를 만들 수 있다.

showConfirmDialog 메소드를 사용하여 만들어야 하며

리턴값은 확인 을 눌렀을때 0을 리턴한다.

 

 

참고 사이트 : http://blog.naver.com/lriberio?Redirect=Log&logNo=80058569191

'Study > Java' 카테고리의 다른 글

자바 스윙 프레임을 화면 중앙에 띄우기  (0) 2012.06.11

http://seoltang.com/396

위사이트 참조 하면됨

결론 : atmega의 XTAL1핀에 전원을 공급해줬다 땠다를 몇번하면됨

참고 : 원래 500 ms 단위로  On, Off 하는 프로그램을 작성해서 붙이는것이 정석.

 

XTAL1  : 입력 단자이며 발진기의 증폭기가 인버팅 되어서 입력된다.

XTAL2 : 출력 단자이며 발진기의 증폭기가 인버팅 되어서 출력된다.

Monitor 를 이용한 상호 배제의 문제를 생산자-소비자(한계 버퍼) 문제에 적용하여 baci툴을 이용하여 구현한 것.

목표 및 내용

수업 시간에 배웠던 Monitor를 이용 상호 배제가 되도록 구현을 하는것 입니다. Monitor는 세마포어를 이용한 정확한 프로그램의 작성이 어렵기 때문에 고안된 것입니다. 기능은 세마포어와 동일하나 세마포어보다 제어가 더 쉽습니다. baci툴에서는 Hoare 의 방법이 이용됩니다. Monitor 의 구성요소는 C 언어에서의 구조체와 비슷하고 객체 언어에서는 클래스의 개념과 유사합니다. 구성 순서는 지역변수와 하나이상의 procedure 그리고 초기화 하는 문장의 순서대로 작성이 됩니다.  

모니터는 한 번에 하나의 프로세스만 모니터 내에 존재하게 하고, 공유데이터 보호를 위해서 모니터 구조 내에다가 공용변수를 둠으로써 상호 배제를 보장합니다. 모니터는 조건 변수를 통해서 조건이 만족될때 까지 대기하고 조건이 만족하여 가용 상태가 되면 대기 프로세스가 일을 수행 할 수 있도록 재진입 하게 됩니다.

조건변수에 적용하는 변수 두개는 wait연산과 signal연산이 있는데 baci 툴에서는 waitc, signalc 로써 사용 합니다.

 

소스코드

const int N = 10; //버퍼 변수 갯수를 정하는 변수

const int TRUE = 1; //참값

const int FALSE = 0; //거짓 값

monitor monSemaphore{ // baci cmimi ppt 의 예문을 토대로 작성을 하였습니다.

int buffer[N]; //공용변수

int nextin; //변수를 쓰고난 다음 변수를 지정하는 변수

int nextout; //사용한 변수를 나타내는 변수 사용하고나면 다음쓸변수로 값이 증가.

int count; //버퍼의 갯수를 세어서 공용버퍼가 비었는지 가득 찼는지를 비교 할 때 사용 하는 변수.

condition notfull; //조건변수 가득 찼음을 알리는 변수

condition notempty; //조건변수 비었음을 알리는 변수

void monP(int x) //생산자

{

if(count == N) //버퍼를 사용한 갯수가 버퍼의 크기랑 같으면

{

waitc(notfull); //대기상태로 빠트림

cout<<"-- buffer is full --"<<endl;

}

else //버퍼가 가득차지 않으면 else를 수행

{

buffer[nextin] = x; //외부에서 인자 값으로 보낸 값을 변수에 넣음.

cout<<nextin<<" buffer input "<<x<<" item"<<endl; //출력문

nextin = (nextin+1)%N; //다음 변수로 증가 %연산자는 버퍼를 환형으로 사용하 //기 위함

count = count+1; //한칸 생생했으므로 카운트를 증가시킴

signalc(notempty); //혹시 버퍼가 비어서 잠들어있는 소비자가 있을경우 깨움.

}

}

void monV(int x) //소비자

{

if(count == 0) //버퍼가 비어 있다면 생산자가 버퍼에 값을 넣을때 까지 대기상태로 빠짐.

{

waitc(notempty);

cout<<"-- buffer is empty --"<<endl;

}

else //버퍼가 빈 상태가 아니면 소비를 진행함.

{

x = buffer[nextout]; // 버퍼에 있는 값을 x에 담음

cout<<nextout<<" buffer consume "<<x<<" item"<<endl; //출력문

nextout = (nextin+1)%N; //이 역시 환형 변수로 사용하기위해 %연산자를 이용.

count = count-1; //하나를 소비하였으므로 카운트 값을 하나 줄여줌.

signalc(notfull); //혹시 버퍼가 가득차서 대기중인 생산자가 있으면 깨워줌.

}

}

init //모니터 안의 변수 초기화 문.

{

nextin = 0;

nextout = 0;

count = 0;

}

}

void producer(void) //생산자 스fp드

{

int x = 0; // x의 값을 제품번호의 개념으로 인자 값으로 넘겨줌.

while(TRUE)

{

monP(x);

x = x+1;

}

}

void consumer(void) //소비자 스레드

{

int x;

while(TRUE)

{

monV(x);

}

}

void main()

{

cobegin //생산자와 소비자를 병행 수행

{

producer();

consumer();

}

}

결과화면

 

'Study > OS' 카테고리의 다른 글

Semaphore 구현하기  (2) 2012.05.04
Test-And-Set  (0) 2012.04.27
Bakery 알고리즘  (1) 2012.04.22
Peterson 알고리즘  (0) 2012.04.22
jBACI 사용법  (0) 2012.04.15

Semaphore 를 이용한 상호 배제의 문제를 생산사 - 소비자(한계 버퍼) 문제에 적용하여 baci 툴을 이용하여 구현을 한 것이다.

목표 및 내용

수업 시간에 배웠던 semaphore를 이용 상호 배제가 되도록 구현을 하는것 입니다. 우선 semaphore는 이 때 까지 의 busy waiting 이 계속 해서 cpu의 자원을 사용 하는 문제를 해결하기위하여 다른 프로세스가 임계 구역을 사용하고 있을 때, 진입을 하게 되면 블록 상태가 되고, 이미 임계구역에 들어가 있던 프로세스는 임계구역을 탈출 하면서, 신호를 보내주어 블록 되어있던 프로세스를 깨웁니다. 이러한 방법으로 cpu자원의 낭비도 없애고 상호배제 도 가능하게 할 수 있습니다.

semaphore wait signal 구조

 

2진 세마포어

 

세마포어 연산의 정의

알고리즘

소스코드

const int N = 10; // 버퍼의 공간을 잡을 상수

const int TRUE = 1; // TRUE = 1을 나타내는 상수

const int FALSE = 0; // FALSE = 0을 나타내는 상수, 세마포어에서 쓰이지는 않음.

semaphore mutex = 1; //이진 세마포어 를 구현하기위한 세마포어 변수 초기 값을 1로 설정

semaphore empty = N; //빈공간이 얼마만큼 남았는지 계산하는 세마포어 변수 초기 값을 버퍼의 갯수 만큼 설정.

semaphore full = 0; //생산품이 얼마만큼 차있는지 계산하는 세마포어 변수 초기값을 0으로 설정.

int buffer[N]; // 임계구역 공용 변수

void producer(void) // 생산자

{

int item = 1; //생산자가 1이라는 item을 생성함.

int i = 0; //공용번수의 자리번호를 정하기 위함.

int Num; //공용변수 배열에 값을 지정하기 위함. 10까지 지나면 다시 1로 돌아오기 때문에 % //연산을 해야 함.

while(TRUE) //무한 생산

{

wait(empty); //먼저 빈 공간을 할당 받고, 빈공간이 남아있다면 블록 되지않고 통과함

// cout<<"Mutex : "<<mutex<<" Empty : "<<empty<<" Full : "<<full<<endl<<endl;

wait(mutex); //2진 세마포어로 임계구역을 쓰는 프로세스가 있는지를 확인.

//초기값이 1이므로 다른 프로세스가 먼저 사용하지 않았다면 0으로 만들고 진입.

cout<<"Insert item "<<i<<" buffer place"<<endl; //임계구역에 들어왔음을 출력.

cout<<"Mutex : "<<mutex<<" Empty : "<<empty<<" Full : "<<full<<endl; //세마포어 번호

Num = i%N; //나누기 연산자를 쓴 것은 9 다음 카운트로 10이아닌 0으로 돌아가게 하기위 //함. 앞에 test_and_set구현의 이웃 프로세스에게 자리 양보 의 응용.

// if(buffer[Num] == 0)

// {

buffer[Num] = item; // 공용변수에 생산품을 집어넣음

i = (i+1)%N; // 공용변수의 다음 자리로 이동

cout<<"buffer["<<Num<<"] 's insert_item is "<<buffer[Num]<<endl<<endl;

// }

// else

// {

// cout<<"buffer["<<Num<<"] is not empty"<<endl;

// }

//여기서 if else 문을 썼던 것은 %연산자로 인해 환형 큐 형식으로 되어서 만약 공용번수에 모든 값을 집어 넣고

//나서도 또 넣으려고 시도 할 때 예외처리 하려고 했었으나, 이렇게 하지 않아도 empty 와 full 세마포어 로 인해

//블록이 되므로 굳이 쓰지 않아도 됩니다.

signal(mutex); //임계구역을 빠져나감을 알림 mutex값을 +1 증가 시켜주고 신호를 보냄.

// cout<<"Mutex : "<<mutex<<" Empty : "<<empty<<" Full : "<<full<<endl<<endl;

signal(full); //full 값을 증가시켜줌으로 소비자가 임계구역이 비어있지 않다는것을 알림.

}

}

void consumer(void) //소비자

{

int item = 0; //소비자가 소비를 하고나면 원래 초기 빈값을 넣어줌

int i = 0; //공용번수의 자리번호를 정하기 위함.

int Num; // 역시 % 연산자로 인해 연산을 하여 값을 넣어야 하므로 변수를 생성함.

while(TRUE) //무한 소비

{

wait(full); //full 세마포어 변수가 0일시 공용변수가 비어있으므로 소비 할 수 없고 블록 됨.

// cout<<"Mutex : "<<mutex<<" Empty : "<<empty<<" Full : "<<full<<endl<<endl;

wait(mutex); //2진 세마포어로 임계구역을 쓰는 프로세스가 있는지를 확인.

cout<<"Remove item "<<i<<" buffer place"<<endl; //임계구역 진입을 출력함

cout<<"Mutex : "<<mutex<<" Empty : "<<empty<<" Full : "<<full<<endl; //세마포어 번호

Num = i%N; // 위의 생산자에서의 설명과 같이 9 -> 0으로 돌리기 위해 %연산을 함.

// if(buffer[Num] == 1)

// {

buffer[Num] = item; // 소비자가 소비 후 버퍼를 빈상태로 돌림.

i = (i+1)%N; //공용변수의 다음 자리로 이동.

cout<<"buffer["<<Num<<"] 's item remove result is "<<buffer[Num]<<endl<<endl;

// }

// else

// {

// cout<<"No product in"<<"buffer["<<Num<<"]"<<endl;

// }

//여기서 if else문을 썼던겄도 위에 생산자에서의 이유와 동일함.

signal(mutex); //임계구역을 빠져 나감을 알림.

// cout<<"Mutex : "<<mutex<<" Empty : "<<empty<<" Full : "<<full<<endl<<endl;

signal(empty); // 하나를 소비했으므로 빈공간이 한개 더 늘었음을 알려줌.

}

}

void prod(void) //생산자 스레드

{

producer();

}

void consum(void) // 소비자 스레드

{

consumer();

}

void main()

{

int i;

for(i=0; i<N; i=i+1) // 공용변수의 초기화

{

buffer[i] = 0;

}

cobegin // 병행 수행을 하기위한 cobegin문.

{

prod();

consum();

}

}

실행결과 화면

 

 

'Study > OS' 카테고리의 다른 글

Monitor 를 이용한 생산자-소비자 구현  (0) 2012.05.04
Test-And-Set  (0) 2012.04.27
Bakery 알고리즘  (1) 2012.04.22
Peterson 알고리즘  (0) 2012.04.22
jBACI 사용법  (0) 2012.04.15

+ Recent posts