'전체보기'에 해당되는 글 126건

  1. 2009.04.24 [프로그램] 소스추적 프로그램 Source Insight 1
  2. 2009.04.23 Volatile 한정자
  3. 2009.04.23 [AVR] DDRA, PORTA를 찾아보자. 1
  4. 2009.04.23 광고는 이제 안녕~ Adblock Plus 1.0.2 1
  5. 2009.04.23 웹메일 알림이 (WebMail Notifier)
  6. 2009.04.22 메모리 최적화 프로그램 CleanMem
  7. 2009.04.22 [DK-128] LED 순차적으로 점멸하기
  8. 2009.04.22 [avr] 확장형 데이터 타입
  9. 2009.04.21 [프로그램]포니 pony prog
  10. 2009.04.21 [프로그램] toast prog 2005
2009. 4. 24. 17:24

[프로그램] 소스추적 프로그램 Source Insight

다른 사람의 소스나 헤더파일을 추적하는데 유용하게 쓰이는 프로그램으로 source insight 란게 있다.

이 프로그램의 사용법을 알아보기 위해 이전에 포스팅했던 DDRA, PORTA를 source insight로 찾아보자.


프로그램을 설치하고 실행시킨 다음 Project - New Project를 선택하여 프로젝트를 생성하자.


 프로젝트 이름과 저장경로를 설정하자.


 가운데 소스경로를 소스파일이 있는 곳으로 설정해주자.


 오른쪽 중간쯤에 있는 Show only known document types를 체크해제 해주면 모든 파일들이 표시된다.
make파일과 소스파일을 더블클릭하여 add시키고 close를 누른다.


 오른쪽에 추가되어있는 소스코드를 선택하면 소스코드를 보여준다.
여기서 변수들을 더블 클릭하면 하단의 창에 경로를 표시해주는데, 현재 헤더파일들이 Add되어있지 않으므로 나오지 않는다.

 Project - Add and Remove Project Files를 선택하자.

 왼쪽 상단의 디렉토리에서 AVR이 설치된 폴더를 클릭해주고, 하위 폴더중에 avr/include폴더를 선택해주면
많은 헤더파일들이 보인다. Add All 을 선택하고 Add to Project에서 하위 디렉토리와 그 하위의 모든 디렉토리를 포함시키기 위해 두개 모두 체크하고 OK를 선택하자.

 이제 헤더파일과 소스파일등 추가된 모든 파일을 연결시켜주어야한다.
 Project - Synchronize Files를 선택하자.

 두번째 항목을 체크하고 OK를 선택하면 모든 파일이 연결된다.


 이제 DDRF와 PORTF등이 빨간색으로 변한것을 볼 수 있다.
DDRF에 마우스를 갖다대고 ctrl + 클릭을 해보자.


 atmega128을 사용한다면 iom128.h을 선택하고 select를 클릭하자.


 전에 보았던 _SFR_MEM8(0x61)을 볼 수 있다.
_SFR_MEM8(0x61)을 ctrl + 클릭으로 다시 경로를 찾을 수 있으며, 이런 작업을 반복하여 모든 경로를 추적할 수 있게 된다.

2009. 4. 23. 12:03

Volatile 한정자

1. No-Cache Mode로 사용하기 위해서이다.
   보통 프로그램 실행시 속도를 위해 CPU에서 데이터를 메모리에서 직접 읽어오지 않고, 캐시(Cache)를 통해서 읽어오게 된다. 하지만, 하드웨어에 의해서 변경되는 값들은 캐시에서 바로 반영되지 않기 때문에 캐시를 통해 읽어오지말고, 직접 메모리에서 읽어와야한다.(속도는 조금 늦춰지긴 한다.)
    - 하드웨어가 사용하는 메모리는 volatile로 선언해 줘야 한다.

ex)
      #define rTEMP1     (*(volatile unsigned char *)0x30000028)
      #define rTEMP2     (*(volatile unsigned char *)0x30000032)


2. 컴파일러 최적화가 임의로 코드를 변경하는 것을 방지한다.
    단계별 최적화 옵션을 사용하게 되면 컴파일러에 따라 전체 코드상 사용되지 않는 DeadCode등은 아예 삭제되거나 무시되는 경우가 있다.  이러한 점은 프로그래머의 의도와는 다르게 기계적 해석에 따라 결과물이 나올 수도 있게 된다. 이러한 경우 프로그래머의 의도가 명확한 경우 volatile을 사용하여 컴파일 최적화를 하지 않게 지정할 수 있다.

