20130424

 _____________논리회로________________________________________________________

 

 전가산기

 

 

     ※  위의 Cout 수식은 카르노 맵으로 간소화 하지 않는 예외!!

 

 

 

 ※ 하나의 FA는 다음 FA에 crray값을 넘겨주고 3입력의 합과 같은 결과가 나옴.

 병렬 전가산기는 캐리 전파시간 때문에 느리다는 단점이 있음

 

 고속 가산기

 

 

     ※ 고속가산기는 병렬가산기의 속도가 느리다는 단점 개선

 

 

 

  감산기

 

 

 ※ 감산기는 뺄셈이라고 보는것 보다는 비교하여 차이를 나타내는것이라 보는게 좋음

     (같으면 0 다르면 1)

 ※ 결과적으로 보면 Diff는 가산기의 S(sum)과 같다.

 

 

 

 병렬 가감산기

 

 

  S에 0을 넣으면 가산기 ,  S에 1을 넣으면 감산기

  ※ S에 1을 넣어 감산기가 될때는 XOR 에 의해서  1의 보수가 취해져서 FA에 입력됨.

      C0 에도 1이 들어가서  자동적으로 2의 보수가 취해진다.

     S에 0 을 넣어 가산기가 될때는 XOR 에 의해서 원래의 입력값이 FA에 들어가게 됨. 

 

_________________________________________________________________________________________________________

 

 

 

 

 

 

______________ARM______________________________________________________________________________________

 

ADC 기초

 

 

ADC (Analog To Digital Converter)

 아날로그 신호

 

    

        

 

    

  아날로그 신호에서 샘플(점) 추출

 

 

 

 

 ▶ 샘플을 통해 디지털로 변환(재생)

 

 

 

샘플 : 시간단위와 전압 크기으로 구분하여 하나의 포인트를 추출한것

샘플링 : 샘플을 시변화에 맞춰 추출하는것

※ 아날로그 값에서 샘플을 추출할때 전압이 나누어진 단위에 못미치면 그 아래 값으로 한다.

  예> 위의 아날로그 그림에서 시간 3에서 전압값은 4는 넘지만 5에는 못 미치므로 샘플로 추출된 값은 4임.

전압을 세밀하게 나눌수록 분해능이 좋아짐( AT91SAM7S는 10비트까지 됨 )

※ 아날로그를 디지털로 바꾸면 원래값에서 손실을 가진다(손실압축)

 

 

_______________________________________________________________________________________________________________

 

 

 

 

 

_________________ C 수업________________________________________________________________________________________

 

 연결리스트에 많이 사용되는 함수들

 

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

 

typedef struct node
{
     char data;
     struct node *next;

 

}NODE;

 

//함수 원형들 ...

void print_list (NODE *);
int count (NODE *);
void loop_free (NODE *);
void free_list (NODE *);
void concatenate (NODE *, NODE *);
NODE *search(NODE *, char);
NODE *append (NODE *, NODE *);

 

 

int main()
{

 FILE *fp;
 
 NODE *temp = NULL;
 NODE *list = NULL;
 NODE *list2 = NULL;

 char ch;

 

  if((fp = fopen ("d10-5.dat", "r")) == NULL)
 {
       printf("file open error!");
       exit(-1);
 }

 fscanf(fp, "%c", &ch);

 

 while(!feof(fp))
 {
 
       temp = (NODE *) malloc (sizeof(NODE));

       temp->data = ch;

       temp->next = NULL;
 
       list = append (list, temp);
  
       fscanf(fp, "%c", &ch);
 }
 fclose(fp);

 

 if((fp = fopen ("d10-5.dat", "r")) == NULL)
 {
       printf("file open error!");
       exit(-1); 
 }

 

 fscanf(fp, "%c", &ch);

 

 while(!feof(fp))
 {
       temp = (NODE *) malloc (sizeof(NODE));

       temp->data = ch;
 
       temp->next = NULL;

       list2 = append (list2, temp);
  
       fscanf(fp, "%c", &ch);
 }
 fclose(fp);


 print_list(list);
 print_list(list2);

 concatenate (list, list2);

 print_list(list);

 temp = search(list, 'l');
 print_list(temp);


 printf("Number of list : %d\n", count (list));

 

 
 loop_free (list);
 //free_list (list2);
 

 return 0;

}

 


