AVR을 활용한 펌웨어 (사전지식 정리)

공이지·2024년 5월 28일

05.21

📗 C

1. typedef{..}~;

구조체를 사용할 때마다 struct를 작성해야하지만 typedef를 사용하여 구조체를 정의하여 struct키워드를 생략 할 수 있다.

2.함수의 원형선언

함수의 원형선언은 컴파일러와 직접적으로 연관이 있다. C 언어는 절차지향 언어이다! 소스코드를 작성하고 실행을 하게되면 항상 main함수부터 시작하며 기 이후에는 호출순서에 띠리 실행! 이때 만약 main함수에 사용되는 함수가 main함수 밑에 작성된다면..? 컴파일러에 오류가 발생할 것이다. 왜? 절차지향이기 때문에 main함수에 실행되는 함수가 main함수가 앞에서 정의가 되어야하는데 안되어 있으니.. main함수에서는 오류가 발생하는 것이 당연하지 않을까? 때문에 main함수 이전에 먼저 함수의 반환형, 함수이름, 매개변수만 먼저 선언하는 것이 함수의 원형선언이다!
++ 컴파일러가 컴파일할 때 함수를 호출한 자리에 반환값과 같은 형태의 저장 공간을 준비한다! 따라서 함수를 호출하기 전에 함수의 원형선언을 통해 반환형을 미리 컴파일러에게 알릴 필요가 있다!

3.변수

지역변수

  • stack영역에 저장. 블록을 벗어나면 메모리에서 소멸된다, 함수의 매개변수도 지역변수

전역변수

  • 함수 외부에 선언된 변수(main함수가 끝나야 소멸됨.data영역에 저장)

  • /예외/ extern 변수 >> 예를들어 file1, file2에서 전역변수 a를 사용하고자 할 때

    file1.c

    int a;
    main();...

    다음과 같이 선언한다 이 때 file2에서 file1int a 를 사용할때는

    file2.c

    extern int a;
    main();...

    위와 같이 선언하면 file2에서도 int a를 사용할 수 있다. 펌웨어에서 전역변수를 선언해주면 아래와 같이 헤더파일에 extern int a; 를 선언해주면
    file1.c 소스코드에서 사용할 수 있다.

etc

  • 포인터끼리 덧셈 불가능..(주소끼리 연산 불가능..)
  • 구조체
    서로다른 데이터형의 변수들을 하나로 묶어서 사용.
  • 배열 vs 구조체
    배열은 같은 타입의 집합.
    구조체는 다른 타입의 집합.

정적변수

  • static변수, 지역변수와 전역변수 특징을 가지고 있음(함수내부에 정적변수는 전역변수차람 한번만 초기화되고프로그램이 종료되어야 소멸)
  • 위 처럼 선언된 정적변수는 지역변수처럼 해당 함수 내에서만 호출.

비트마스킹

펌웨어 AVR은 비트연산이 80% 이상 사용된다. 그래서 비트마스킹을 사용하면 메모리사용량이 줄어들고 펌웨어 소스코드를 직관적으로 작성할 수 있다.

%#은 16진수를 표현할때 사용! .4 는 4자리 표현 즉 %#x 를 해야 16진수 표현이 나온다

(개인적으로 공부한 내용입니다. 틀린 정보가 있을 수도 있습니다.)

profile
화이팅..!

0개의 댓글