출처: No Day But Today
2009. 4. 23. 11:47

[AVR] DDRA, PORTA를 찾아보자.

DDRA, PORTA는 도대체 어디에 정의되어 있을까?
헤더파일에서 직접 찾아보자.

소스코드를 보면 <stdio.h>처럼 많이 사용하는 io함수들을 사용하기 위해 아래와 같이 include한다.

#include <avr/io.h>

따라서 io.h를 살펴보면,

#elif defined (__AVR_ATmega128__)
#include <avr/iom128.h>

이라고 정의된 부분을 볼 수있다.

iom128.h를 찾아보자.(다른 MCU라면 해당 헤더파일을 찾으면 된다.)

imo128.h를 보면, (ctrl+f로 찾자)

/* Input Pins, Port A */
#define PINA      _SFR_IO8(0x19)

/* Data Direction Register, Port A */
#define DDRA      _SFR_IO8(0x1A)

/* Data Register, Port A */
#define PORTA     _SFR_IO8(0x1B)

이렇게 정의된 부분이 있다.

따라서 PORTA = 0xFF 라는 문장은,
_SFR_IO8(0x1B) = 0xFF 라고도 쓸수있다.

그렇다면, _SFR_IO8는 무엇일까.

아까 io.h를 다시 살펴보면,
#include <avr/sfr_defs.h> 라고 된 부분이 있다.
특수기능 레지스터에 대한 헤더파일인데, 이것을 열어보자.

#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

이라고 된 부분을 보자.
이것은 매크로 함수인데, 뒷부분의 _MMIO...부분을 수행하는 것이다.

따라서,
PORTA = 0xFF;
_SFR_IO8(0x1B) = 0xFF;
_MMIO_BYTE((0x1B) + __SFR_OFFSET) = 0xFF;
세문장은 모두 같은 문장이 된다.

그렇다면 _MMIO_BYTE와 __SFR_OFFSET는 무엇일까.

sfr_defs.h에서 _MMIO_BYTE를 다시 찾아보면,

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))

라고 정의된 부분을 찾을 수 있다.

따라서,
PORTA = 0xFF;
_SFR_IO8(0x1B) = 0xFF;
_MMIO_BYTE((0x1B) + __SFR_OFFSET) = 0xFF;
(*(volatile uint8_t *)((0x1B) + __SFR_OFFSET)) = 0xFF;
는 모두 같은 문장이 된다.

volatile에 대해서는 여기를 참조하도록하자. <volatile 한정자 보기>
uint8_t는 unsigned 타입의 정수형(int) 8bit의 타입이라는 것이다.(이 부분이 정의된 부분은 아직 못찾았다.)
즉, unsigned char의 포인터형이란 뜻이고, 괄호가 되있으므로 캐스팅(형변환)을 하겠다는 뜻이다.

__SFR_OFFSET을 찾아보자.
마찬가지로 sfr_defs.h에 정의되어있다.

#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
   sources that don't subtract __SFR_OFFSET from symbolic I/O addresses.  */
#  if __AVR_ARCH__ >= 100
#    define __SFR_OFFSET 0x00
#  else
#    define __SFR_OFFSET 0x20
#  endif
#endif

조건은 호환모드인가 노멀모드인가를 판별하는 것이고
그에 따른 값을 정의한다. 따라서, 노멀모드이므로 0x20이 된다.

따라서,
PORTA = 0xFF;
_SFR_IO8(0x1B) = 0xFF;
_MMIO_BYTE((0x1B) + __SFR_OFFSET) = 0xFF;
(*(volatile uint8_t *)((0x1B) + __SFR_OFFSET)) = 0xFF;
(*(volatile uint8_t *)((0x1B) + 0x20)) = 0xFF;
(*(volatile uint8_t *)0x3B) = 0xFF;

즉, 0x3B주소지에서 1바이트 공간에 0xFF를 쓰겠다는 뜻이다.

그렇다면 0x3B는 무엇인가.
이는 atmega128의 스펙을 살펴봐야한다.
스펙을 살펴보면, PORTA 레지스터와 연결되어있음을 알수있다.

즉 0x3B에 데이터를 쓰게 되면 PORTA 레지스터에 데이터를 쓰는 것과 같은 것이다.

이를 활용하여 헤더파일을 작성할 수 있다.


 


2009. 4. 23. 10:04

광고는 이제 안녕~ Adblock Plus 1.0.2

광고가 제거된 네이버

