2007/11/16

플래시 메모리

오늘은 플래시 메모리를 확보했다.










램과 NAND는 언제 들어오려나

2007/11/11

드디어 도착했다.















EP3C120F484C8N
신제품이라서 주문한지 거의 한달만에 받은거다.

다음은 Bottom















다음은 메모리





이걸로 마를렌 프로젝트 스타트.

2007/10/21

내자리야















아 너무 지저분해
정리하는건 너무 귀찬어
걍 이렇게 살지 머

2007/10/10

EPM2210F324C5N















BGA 도전 성공.
BGA 타입도 이젠 쌍콴엎써효.
랄랄라

힛건으로 3개 중 2개 완성. 핫플레이트가 필요하다.

2007/10/06

AT32AP7000 프로세서 모듈 보드 Schematic 작업-1















일단 위의 리셋회로를 사용한다.











크리스탈을 연결하고
















전원 인디케이터 LED도 연결하고






















전원도 빠짐없이 연결했다.



















물론 JTAG도 연결.
EVTO라는 희귀한 net도 연결됨.
데이터시트를 보니까 AT32AP7000에서 advanced debug featuer를 지원하기 위한 AUX 단자 중 하나란다.AVR-JTAG 사용에는 불필요할거 같지만 일단 0 ohm으로 연결해둔다.


나머지 핀은 모조리 board-to-board 커넥터로 연결할껀데...커넥터 멀 쓸지 내일 결정하기로 한다.
아이구 머리야

2007/10/05

AT32AP7000 프로세서 모듈 보드 검토















이걸 만들어볼 생각인데.
일단 board-to-board 커넥터 또는 헤더로 main PCB에 탈착 가능하도록 하는게 첫번째 목표다.
전원은 main PCB에서 공급받고,
메모리...메모리는...외부에...main PCB에 달도록 하자.
USB 포트 역시 main PCB로 빼고,
입력 클럭 3개(XIN0/1, XIN32) 중 RTC는 32KHz로 하고, XIN은 입력 범위가 10~27MHz라는데,
STK1002에는 12MHz와 20MHz를 사용했다. STK1000용 예제 소스를 변경없이 테스트 해봤으면 하니까 일단은 12와 20MHz로 결정한다. 수납시 얼마든지 변경하니까 중요하지도 않구만.
그리고 STK1002에 사용된 커넥터를 구할수 있을지 몰것네.
이제 회로도 작업을 시작해보자.

2007/07/31

A Book On C Chapter 6 연습문제 8번.

다음 프로그램은 어떤 값을 출력하는가? 설명하여라.

#include
typedef unsigned long ulong;

int main(void)
{
char *pc = NULL;
int *pi = NULL;
double *pd = NULL;
long double *pld = NULL;

printf("%5lu%5lu\n%5lu%5lu\n%5lu%5lu\n",
(ulong)(pc+1), (ulong)(pi+1),
(ulong)(pd+1), (ulong)(pld+1),
(ulong)(pc+3), (ulong)(pld+3));

return 0;
}

NULL은 0번지를 포인터하므로 pc, pi, pd, pld는 초기화 후에 0 값을 가진다.
pc+1 : pc는 char형 포인터이므로 1바이트 증가
pi+1 : pi는 int형 포인터이므로 4바이트 증가
pd+1 : pd는 double형 포인터이므로 8바이트 증가
pld+1 : long double형은 12바이트인거 같다.
pc+3 : 3바이트 증가
pld+3 : 36바이트 증가

2007/07/26

Process문

하드웨어 시스템의 모듈들은 서로간에 병행적으로 수행되므로 시스템의 동작으로 표현하기 위해서는 일반적으로 concurrent문을 사용하는 것이 바람직하다. 그리고 그 내부의 동작은 순차적으로 이루어진다고 볼 수 있으므로 sequential문을 사용하는 것이 좋다. Process문 자체는 concurrent문이므로 여러개의 process문이 있으면 이들은 병행적으로 수행되며, process문 내부는 하나씩 차례로 수행되는 sequential문으로 표현된다.
Process문의 구조는 다음과 같다.

[프로세스 레이블 : ]
process [(sensitivity_list)]
{선언문}
begin
{sequential문}
end process [프로세스 레이블];

2007/07/25

A Book On C Chapter 6 연습문제 7번.

