==========================================================================================
네트워크
=======================================================================================
<C>
=교환법칙 ( 이런 문법을 허용함)
#include <stdio.h>
int main() { int A[5] = {1, 2, 3, 4, 5};
printf("A[2] : [%d]\n", A[2]); printf("2[A] : [%d]\n", 2[A]); return 0; } |


=2차원 배열
-int A[3][4];

주소
&A[1][2]
A[1]+2
*(A+1)+2
값
*(&A[1][2]) => A[1][2]
*(A[1]+2)
*(*(A+1)+2)
=2차원 배열의 초기화
#include <stdio.h>
int main(void) { int i, j;
//2차원 배열 초기화의 예 1 int arr[3][3]={ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; //2차원 배열 초기화의 예 2 int arr2[3][3]={ {1}, {4, 5}, {7, 8, 9} };
//2차원 배열 초기화의 예 3 int arr3[3][3]={1,2,3,4,5,6,7};
for(i=0; i<3; ++i) { for(j=0; j<3;++j) { printf("%d ", arr[i][j]); } printf("\n"); } printf("\n"); for(i=0; i<3; ++i) { for(j=0; j<3;++j) { printf("%d ", arr2[i][j]); } printf("\n"); } printf("\n");
for(i=0; i<3; ++i) { for(j=0; j<3;++j) { printf("%d ", arr3[i][j]); } printf("\n"); }
return 0; } |


=2차원 배열 초기화시
int A[][]={1, 2, 3, 4, 5, 6, 7, 8};
int A[][]={1, 2, 3, 4, 5, 6, 7, 8};
int A[][]={1, 2, 3, 4, 5, 6, 7, 8};
=3차원 배열 => 주로 오락에 사용(2차원 map)

=3차원 배열
#include <stdio.h>
int main(void) { int mean = 0, i, j; int record[3][3][2]={ { {70, 80}, //A학급 학생 1의 성적 {94, 90}, //A학급 학생 2의 성적 {70, 85} //A학급 학생 3의 성적 }, { {83, 90}, //B학급 학생 1의 성적 {95, 60}, //B학급 학생 2의 성적 {90, 82} //B학급 학생 3의 성적 }, { {98, 89}, //C학급 학생 1의 성적 {99, 94}, //C학급 학생 2의 성적 {91, 87} //C학급 학생 3의 성적 }, };
for(i = 0; i < 3; ++i) for(j = 0; j < 2; ++j) mean += record[0][i][j]; printf("A 학급 전체 평균: %g \n", (double)mean/6);
mean = 0; for(i = 0; i < 3; ++i) for(j = 0; j < 2; ++j) mean += record[1][i][j]; printf("B 학급 전체 평균: %g \n", (double)mean/6);
mean = 0; for(i = 0; i < 3; ++i) for(j = 0; j < 2; ++j) mean += record[2][i][j]; printf("C 학급 전체 평균: %g \n", (double)mean/6);
return 0; } |


=포인터의 포인터
#include <stdio.h>
int main() { int A = 3; int * P = &A; int ** PP = &P; int ***PPP = &PP;
printf("&A : [%08X] \n", &A); printf("&P : [%08X] \n", &P); printf("&PP : [%08X] \n\n", &PP);
printf("A : [%08X] \n", A); // A의 값 printf("P : [%08X] \n", P); // P의 값 = A의 주소 printf("PP : [%08X] \n\n", PP); // PP의 값 = P의 주소
// printf("A : [%08X] \n", A); // A의 값 printf("*P : [%08X] \n", *P); // P의 값(A의 주소)찾아감 => A의 값 printf("*PP : [%08X] \n\n", *PP);// PP의 값(P의 주소)찾아감 => A의 주소
// printf("A : [%08X] \n", A); // A의 값 // printf("*P : [%08X] \n", *P); // P의 값(A의 주소)찾아감 => A의 값 printf("**PP : [%08X] \n\n", **PP); // PP의 값(P의 주소)찾아감 (A의 주소) 찾아감 => A의 값
printf("***PPP : [%08X] \n\n", ***PPP);// PPP의 값(PP의 주소)찾아감...
return 0; } |


=더블 포인트 변수
#include <stdio.h>
int main(void) { double num =3.14; double * ptr = # double **dptr = &ptr; double *ptr2;
printf("%9p %9p \n", ptr, *dptr); printf("%9g %9g \n", num, **dptr); ptr2 = *dptr; // ptr2 = ptr 과 같은문장 *ptr2 = 10.99; printf("%9g %9g \n", num, **dptr);
return 0; } |


=포인터 변수 대상의 Call-by-reference
#include <stdio.h>
void SwapIntPtr(int *p1, int *p2) { int * temp = p1; p1 = p2; p2 = temp; return; }
int main(void) { int num1 = 10, num2 = 20; int *ptr1, *ptr2; ptr1 = &num1, ptr2 = &num2; printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);
SwapIntPtr(ptr1, ptr2); printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2); return 0; } |


<Raspberry Pi>
-도면
https://www.raspberrypi.org/model-b-revision-2-0-schematics/
-DC
R - 전류 방해
L - 선 연결
C -선 끊김
-AC
R - 전류 방해
L - 저항으로 작용
C - 선 연결
-







==========================================================================================
AVR
=======================================================================================
=AVR2560
=다중 인터럽트
인터럽트 2개 서로 상반되게
INT4 : Count Up
INT5 : Count Down
인터럽트 중 다른 인터럽트 발생


= SREG : I => 1 (인터럽트 허용 ENABLE) => 인터럽트(INT 5) 발생/요청/허용/루틴 실행O => I => 0 (인터럽트 허용 DISABLE) => 다른 인터럽트(INT 4) 발생/요청/불가/루틴 실행X => 인터럽트(INT 5) 루틴 RETURN => I => 1 (인터럽트 허용 ENABLE) => 다른 인터럽트(INT 4) 발생/요청/허용/루틴 실행O
= 다중 인터럽트 가능하도록 인터럽트(INT 5) 발생/요청/허용/루틴 실행O => I => 0 (인터럽트 허용 DISABLE) => I => 1 (인터럽트 허용 ENABLE) => 다른 인터럽트(INT 4) 발생/요청/허용/루틴 실행O
= 실행 중인 INTERRUPT(INT 5) 보다 우선순위 높은 INTERRUPT(INT 4) 발생/요청 => 인터럽트(INT 4) 허용/루틴 실행O
= 실행 중인 INTERRUPT(INT 5) 보다 우선순위 낮은 INTERRUPT(PCINT 0) 발생 => 다른 인터럽트(INT 4) 불가/루틴 실행X





=ISR_Enable()함수 추가 전
-NT 5 -> INT 4
<AVR2560.H>

<INTERRUPT.H>

<INTERRUPT.C>



<MAIN.C>

=결과 : (시뮬레이터 상에서는 ucSw (vector_6() / vector_7())에 따른 동작 확인 잘 안됨)
-INT 4 -> INT 5
-INT 5 -> INT 4
* 소스코드 작성시 주의사항
1. 출력 PORT 초기화를 가장 우선으로 했는가?
2. STACK POINT 번지지정 이상 없는가?
3. STACK 영역의 할당은 적절한가
4. RAM Clear 시 Interrupt가 발생한느가
5. vctor table의 address 및 label정의 적확한가
6. 입출력 포트의 입출력모드 레지스터 설정 정확
7. 입출력 포트 초기화
8. ....