==========================================================================================

네트워크 

==========================================================================================


<C>











=gcc 컴파일 옵션 : 주소 고정

cat /proc/self/maps => 스택 실행권한 확인


sysctl -w kernel.randomize_va_space=0 랜덤X => 주소 고정










sysctl -w kernel.randomize_va_space=1 stack 랜덤

sysctl -w kernel.randomize_va_space=2 stack heap 랜덤


(gcc -o main-1 main-1.c -z execstack) - 스택실행권한

-fno-stack-protector

=

<C>

-CODE | TEXT 영역

-DATA

-BSS

-HEAP

-STACK


cdecl call

-cdecl 방식 : 뒤에서부터 넣는 방식

-std방식 :

std call


-메모리 확인

#include <stdio.h>

void smart(int N2, int N1)
{

  
int C;
  
int D;

  printf(
"smart 주소: %08X N1 주소 : %08X\n",smart , &N1);
  printf(
"smart 주소: %08X N2 주소 : %08X\n",smart , &N2);
 
  printf(
"smart 주소: %08X C 주소 : %08X\n",smart , &C); 
  printf(
"smart 주소: %08X D 주소 : %08X\n",smart , &D); 
 
  
return;
}
 
int main()
{
  
int A;
  
int B;
  printf(
"main 주소: %08X:A 주소 : %08X\n",main, &A);

  printf(
"main 주소: %08X:B 주소 : %08X\n",main, &B);
  smart(
200100);
 
  printf(
"--------------------------------\n");

  smart(
200100);
  
return 0;
}

-WIN





-LINUX






-Return Address 변경(호출곳 다음줄 대신 hack함수 주소로 변경)

#include <stdio.h>

void hack()
{
  printf(
"hacking code");
  getchar();
  
return;
}  

void smart(int N2, int N1)
{

  
int C;
  
int D;
  
int * P = &N2;
  P 
= P - 1;
  
  *P 
= (int)hack;

  printf(
"smart 주소: %08X N1 주소 : %08X\n",smart , &N1);
  printf(
"smart 주소: %08X N2 주소 : %08X\n",smart , &N2);
 
  printf(
"smart 주소: %08X C 주소 : %08X\n",smart , &C); 
  printf(
"smart 주소: %08X D 주소 : %08X\n",smart , &D); 
 
  
return;
}
 
int main()
{
  
int A;
  
int B;
  printf(
"main 주소: %08X:A 주소 : %08X\n",main, &A);

  printf(
"main 주소: %08X:B 주소 : %08X\n",main, &B);
  smart(
200100);
 
  printf(
"--------------------------------\n");

  smart(
200100);
  
return 0;
}





=> 키입력 => ERROR발생 ( RETURN 시점에서 에러발생함)





=HEAP 영역 - 동적할당(생성 / 소멸 수동으로 정해줌)


#include <stdlib.h>

void * malloc(size_t size); // 인자 : 필요한 크기 Return : 주소(void *)

void free(void * ptr); // 해제할 곳의 주소(할당 못받으면 0반환)


- void * => int * : 캐스팅 없이 바로 사용 가능


=malloc / free


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    
int * ptr1= (int *)malloc(sizeof(int));
    
int * ptr2 = (int*)malloc(sizeof(int)*7);
    
int i;

    *ptr1 
= 20;
    
for(i = 0; i< 7; ++i)
        ptr2[i] 
= i + 1;

    printf(
"%d \n",*ptr1);
    
for(i = 0; i < 7; ++i)
        printf(
"%d ", ptr2[i]);
    
    putchar(
'\n');
    free(ptr1);
    free(ptr2);
    
return 0;
}








int *P = malloc(4); // ---1

P = malloc(4);  //---2

free(P); //---2번 free

free(P); //---2번 free


==> 1번 할당된 메모리 프로그램 종료시 까지 살아있음 => 심각한 문제 발생 가능성 있음(메모리 누수)


=> 2번 메모리 할당전 반드시 1번 메모리 free 해주어야 함


int *P = malloc(4); // ---1