만일 주소를 16진수 대신 10진수로 출력하여 보기 원한다면, 주소를 unsigned long으로 캐스트하고 %lu 형식을 사용하는 것이 안전한 방법이다. 연습문제 6번의 printf()문을 다음과 같이 수정하여 실행하여 보아라.

printf("%s%lu \n%s%lu \n%s%lu \n",
"&a = ", (unsigned long) &a,
"&b = ", (unsigned long) &b,
"&c = ", (unsigned long) &c);

명심하기만 하면 이 문제는 끝?

2007/07/24

A Book On C Chapter 6 연습문제 6번.

다음 프로그램은 %p 형식을 사용하여 어떤 주소들을 출력한다.

#include

int main(void)
{
int a = 1, b = 2, c = 3;
printf("%s%p \n%s%p \n%s%p \n",
"&a = ", &a,
"&b = ", &b,
"&c = ", &c);

return 0;
}

변수 a, b, c가 초기화되지 않았다면, 프로그램은 동일한 결과를 출력하겠는가?
%p를 %d로 수정하면, 어떻게 되겠는가? 컴파일러는 오류 메시지를 출력하겠는가?
가능하다면, 프로그램을 MS-DOS 시스템에서 실행해 보아라. 포인터는 4바이트이고 int는 2바이트이기 때문에, %d 형식은 적절하지 않을 것이고, 음수 값이 출력되는 원인일 수 있다.


실행결과
&a = 0x22cce4
&b = 0x22cce0
&c = 0x22ccdc
변수 a, b, c가 초기화되지 않더라도 동일함

%p를 %d로 수정해도 warnning이나 error은 발생하지 않음. MS-DOS 깔린 시스템이 요새 어딧나
확실히 %d 형식에선 오버플로/언더플로가 발생할 가능성도 있을것 같다.

2007/07/20

A Book On C Chapter 6 연습문제 5번.

변수가 선언되면, 그 변수들이 연속적인 메모리에 위치하는가? 다음과 같은 선언을 갖는 프로그램을 작성하여라.
char a, b, c, *p, *q, *r;
그리고 컴파일러에 의해 이 변수들이 배정된 메모리 위치를 출력하여라. 메모리 위치는 순서적인가? 만일 순서적이라면, 증가하는 순서인가 아니면 감소하는 순서인가? 각 포인터 변수의 주소는 4로 나누어지는가? 만일 그렇다면, 각 포인터 값은 기계 워드에 저장됨을 의미하는 것일 것이다.

메모리 위치는 4배수로 감소. 기계 워드는 4Byte(32Bit)를 의미하는것 같다.

2007/07/19

A Book On C Chapter 6 연습문제 4번.

i와 j는 int형이고, p와 q는 int형 포인터라면, 다음의 배정 수식 중 잘못된 것은 어느것인가?

p = &i : 장담하건데 퍼펙트한 수식이다.
p = &*&i : 장담하건데 퍼펙트한 수식이다.
i = (int)p : 또 장담하건데 퍼펙트하다. 둘 다 바이트수가 동일하니까
q = &p : int 형의 포인터의 포인터를 int 형의 포인터에 배정하는건 warning이지만 (int *)&p라면 퍼펙트할것이다.
*q = &j : int형의 포인터를 역참조한 곳에 int형의 주소값을 배정한다? int형에 int의 포인터를 배정한다는 건데 이건 warning을 만들어낸다.
i = (*&)j : (*&)은 아무런 의미가 없다. (+)j도 (-)j도 문법상 오류.
i = *&*&j : 퍼펙트
i = *p++ + *q : 퍼펙트

2007/07/18

A Book On C Chapter 6 연습문제 3번.

다음 프로그램을 보자.

#include
#include

