본문 바로가기
코스웨어/15년 스마트컨트롤러

A/D 컨버터를 활용한 LCD문자.. / 메모리의 동적 할당, C언어의 메모리 구조

by 알 수 없는 사용자 2015. 5. 6.
728x90
반응형

오전 이승규 강사님 수업

A/D 컨버터를 활용한 LCD에 문자 출력하기

================================ Outline ====================================

가변저항 읽는 법

ADC 잡음제거 방법

ADC 실습 - LCD에 문자 출력하기

----------------------------------------------------------------------------

지난 시간에 ATmega2560에서 입력 PORTA로 하였는데 F PORT로 수정해 주어야 제대로 출력이 될 것이다.

<ADC 실습 - LCD에 문자 출력하기>

ASCII Code를 이용하여 LCDABCD..를 차례대로 띄워보자.

<가변저항 읽는 법>

ex) 474

47 * 10

그러므로 470kΩ

가변 저항은 파여진 홈을 이용하여 저항 값을 조절할 수 있다. (turn)가 적은 가변 저항일수록 저항 값의 미세조정이 힘들고, 턴수가 많은 가변 저항일수록 미세조정이 가능하다.

 

클럭(clock)16MHz인 분주비가 32일 때 500kHz이다.

분주비가 빠를수록 빠른 속도로 입력 값을 읽어 들인다.


아날로그 입력은 크게 16가지의 단극성 입력과 44가지 종류의 차동입력으로 구분되고, 차동 입력은 다시 4가지의 경우로 나누어진다.

양자화 오차란,

표현 가능한 영역으로 데이터를 표현하였지만 실제 데이터와 차이가 나는 값을 일컫는다.

 

Thermocoupler K type

※ AVR 교재 p294 - 잡음제거 방법

- 우선 가능한한 신호선을 짧게 하여 노이즈 발생 가능성을 낮춘다.

- 데이터선 주변에 GND로 감싸준다.

- 읽어 들인 값의 평균처리

※ ADC 실습 - LCD에 문자 출력하기

/*** 회로 ***/

<!--[if !supportEmptyParas]--> <!--[endif]-->

/*** 코드 ***/

<!--[if !supportEmptyParas]--> <!--[endif]-->

<main.c>

#include "SMART.h"
#include <Turboc.h>
#include <stdio.h>


int main(void)
{
  /* 변수 설정 */

  unsigned char i;
  unsigned int sum;    
  unsigned char ucASC=0;

  /* PORT 설정 */
  DDRF = 0xFE;    // F Port 0번 핀 입력
  DDRC = 0xFF;  // C Port 모두 출력
  DDRG = 0xFF;  // G Port 모두 출력
  

  /* ADC 레지스터 설정: 초기화 */

  //ADCSRA = 0x00;  // disable adc
  ADCSRA = 0x85;     // Enable adc, 분주비 32-> 500kHz
  ADCSRB = 0x00;    // free running mode
  ADMUX   = 0x40;     // select adc input 0

  LCD_Init();

  srand(rand(NULL));
  
  
  while(1)
  {
    sum = 0;
    for(i=0; i<16; ++i)
    {
      ADCSRA = 0xD5;
      while((ADCSRA & 0x10) != 0x10);
      sum += ((((int) ADCH<<8))+(int)ADCL);  
      // 두개의 레지스터는 한 byte씩 차지하고 있기 때문에 
      // 상위 비트와 하위 비트를 구분하기 위한 코드
      
    }
    sum >>= 4;  // sum = sum / 16, 아날로그 신호의 평균값을 내준다.

      while(PINF==0)
      {
        while(PINF == 1)
        {
          ucASC += PINF;
          sum = ucASC + 47;
          LCD_Data(sum);
          break;
        }
        
        if(sum== 58)
        {
          ucASC=0;
          break;
        }
    }
  }
  

  return 0;
}

 

오후 주수홍 강사님 수업

 

※ 메모리의 동적 할

 

라즈베리 파이로 int a 변수 만든다음 변수 주소를 찍기!

 

※ 보안옵션 끄기 옵션(주소값 고정됨)