void print_list (NODE *head) //연결리스트를 인수로 넘겨받아 내용을 출력하는 함수
{
      if(head == NULL)
      {
             printf("NULL\n");
      }
      else
      {
             printf("%c ==> ", head->data);
             print_list(head->next);

      }
}

 

 

int count (NODE *head) //연결리스트의 노드의 갯수를 헤아리는 함수
{
      if(head == NULL)
      {
             return (0);
      }
      else
      {
             return (1 + count(head->next));

              //재귀 함수가 호출되며  NULL을 만날때까지 카운트하여 int형으로 반환해줌

      }
}

 

 

void loop_free (NODE *head) // 연결리스트의 메모리를 해제하는 함수
{
       NODE *temp, *current;

     

       for(temp =head; temp != NULL; temp = current)
       {
             current = temp->next; 

             // temp에 현재 동적할당값을 넣어놓고 current에 다음 동적할당 주소를 넣은 뒤
             free(temp); // temp에 넣어놓았던 동적할당해제
       }

}

 

 

void free_list (NODE *head)  //재귀 함수를 이용하여 연결리스트의 메모리를 해제
{
        if(head != NULL)
        {
               free_list(head->next); // 재귀호출하여 NULL을 만날때까지 다음 주소로 넘어가며 동적할당 해제
               free(head);
        }
}

 


void concatenate (NODE *first, NODE *second) // 두 리스트를 연결하는 함수
{
        if(first->next == NULL)
        {
               first->next = second;
        }
        else
        {
               concatenate(first->next, second); 

                //first 연결리스트의 끝에 NULL을 찾아 두번째 연결리스트 주소를 넣어 두 리스트를 연결함.
        }
}

 


NODE *search(NODE *head, char ch) //리스트 내의 특정 데이터를 가진 노드를 찾는 함수
{
       NODE *walker = head;

 

       while((walker != NULL) && ((walker->data) != ch))  // NULL 또는 ch에 같은가를 비교하여 찾으면 
       {                                                                            // while문 탈출
              walker = walker->next;
       }

 

       if(walker == NULL)    // 찾은것이 NULL이면 널 반환하고 ch와 같은것을 찾았으면 그 주소를 반환
       {
              return (NULL);
       }
       else
       {
             return walker;
       }

}

 


NODE *append (NODE *list, NODE *temp) // 새로운 노드를 연결리스트의 뒷부분으로 추가하는 함수
{
       NODE *current = list;

  

       if(list == NULL)
       {
              list = temp;
       }
      else
      {
             while(current->next != NULL)
             {
                   current = current->next;  
             }
             current->next =temp;
       }
 

       return (list);
}

 

 

 

 

________________________________________________________________________________________________________________

 

 

 

 

____________실습파일________________

 

10-5-2.c

 

10-5-2.exe

 

10-5-2.obj

 

10-5-3.c

 

10-5-3.exe

 

10-5-3.obj

 

10-5-4.c

 

10-5-4.exe

 

10-5-4.obj

 

10-5-5.c

 

10-5-5.exe

 

10-5-5.obj

 

10-5-6.c

 

10-5-6.exe

 

10-5-6.obj

 

10-5-7.c

 

10-5-7.exe

 

10-5-7.obj

 

d10-5.dat

__________________________________

'스마트 컨트롤러 게시물' 카테고리의 다른 글

20130426  (0) 2013.04.26
20130425  (0) 2013.04.25
20130423  (0) 2013.04.23
20130422  (0) 2013.04.22
20130419  (0) 2013.04.19