전체 글 474

0728 C프로그래밍 기초 15~16강

15강 - 배열과 포인터 char data[4]; char *p = &data[0]; // 배열 표기법을 포인터 표기법으로 변경 따라서, 배열의 이름은 배열의 시작주소다. # 배열과 포인터의 합체 char *p1부터 *p100까지 사용하고 싶은 경우 작성방법 char *p[N]; // -> *p[0] ~ *p[N-1] 16강 - 메모리/프로세스 # 프로그램과 프로세스 # 메모리 할당 데이터를 저장할 공간을 적정하게 나눈는 할당 작업 # 정적 메모리 할당 - 컴파일러가 소스 코드를 기계어로 번역하는 시점에 변수 크기에 맞게 메모리를 할당하는 것 - 수정이 필요하면 소스코드를 수정하고 다시 컴파일 해야함 - 프로그램이 실행될 때 메모리의 위치가 결정됨 - 전역 변수 # 변수가 메모리에서 유지되는 시간 전역변..

0727 C프로그래밍 기초 14강

# 표준 입력 함수 입력 버퍼는 특정 키를 누를 때가지 사용자 입력을 임시로 저장. 따라서 남아있던 글자가 나옴으로써 원하지 않는 결과가 나올 수 있음 # rewind rewind 함수를 이용해 버퍼를 청소할 수 있다 # getchar 키보드로부터 문자 하나를 입력받는 표준 입력 함수 문자 한 개를 입력 받더라도 enter키를 눌러야만 작업이 완료됨 # 해결 방법1 엔터키를 한 번 더 호출해 enter키 값을 제거 # 해결 방법2 rewind 함수를 사용해 버퍼내에 남아있는 문자 제거 #include void main() { int input_data; input_data = getchar(); printf("input : %c \n", input_data); // 첫글자만 출력됨 rewind(stdin..

0722 브레드 보드의 스위치, LED를 GPIO로 제어하기

Register 역할 RCC_AHB1ENR GPIO 사용을 위한 클록 설정 사용 원하는 핀 번호 1로 설정 GPIOx_MODER 입출력을 설정해주는 레지스터 00 : INPUT 01 : GPO MODE 정해진 MODE를 토대로 핀 번호당 2비트씩 설정해준다 GPIOx_IDR 전기적 상태 확인이 가능 GPIOx_ODR 핀번호마다 전기적 신호 변경이 가능 #include //#include "stm32f4xx.h" #define rRCC_AHB1ENR (*(int *)0x40023830) // -> GPIO CLK ON #define rGPIOE_MODER (*(int *)0x40021000) // -> LED와 연결된 핀 #define rGPIOE_ODR (*(int *)0x40021014) #define..

0721 외부변수참조 / .h / CPU구조 / reg와argument / 슈도명령어 ~234

extern int DoAdd(int, int); // -> 생략가능 extern float DoAddFloat(float, float); int main() { printf("%d \r\n", DoAdd(3,4)); printf("%f \r\n", DoAddFloat(0.5, 1.5)); } int DoAdd (int a, int b) { return (a+b); } float DoAddFloat(float a, float b) { return(a+b); } - main문에서, int형 함수인 extern DoAdd 선언 구문은 생략이 가능하나, float DoAddFloat 실수형 함수 선언 구문은 생략 불가 - 그 이유는, 메모리상 정수형 저장과 실수형 저..

0720 포인터,배열의 동작구조 / 함수포인터 / 구조체 / union ~176

* 심볼 = 전역변수, 함수 * 포인터는 주소값을 가지므로 자료형에 상관없이 항상 4B크기로 고정 p.108, 110 실습 #include #include "ARMCM3.h" #include "core_cm3.h" // #define SQUARE(x)((x)*(x)) int fputc(int c, FILE *f) { return ITM_SendChar(c); } int array[8]; char buf[10] = {0,1,2,3,4,5,6,7,8,9}; unsigned int * paddr; int main(void) { //1. int *p = (int *) array; *p = -1; *(p+1) = 0x11111111; // p+1 주소내의 값 변경 *p++ = 0x22222222; // p주소 내..

0720 형식지정자(typedef) / 매크로 ~84

선언 typedef struct student { char name[16]; int age; }student_t; 정의 -> 메모리 할당 student_t st0; # 전처리기 - 컴파일러 시작 전 처리되는 작업 - '#' 지시어로 시작 - #define, #if, #ifdef, #undef, #pragma, #include - 매크로전처리기 유의 #define SQUARE(x*x) 라고 정의했을때, SQUARE(2+3)은 25가 아닌 11로 출력. 그 이유는 2+2*3+3 으로 처리되기 때문. 정상적인 작동을 위해서는 #define SQUARE((x)*(x)) 라고 정의해야 함. # 조건 컴파일 #if(1) ... # else ... #endif - 조건 컴파일 예시 #define DEBUG_1 #if..

0719 스택 / keil메모리값변화 / 포인터 ~64

# 정수형 표현 방법 unsigned char a; -> [0, 255] char a; -> [-128, 127] 카운트 업하면서 값 살펴보면 signed 는 128이 -1이 됨. 근데 메모리에서 살펴보면 둘 값은 똑같이 찍힘 ∴ 메모리까지는 signed도 unsigned처럼 쭉 증가하지만, 값이 출력되는 과정에서 부호 판단하고 출력 # 변수 영역 (변수 표현을 위해 사용되는 메모리 영역) 함수, 전역변수 -> symbol -> mapfile 확인 지역변수 -> symol아니므로 mapfile에 기록 x const 자료형으로 선언된 변수들은 나중에 값 수정이 안된다. 따라서 ROM영역에 할당됨 지역변수, 전역변수는 RAM, register에 할당됨 지역변수는 보통 레지스터에 할당되는데, 레지스터를 모두 ..

0718 16진수용량계산 / ROM,RAM / Keil

4번째 발표를 오전에 마무리하고 오후에는 cortex 를 다루기 위한 이론강의를 진행. # 선언 컴파일러에게 해당 실체의 타입과 이름을 (단순히) 알려주는 동작 # 정의 실체를 위한 메모리 영역이 확보딤 1KB = 2^10 1MB = 2^20 = 0x100000 1GB = 2^30 1TB = 2^40 = 0x10000000000 (10개) # 16진수 용량 계산 0쓸때마다 4씩 소거, 4로 소거가 안되면 2^n해서 msb에 붙이기 2K = 2^11K = 0x800 8K = 2^13K = 0x2000 16K = 2^14K = 0x4000 32K = 2^15K = 0x8000 64K = 2^16K = 0x10000 50k = 32k + 16k + 2k = 0x8000 + 0x4000 + 0x800 = 0xC..