int main(void)
{
int a, b, *p = &a, *p = &b;

ptrdiff_t diff = p - q;
printf("diff = %d\n", diff);


return 0;
}
ANSI C에서, 두 포인터 수식의 차는 부호있는 정수적형이어야 한다. 대부분의 UNIX 시스템에서 그 형은 int이고, 대부분의 MS-DOS 시스템에서 그 형은 long이다. 모든 ANSI C 시스템에서, 그 형은 표준 헤더 파일 stddef.h에 다음과 같은 형 선언으로 주어진다.
typedef type ptrdiff_t;
현재 사용하고 있는 시스템의 stddef.h에서 이 typedef를 찾아보면, diff의 형을 알게 될 것이다. diff가 int형이면 printf() 문에서 %d가 적절할 것이고, long 형이면 %ld가 적절할 것이다. 이 프로그램을 수행한 후 그 효과를 이해하여라. 그 후 프로그램에 다음과 같은 두 행을 추가하여라.
diff = p - (int *)0;
printf("diff = %d\n", diff);
기대했던 출력값이 나왔는가? 이것을 통해 연습문제 2번에서 논의한 컴파일러의 경고가 발생한 이유를 이해하겠는가? 설명하여라. 만일 int *를 ptrdiff_t *로 대치한다면, 프로그램은 다르게 동작하겠는가?


내 컴에 깔린 cygwin gcc를 확인해보면
#ifndef __PTRDIFF_TYPE__
#define __PTRDIFF_TYPE__ long int
#endif
typedef __PTRDIFF_TYPE__ ptrdiff_t;
ptrdiff_t는 long int 데이터 타입이다.
...
단순히 ptrdiff_t는 long 타입의 데이터 형이다.
포인터 연산 결과가 오버 플로우 되는것을 방지하기 위한건가?
포인터 연산의 결과는 데이터 형의 갯수로 평가되는데...굳이 이럴 필요가 없다고 생각되는데...
하긴 char 타입의 경우엔 필요할 수도 있겠군.
일단 여기까지만 생각.

2007/07/17

A Book On C Chapter 6 연습문제 2번.

컴파일러 중 어떤 것은 연습문제 1번의 수식 p - (p - 2)에 대하여 정수 오버플로에 관한 경고를 낸다. 연습문제 1번에서 작성한 프로그램을 수정하여 p와 p - 2 값을 출력하도록 하여라. 정수 오버플로가 발생하겠는가?(더 자세한 내용은 다음 연습문제를 참조하여라.)

#include
int main(void)
{
char *format = "%p %d %d %d %d %d\n";
int i = 3;
int *p = &i;
printf(format, p, *p + 7, 3 * **&p + 1, 5 * (p - (p - 2)), p, p - 2);

return 0;
}

출력은
0x22cce0 10 10 10 2280672 2280664

포인터 연산 시 '+'를 사용한다면 오버플로가 생길 가능성이 있어보인다.
'-'를 사용한다면 언더플로가 생길 가능성이 있을 것이고.

2007/07/16

A Book On C Chapter 6 연습문제 1번.

다음 코드를 실행시키면 4개의 값이 출력된다. 이것들 중 같은 값들은 몇 개인가?
답에 대해 설명하여라.

char *format = "%p %d %d %d\n";
int i = 3;
int *p = &i;
printf(format, p, *p + 7, 3 * **&p + 1, 5 * (p - (p - 2)));


printf("%p %d %d %d\n", p, *p + 7, 3 * **&p + 1, 5 * (p - (p - 2)));


- p : int 포인터 변수 p의 값. int 변수 i의 주소가 입력되있다.
- *p + 7 : int 포인터 변수 p를 역참조 후 plus 7. 3 + 7 = 10.
- 3 * **&p + 1 : int 포인터 변수 p의 주소값을 역참조 역참조 . 결국 int 포인터 i값을 가리킴. 3 * 3 + 1 = 10.
- 5 * (p - (p - 2)) : p - (p - 2) -> 2? 10일거라고 생각됨


Powered by ScribeFire.

2007/07/10

Entity

entity 선언부 및 architecture body로 이루어진다.
entity 선언부는 외부에서 이 컴포넌트가 어떻게 보일지를 기술한다.
architecture body는 해당 컴포넌트의 내부 모습을 RTL로 기술한다.

2007/07/09

A Book on C : function의 용도?


프로그램을 여러 개의 작은 함수들로 작성하는 데는 다음과 같은 몇 가지 중요한 이유가 있다.
한 가지 일만을 수행하는 작은 함수를 정확히 작성하는 것은 더욱 간단하다. 프로그램의 작성이나 디버깅 모두를 쉽게 할 수 있다. 이러한 프로그램은 유지와 수정도 더 쉽다. 수정이 필요 없는 코드들은 정확히 동작한다고 기대해도 되기 때문에, 수정이 필요한 함수들만 쉽게 수정할 수 있다. 또한 작은 함수는 그 자체로 문서화가 되고, 이해하기도 쉽다. 경험적으로 보면 각 함수를 한페이지 정도의 길이로 작성하는 것이 좋다.