free(P); //---1번 free

P = malloc(4);  //---2

free(P); //---2번 free



=입력받는 개수만큼 할당도 가능


=calloc(개수, 크기) => clean : 0으로 채워줌

-my_calloc구현

#include <stdio.h>

void * my_calloc(size_t elt_count, size_t elt_size)
{
    
char * P;
    
int iCnt;
    P 
= malloc(elt_count * elt_size);
    
for(iCnt = elt_count * elt_size-1; iCnt >= 0 ; --iCnt)//조건식 * 계속 실행되지 않도록 (속도)
    {
        *(P+iCnt) 
= 0;
    }

    
return P;
}

int main()
{
        
    
return 0;
}



=realloc(주소, 크기)



==========================================================================================

AVR

==========================================================================================

=AVR2560






-트리거   : 잠깐 멈추는 모양

-프리러닝 : 오실로스코프 그냥 흘러가는 모양





















=가변저항

=RV(RESISTER VARIABLE) = Potentionmeter = Trimmer


- TURN 수 많을수록 정밀제어 가능







-RV






=단일 : 0~1023


=차동 : -512 ~ 511


=A/D 변환 오차 발생(선 -> 계단)

-양자화 오차


-오프셋 오차 : 같은모양인데 실제보다 늦게 입력되는 것.. 등

        : 같은모양인데 값이 일정량 차이나는 것.. 등


-이득 오차


-비선형 오차

-Thermocoupler K-type : 철사두개 용접해서 붙인 것 (직선 아니라 그래프가 꺾여 있거나 휘어져 있음)

        : 금속에따라 type 바뀜(온도에 따른 전압)





-차동 비선형 오차





=SNR  (Signal to Noise Ratio) : 신호대 잡음비

CCTV - 거리가 멀면 - (신호 작아짐 - 잡음 커짐) - 화면 잘 안나옴 -> 증폭기 설치시 잡음도 같이 커짐


=아날로그는 잡음에 약하다 => 잡음제거 방법

-아날로그 입력 신호선 짧게

        :선로주변에 그라운드 => 외부잡음 방지

        :선로주변에 홈을 파줌(PCB)

-AVCC에는 디지털 전원 VCC를 LC필터로 안정화시켜 인가

-GROUND Plane(4층기판)

-BYPASS (100nF) - 104(VCC단 가까이 붙여야함) (MAX 232 통신 드라이버에도 사용)

-AD 변환 수행되는 동안 스위칭하지 않는 것



-Idle mode/ ADC Noise Reduction mode에서 A/D 변환 수행하기

-디지털 필터 사용하거나 변환결과를 평균값 처리하기




=PCB

-양면기판 :TOP - BOTTOM

-4층기판(양면기판 + M + 양면기판) : TOP - Vcc  + GND Plane - BOTTOM



=



<AVR2560.H>




<LCD.H>




<LCD.C>




<USART.H>




<USAR.C>




<ADC.H>




<ADC.C>




<MAIN.C>




<MAKEFILE>




=결과










<<

=SERIAL 통신 안되는 환경에서 DATA들어오는지 LED연결해서 확인하는 법



=PWM (방향키 UP : LED 밝게 / DOWN : LED 어둡게)



=RTC ( REAL TIME CLOCK) : 시간정보출력

>>





==시험

-온도 및 조도 정보의 ADC 변환 기술 능력 평가

-Character LCD 제어 능력 평가

-시리얼 통신에 대한 처리능력 평가


=필기

-A/D

1.  A/D 레지스터

2.  입력버퍼 소비전력 절약

3.  동작설정 / 상태표시

4.  변환오차

5.  잡음제거

6.  USART 레지스터

7.  UBRR 계산

8. 

9.

10. 


=실기

-ADC 변환 기술, Character LCD제어, 시리얼통신

Character LCD TIMING 차트보기




'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150508  (0) 2015.05.08
20150507  (0) 2015.05.08
20150504  (0) 2015.05.04
20150501  (0) 2015.05.01
20150430  (0) 2015.04.30
Posted by ahj333
,