2007/11/16
2007/11/11
2007/10/22
2007/10/21
2007/10/10
2007/10/06
AT32AP7000 프로세서 모듈 보드 Schematic 작업-1
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문
Process문의 구조는 다음과 같다.
[프로세스 레이블 : ]
process [(sensitivity_list)]
{선언문}
begin
{sequential문}
end process [프로세스 레이블];
2007/07/25
A Book On C Chapter 6 연습문제 7번.
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번.
#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번.
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번.
#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번.
답에 대해 설명하여라.
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는 해당 컴포넌트의 내부 모습을 RTL로 기술한다.
2007/07/09
A Book on C : function의 용도?
프로그램을 여러 개의 작은 함수들로 작성하는 데는 다음과 같은 몇 가지 중요한 이유가 있다.
한 가지 일만을 수행하는 작은 함수를 정확히 작성하는 것은 더욱 간단하다. 프로그램의 작성이나 디버깅 모두를 쉽게 할 수 있다. 이러한 프로그램은 유지와 수정도 더 쉽다. 수정이 필요 없는 코드들은 정확히 동작한다고 기대해도 되기 때문에, 수정이 필요한 함수들만 쉽게 수정할 수 있다. 또한 작은 함수는 그 자체로 문서화가 되고, 이해하기도 쉽다. 경험적으로 보면 각 함수를 한페이지 정도의 길이로 작성하는 것이 좋다.
Powered by ScribeFire.
2007/06/24
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/16
2007/06/15
2007/06/14
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 이외에도, 쓰레드 등으로 프로그램을 만들어서 공유변수를 한쪽에서 읽고, 한쪽에서 쓰는 경우도 해당될 수 있으며, 시스템 시간과 같이 특정 위치의 변수값이 자신과는 독립적으로 계속 변하는 경우에도 사용할 수 있습니다.
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 ofstore
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 thegoto
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 fromaccess
if it detects an error. */
failure:
return -1;
}
A nested function always has no linkage. Declaring one withextern
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/05/22
2007/05/21
2007/04/16
2007/03/27
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");
}