크로스컴파일
(A)cpu > 운영체제(리눅스) > gcc ( program1 ,p2, p3 ..)
(B) cpu > 임베디드 (Arm) > 전용 컴파일러필요, 자체실행불가( 시계 같은것)
>> 크로스컴파일러의 등장
A-gcc(A cpu에서 동작) > 내가만든 c코드>> B cpu에서 동작하는 기계어로 번역 = A cpu 운영체제에서는 동작 x
ex) apt-get install gcc-arm-linux-gneabi
리눅스에서 동작하는 gcc 이긴 하지만 결과물: arm용
크로스컴파일에는 gdb 디버거만 제공
gdb 명령어
gcc -g program.c
gdb a.out
run , l
b 15 // 15번째줄에 breakpoint
소스코드 저장 과정
하드디스크 > a.out 저장, 실행하면 > 메모리로 옮김
메모리 내부에는 (코드영역((ex)상수) ,데이터 영역(const), 힙 영역, 스택영역)
변수명 규칙
- 숫자로 시작 X : c언어를쭉 한번 읽음 > 앞에 숫자로 시작하면 > 그냥 무조건 상수로 생각해버림
- 키워드는 불가능.(if,switch,for,,)
- ‘-‘ 불가 , 연산자(뺄셈)이라서
sizeof 사용
시스템에 따라 Int,char,shot, long 크기 달라짐
> 임베디드 시스템에서 크기 보거나, 배열크기 확인
const
const int a=3; >> a는 더이상 변경 불가능
a++ , ++a, a- -, --a
int a=1;
a++ (후연산자) > 다음줄에 반영 printf(“%d\n”,a++): 1을 출력하고 2를 저장
++a>> 플러스를 한뒤에 a를 보여줘 prinf(“%d\n”,++a) : 저장된2+1=3 출력
a-- 3을 출력한뒤 1을 뺀것을 저장 : 3출력 2저장
--a 하나 뺀것을 출력: 2-1=1 출력
산술: + - / * %
논리 : II(or) &&(and) > < >= <= ==
맞으면 1 // (c언어) 0이 아니면 전부 다 맞음 1)
아니면 0 // (틀리다는 0)
c= a=3 ll b=5 >> 맞는거(3) ll(or) 맞는거(5) = 맞는거 >1
*c언어에서 논리연산 결과가 맞으면 1 , 틀리면 0
d = a II b 에서 a만 맞기만 하면 b 보지도 않고 참으로 함
a= a&& c 에서 a 가 틀리기만 해도 c는 보지도 않고 거짓
ex) if(isRunning()&& isHot()){
turnoffHeater();
}
에서 isRunning이 0을 보내면 isHot은 실행조차 안하고 if문 실행 X
<> OR연산에서는 isRunning 0이 아닌값 이기만 하면 if문 실행
>> && 연산에서 isHot이 한번 실행은 될줄 알고 카운트 계산해서 코딩했는데
isRunning이 0이 나와 isHot 실행 X >> 의도 하지 않은 버그 >> 잡기 힘든 버그 생김
d = a(3)<b(5) ㅡㅡ 맞으므로 d=1
비트 연산자
l (비트 or) &(비트 and) ~ (비트 not) << >> (비트 시프트)
>레지스터 값을 수정 ,데이터시트에서 사용
char a=8; 0000 1000 // char 1byte
char b=4; 0000 0100
char c=0; 0000 0000
a|b = = 0000 1100
d= a&b == 0
0000 1000 & 0000 0100 == 0000 0000
쉬프트 연산
char a=24;
b= a<<1; // 1들이 한칸씩 왼쪽으로 밀려남 == *2
c= a>>1; // 1들이 한칸씩 오른쪽으로 밀려남 == /2
a= 0001 1000 = 24
b= 0011 0000 = 48
c= 0000 1100 =12
bit연산이 cpu연산 속도가 훠어얼씬 빠름 (최적화)
> 숫자 :(숫자를 받아서 비트를 바꿔서 계산 하기때문) 랑 비트랑 연산 과정이 다름
삼항연산자(if문 대신) ?
조건 ? a : b;
=> 조건 ? true faluse // 조건이 참이면 앞에것이 실행, 거짓이면 뒤에것이 실행 (0이아니면 다 참(마이너스도 포함))
ex) (a=3>b=1) printf("3") : printf("1"); // 출력: 3
대입연산자 =
>오른쪽에서 왼쪽으로 들어가는 형태 // a=b , b값이 a에 들어감
비트 연산자 추가내용
bit on!
{// (arm에서는 a라는 한 주소 공간안에 32bit 가있음) 인데 편의를 위해 1byte라 하면
a= 0x30 = 48 (10) , 0011 0000
aㅣ= (1<<3); == a=*a l (1<<3); // a= a+3; == a+= 3; , 4번 전구를 킨다. 에서 (1<<3) = 0000 1000 // 비트 전체적으로 밀림
둘을 or bit연산 ( l ) 하면
0011 1000 이됨.
a의 값은 건들이지 않고 4번 bit만 딱 on 할 수 있음.}
bit off!
3번 전구를 끄려면..
a= 21; // 0001 0101 에서
off 하려면 1111 1011 해야함. > 끄고 싶은것만 0 을 하면 and 연산시 끌 수 있음. 기존의 것은 1으로 유지 , 원래 0이던것은 0 유지
1111 1011 을 하려면.. 1을 2번 왼쪽으로 보내고 반전 시킴
>> a = a & (~(1<<2))
== 0001 0001 = 17
>>>> 1bit 당 gpio 하나를 물린다. 1 이면 high, 0 이면 low , 그때 비트 연산자로 제어
'C언어' 카테고리의 다른 글
정리 - 2 - (0) | 2024.11.11 |
---|---|
[c] 채팅프로그램 (0) | 2024.11.07 |
makefile (script language) (1) | 2024.11.07 |
[c] 헤더파일, 문자열입력 (0) | 2024.11.07 |