Powered by ScribeFire.

2007/06/24

1 page proposal

아마도 오래 전에 1 page proposal 이라는 책이 출간되면서 이런 포스팅을 한적이 있다. 알려주는 방식대로 착하게 실행을 하였다. 항목별로 꼼꼼히 채워가려고 노력을 많이 했다. 수학에 정석이 있듯이 기획제안서에도 정석이 있는 것처럼 말이다.
처 음에 시작할때는 위에서 제시한 폼대로 1 page에 무엇을 담아야 할지 많은 고민과 학습이 있었는데 몇번 시도하다 보니까 스스로가 정리가 된다..물론 친절하게 책에서 가르쳐준데로 하면 베스트이겠지만 때론 상황에 따라 맞지 않는 경우도 종종 있다. 그럴때마다 아래와 같이 약간 변형해서 나만의 1 page proposal로 만들어서 제안을 하곤 하는데 내 생각을 정리해서 좋고, 나의 의견을 전달할때 간결해서 좋다라는 생각이 든다.
타이틀 처럼 1 page로 함축시켜서 메세지를 전달해주면 가장 좋은데 그렇지 않을 경우는 2장 짜리도 괜찮은것 같다. 기획서가 시를 쓰는 것도 아니고 너무 함축해서 표현하면 내용이 왜곡되어 전달될 가능성이 있으니까 말이다. 지금은 위의 스타일로 변형해서 팀간(부서간) 커뮤니케이션을 자주 하곤한다.

2007/06/22

고진샤 K600


고진샤의 신제품 미니 노트북 발표회


고진샤 K600 시리즈 블랙 모델


고진샤 K600 시리즈 화이트 모델


또한 이동성과 사용상의 편의성을 고려해 회전 스크린과 터치 스크린 방식이 지원돼 업무용 노트북을 비롯 게임과 동영상, 음악 감상 등의 엔터테이먼트 기능도 보다 편리하게 즐길 수 있다는 장점을 가지고 있다.




회전 방식의 7인치 와이드 LCD가 적용된 K600 시리즈


간편한 터치 스크린 방식


인텔의 저전력 프로세서 A100(ICH7U/인텔 945GU)가 내장돼있으며, 0.99Kg의 초경량급 무게와 최대 7시간의 배터리 등은 미니 노트북으로써의 활용도를 극대화시켜 이동이 잦은 사용자들에게 좋은 선택이 될 것으로 보인다.


0.99kg의 쵸경량급 무게와 최대 7시간의 배터리 사용량


LCD 양 옆으로는 마우스 포인트와 화면 밝기 등 다양한 기능을 컨트롤 할 수 있는 버튼이 위치하고 있어 제한된 공간에서도 요긴하게 사용이 가능하며, LCD 중앙 상단 부분에는 130만 화소의 WEB 캠이 위치하고 있다.



스크린 양 옆으로 위치한 버튼


한 가지 재미있는 특징을 꼽자면 노트북 후면으로 여성 핸드백의 손잡이와 같은 가죽 재질의 손잡이가 달려 있다는 점이다. 이는 이동시 편의성을 감안한 제작사의 배려로 볼 수 있으며, 노트북의 심플한 디자인으로 미루어 보았을 때 특히나 여성 유저들에게 많은 인기를 끌 수 있는 아이디어라 할 수 있을 것이다.




노트북 후면에 장착된 손잡이로 휴대성을 높였다.


이밖에도 윈도우 비스타 운영체제를 사용하는 본 제품은 지상파 DMB와 차량용 네비게이션 프로그램(시터스의 루신 이지윙스)이 탑재돼 있으며, 블루투스를 지원하고 CF 카드 슬롯이 장착돼 있다는 점을 특징으로 꼽을 수 있다.


지상파 DMB와 차량용 네비게이션 프로그램이 탑재