라즈베리 : sysctl -w kernel.randomize_va_space=0

DOS : cl main.c /link /dynamicbase:no

마우스 오른쪽 버튼으로 복사하지 말고 오늘은 yy(복사)키와 pp(붙여넣기)키를 이용해서 할 것!!

 

 

printf밑에 Smart 함수 호출해서 인자를 200, 100으로 바꾼다. 

 

 

 

라즈베리로 했던 소스 메모장으로 옮겨라!

 

- 랜덤스택이란, 프로그램이 실핼 될 때마다, 프로세스 내부에

   함수 주소 및 스택, 힙의 주소가 랜덤하게 바뀌는 것이다.

   해제 하기위해선, 루트권한이 필요 하다.

 

※ C언어의 메모리 구조

코드영역은 영어 표기로 Code 또는 Text 영역이라고 부른다.

메모리의 HEAP영역에 대해 알아보자.

 

 

 

- 함수를 만들게 되면 기본적으로 다음 함수의 base point

   해당 함수가 끝났을 때 다음 함수로 넘어가는 주소가 저장된다.

   때문에 메모리의 주소를 최소화하기 위해서는 인자를 여러 개를

   넣는 것 보다는 인자가 존재하는 주소를 입력해 주는 것이

   메모리를 줄이는데 효과적이다.

 

 

※  다음 함수의 return 포인트를 활용하여 해킹을

     할 수도 있다.

 

/*** 소스 ***/

#include <stdio.h>
volatile unsigned int uiCnt;
void hackhack(void)
{

  while(1)
    for(uiCnt=0; uiCnt<40000; ++uiCnt);
}

void Hack(void)
{

  printf("해킹코드\n");
  hackhack();
}
  
void smart(int n2, int n1)
{
       int C;
       int D;
  int * p = &n2;
  p = p-1;
  *p = (int)Hack;

  
      printf("smart:n1:주소  [%08X]입니다.\n"&n1);
      printf("smart:n2:주소  [%08X]입니다.\n"&n2);
      printf("smart:C:주소  [%08X]입니다.\n"&C);
      printf("smart:D:주소  [%08X]입니다.\n"&D);
}
 
 
int main(void)
{
      int A;
      int B;

 
      printf("main:A:주소 [%08X]입니다.\n"&A);
      printf("main:B:주소 [%08X]입니다.\n\n"&B);
      smart(200100);
 
      printf("--------------------------------------------------\n");
 
      smart(200100);
 
      return 0;
 
}

 

 

p 542

변수의 생성과 소멸의 시기가 지역변수나 전역변수와 다른

유형의 변수는 mallocfree라는 이름의 함수를 통해서

(heap)영역에 할당하고 소멸할 수 있다.

 

 

malloc 함수(memory allocation)

#include <stdlib.h>

void * malloc(size_t size); // 힙 영역으로의 메모리 공간 할당

void free(void * ptr); // 힙 영역에 할당된 메모리 공간 해제

-> malloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환

malloc함수를 사용하기 위해서는 받은 주소를 저장하기 위한

포인트 변수가 필요하다.

 

p546 예제

 

동적 할당을 받은 후 free 함수로 해지 않고 덮어쓰는 경우 덮어

씌워진 경우 해당 메모리는 어딘가에 살아있다. 때문에 반드시

malloc함수를 사용하고 나서는 덮어 쓰지 않고 free함수로 할당

받은 메모리를 반환하여야 한다.

 

calloc 함수

#include <stdlib.h>

void * calloc(size_t elt_count, size_t elt_size);

-> calloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환

블록 크기(elt_count) * 개수(elt_size)

ex) calloc(10, 30)

10byte블록을 30개 생성 -> 300bytes

calloc 함수 구현

 

realloc 함수

#include <stdlib.h>

void * realloc(void * ptr, size_t size);

-> 성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환

구현은 malloc을 활용하여 기존 동적 할당의 내용을 새로 받은

동적할당 영역에 복사하고 free를 활용하여 기존 동적 할당 내용

을 없앤다.

 

 

728x90