파폭을 즐겨쓰는 사람이라면 거의 필수적인 부가기능이라고 할 수 있다.
각종 플래쉬나 광고를 보여주지 않아 좀 더 빠른 웹서핑이 가능해진다.

다운로드

2009. 4. 23. 09:17

웹메일 알림이 (WebMail Notifier)


웹메일을 바로 확인할 수 있게 해주는 부가기능이다.

다운로드

상세 설명

웹메일 알림이는 웹메일 계정들을 확인해서 읽지 않은 메일 개수를 알려줍니다.
한 사이트에 있는 여러 계정을 동시에 사용할 수 있습니다.

현재 지원하는 사이트는 아래와 같습니다.
지메일 : mail.google.com
야후메일 : mail.yahoo.com
라이브 핫메일 : mail.live.com (hotmail)
다음(한메일) : www.daum.net
네이버 : www.naver.com
엠파스 : www.empas.com
네이트 : www.nate.com

다른 웹메일을 사용하려면, 직접 스크립트를 작성하면 됩니다.
여기에서 사용자 스크립트 예제를 찾을 수 있습니다.
http://tobwithu.tistory.com/category/WebMailNotifier


2009. 4. 22. 21:00

메모리 최적화 프로그램 CleanMem


 파폭을 즐겨쓰지만 하나의 불만이 있다면 오래 사용할 수록 한없이 증가하는 메모리점유율...
그래서 메모리 관리 프로그램을 찾다가 알게된 CleanMem은 나의 불만을 해결해주었다.


CleanMem은 여타 메모리 청소 프로그램처럼 사용하지 않는 시스템 메모리를 몽땅 써버려.. 윈도우로 하여금 프로세스에 강제적인 메모리 반환을 시키도록 지시하고페이지 파일로 이동시키는 꼼수를 발휘하는게 아니라, 윈도우 API 호출을 통해 사용하지 않는 메모리를 비운뒤에 다시 프로그램의 요구에 따라 반환시키는 방법으로 작동한다고 합니다. 아무튼 페이지 파일을 사용하는게 아니기 때문에, 메모리 최적화 작업시에 생기는 딜레이도 없고 아무리 무거운 게임을 실행중이라 하더라도 상당히 짦은 시간에 작업을 완료합니다.

출처 : 웹초보의 Tech2.1 http://www.choboweb.com/468

CleanMem 다운로드

사용법은 간단하다.

설치하면 제어판-예약된 작업에 등록된다.


기본적으로 30분에 한번씩 수행하게 되어있다.

이 프로그램은 메모리 점유율이 140M를 차지하던 파폭이 80M까지 하락하는 것을 볼 수 있었다.
2009. 4. 22. 18:24

[DK-128] LED 순차적으로 점멸하기

소스코드




2009. 4. 22. 18:16

[avr] 확장형 데이터 타입

      AVR 컴파일러의 확장 데이터형

가)    sfrb, srfw

     특수기능 레지스터(SFR)을 나타내는 지시어로 sfrb는 바이트 단위 레지스터를 sfrw는 워드단위의 레지스터를 나타낸다.

     srfb

#define sfrb_(x,x_) \

extern "C" volatile unsigned char x asm(#x_) 로 정의 되어있다.

     srfw

#define sfrw_(x,x_) \

extern "C" volatile unsigned int x asm(#x_) 로 정의 되어있다.

     사용법은 다음과 같다.

sfrb 심볼1 = IO레지스터주소값; sfrw 심볼2 = IO레지스터주소값;

나)    sfr 데이터형들의 용도

     헤더 파일에 sfr 데이터형들로 정의된 I/O 레지스터 이름들을 사용하여, 레지스터에 직접 값을 대입할 수 있다.

다)    헤더 파일에 정의된 레지스터

     DDR

데이터의 방향성을 지정해주는 레지스터. 해당되는 포트를 1로 정해주면 출력이 되고 0으로 지정해주면 입력이 된다. 기본적으로는 input으로 설정되어있다

) DDRA=0xff;  DDRF=0x00;

     PORT

       출력을 담당한다. 해당되는 핀에 1이나 0을 써주면 그 값이 핀으로 나가는 것이 PORT의 역할이다.

       ) PORTA = 0x01;   PORTF = 0xf0;

     PIN

       DDR 0으로 설정되었을 때 해당되는 핀의 값을 받아들이는 역할을 한다.

2009. 4. 21. 12:10

[프로그램]포니 pony prog

2009. 4. 21. 12:09

[프로그램] toast prog 2005