기타 메모리로는 512MB/1GB(DDR2 PC-4200)를 사용하고 있으며, 하드 디스크의 용량은 각각 80GB와 100GB를 사용하고 있고 가격은 80만원 중반대이다. 과연 고진샤의 SA시리즈에 이은 두번째 미니 노트북 K600 시리즈가 국내 소비자들에게 얼마만큼의 반향을 불러일으킬지 그 귀추가 주목된다.

2007/06/14

win FLP와 null.sys

FLP에서는 비주얼 스튜디오 컴파일시 NULL 디바이스 에러가 발생한다.

오늘 하루 그냥 공 쳤다.





Powered by ScribeFire.

Eclipse CDT

꼭 cygwin을 깔아서 써라

mingW는 쓸 생각 하지마라

난 복잡한 설정같은거 질색이다





Powered by ScribeFire.

2007/06/12

volatile

volatile의 경우 어떤 의미에서는 앞에서 설명한 컴파일러의 최적화와 관계있습니다. 그 외에도 CPU 내, 외부의 캐쉬와 갈은 하드웨어적인 최적화와도 관계가 있습니다.

volatile 키워드가 가장 많이 사용되는 경우의 하나가 memory-mapped I/O인 경우입니다. 메모리의 특정 영역을 특정 장치와 연결하여 사용하는 방법입니다. 가장 흔한 예가 비디오 메모리가 되겠고, 그 이외에도 많은 장치들을 이러한 식으로 사용될 수 있습니다.

즉, 자신 엄밀하게 말한다면 컴파일러가 컴파일하고 있는 코드의 상황과는 관계 없이 바뀔 수 있는 메모리 변수가 있다면, 해당 변수에 대해 특별한 최적화를 하지 못하도록 컴파일러를 제약하는 키워드가 volatile입니다.

예를 들어, 0x0C000000 번지에 특별한 장치가 있다고 하겠습니다. 이 장치가 일종의 센서라고 하고 입력되는 센서값의 범위에 따라 다른 동작을 수행하게 프로그래밍을 아래와 같이 하였다고 하면,

int *p = 0x0C000000;

while (1) {

if (*p == 0) {
break;
} else if (*p < lower_limit) {

action 1;
} else if (*p < upper_limit) {

action 2;
}
wait 10 mili-seconds
}


똑똑한 컴파일러는 위의 코드를 아래와 아래와 같이 바꿉니다.


int *p = 0x0C000000;

register int pvar = *p;
if (pvar == 0) {

} else if (pvar < lower_limit) {

while (1) {
action 1;
wait 10 mili-seconds;
}
} else if (pvar < upper_limit) {

while (1) {
action 2;
wait 10 mili-seconds;
}
}


위와 같이 코드가 변형된다면, 프로그래머가 의도한 바와는 다른 결과가 나타나게 됩니다. 이러한 최적화를 억제하는 목적으로 volatile을 사용합니다. 컴파일러는 volatile 키워드가 선언된 변수에 대해서는 무조건 메모리에 접근하여 됩니다. 이러한 memory-mapped I/O 이외에도, 쓰레드 등으로 프로그램을 만들어서 공유변수를 한쪽에서 읽고, 한쪽에서 쓰는 경우도 해당될 수 있으며, 시스템 시간과 같이 특정 위치의 변수값이 자신과는 독립적으로 계속 변하는 경우에도 사용할 수 있습니다.

또는 CPU 내 외부의 캐쉬에 의해서도 이러한 최적화 효과가 나타날 수 있습니다. 캐쉬내에 해당 메모리 번지 값이 저장되어 읽을 때마다 같은 값이 읽히고, 또한 적을 때도 실제 메모리에 저장되지 않고 캐쉬에 임시 보관될 수 있습니다. 다른 경우는 잘 모르겠지만 MIPS의 R 시리즈 CPU에서는 (아마 2000 인가 3000 시리즈로 기억됩니다) 메모리를 두가지 방법으로 접근할 수 있습니다. 메모리 주소의 최상위 비트가 0이면 캐쉬를 거친 일반적인 접근을, 최상위 비트가 1이면 똑같은 주소의 메모리를 캐쉬를 거치지 않고 직접 접근할 수 있습니다. 당연히 이런 컴퓨터의 컴파일러에서 volatile로 선언하면 0C000000이 아니라 8C000000의 메모리를 접근하게 됩니다.



Powered by ScribeFire.

2007/06/08

GCC에선 함수 중첩도 된다

5.4 Nested Functions




A nested function is a function defined inside another function.
(Nested functions are not supported for GNU C++.) The nested function's
name is local to the block where it is defined. For example, here we
define a nested function named square, and call it twice:

     foo (double a, double b)

{

double square (double z) { return z * z; }



return square (a) + square (b);

}


The nested function can access all the variables of the containing
function that are visible at the point of its definition. This is
called lexical scoping. For example, here we show a nested
function which uses an inherited variable named offset:

     bar (int *array, int offset, int size)

{

int access (int *array, int index)

{ return array[index + offset]; }

int i;

/* ... */

for (i = 0; i < size; i++)

/* ... */ access (array, i) /* ... */

}


Nested function definitions are permitted within functions in the places
where variable definitions are allowed; that is, in any block, mixed
with the other declarations and statements in the block.

It is possible to call the nested function from outside the scope of its
name by storing its address or passing the address to another function:

     hack (int *array, int size)

{

void store (int index, int value)

{ array[index] = value; }



intermediate (store, size);

}


Here, the function intermediate receives the address of
store as an argument. If intermediate calls store,
the arguments given to store are used to store into array.
But this technique works only so long as the containing function
(hack, in this example) does not exit.

If you try to call the nested function through its address after the
containing function has exited, all hell will break loose. If you try
to call it after a containing scope level has exited, and if it refers
to some of the variables that are no longer in scope, you may be lucky,
but it's not wise to take the risk. If, however, the nested function
does not refer to anything that has gone out of scope, you should be
safe.

GCC implements taking the address of a nested function using a technique
called trampolines. A paper describing them is available as

http://people.debian.org/~aaronl/Usenix88-lexic.pdf.

A nested function can jump to a label inherited from a containing
function, provided the label was explicitly declared in the containing
function (see Local Labels). Such a jump returns instantly to the
containing function, exiting the nested function which did the
goto and any intermediate functions as well. Here is an example:

     bar (int *array, int offset, int size)

{

__label__ failure;

int access (int *array, int index)

{

if (index > size)

goto failure;

return array[index + offset];

}

int i;

/* ... */

for (i = 0; i < size; i++)

/* ... */ access (array, i) /* ... */

/* ... */

return 0;



/* Control comes here from access

if it detects an error.
*/

failure:

return -1;

}


A nested function always has no linkage. Declaring one with
extern or static is erroneous. If you need to declare the nested function
before its definition, use auto (which is otherwise meaningless
for function declarations).

     bar (int *array, int offset, int size)

{

__label__ failure;

auto int access (int *, int);

/* ... */

int access (int *array, int index)

{

if (index > size)

goto failure;

return array[index + offset];

}

/* ... */

}





Powered by ScribeFire.

2007/04/16

귀찮은 일

Sourcenav와 Subversion을 사용하기로 한다.
숨쉬는것도 귀찮은 판국에...

2007/03/27

반성

술쳐먹고 당구치고 늦게 들어와서
아무것도 못하고 디비 쳐잔거
아주 심각하게 반성중이다.

그리고 PCBANK 24인치 오체 주문했다.

2007/03/26

널리 세상을 이롭게하라

이런건 좀 마구마구 펌질해도 된다구우.
땜쟁이에게 광명을~~


Question:
Why is it not possible to program my SAM7S32, SAM7S321 and SAM7S64 microcontroller with IAR 4.41A?

Answer:
There is a function missing in an initialization file used by IAR to program the SAM7S32, SAM7S321 and SAM7S64 parts.
Here are the steps to solve this issue:
a) Open the FlashAT91SAM7Sx.mac file under the IAR installation path: IAR Systems\Embedded Workbench 4.41A Kickstart\ARM\config\flashloader\Atmel\
b) The following function is missing: execUserSetup. Add it at the end of the file:
execUserSetup()
{
__writeMemory32(0x0D3,0x98,"Register");
__message "----------------------Set PC ---------------------------";
__writeMemory32(0x00000000,0xB4,"Register");
}

uTorrent

eztv와 함께 사용하면 쓸만한데...
RSS로 업데이트를 알려주는것도 맘에 들고

근데 회사에선 다운받지 말기로 하자.

오늘부터 난 블로거다

일단 시작하고 보는거다

디카를 사야겠군