๐ก endian := byte order ๋ฉด์ ๋ ์์ฃผ ๋ฌผ์ด๋ด
(MSB์ชฝ) 0x12345678 (LSB)
little endian in x86 → 78 56 34 12
big endian in M68K → 12 34 56 78
ํต์ ์์๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ด TCP/IP์์๋ ๋ฐ๊ฟ
&a : a ๋ณ์์ ์ฃผ์ So, &๋ณ์
int* pointer; ํฌ์ธํฐ๋ณ์ ์ ์ธ
//ํฌ์ธํฐ๋ ์ฒซ ์ฃผ์๋ง ์ฝ์ผ๋ฏ๋ก ์ผ๋ง๋ ์ฝ์ด์ฌ์ง ํ์
์ ์ด์ค์ผ ํจ
*pointer : (๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ์) ํฌ์ธํฐ์ ํด๋นํ๋ ๊ฐ
So, *์ฃผ์
โ
๋ฉ๋ชจ๋ฆฌ ๋จ์ : byte
์ฃผ์ ํ๋ : 1byte = 8bit → 00 ~ ์ต๋ FF = 1111 1111
32bit cpu์ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋ 4GB → 32bit ์ฃผ์ : 0xFFFF FFFF
4bit = 1 nibble
#include <stdio.h>
int main(void)
{
int a; // ์๋์ฐ OS๊ฐ ์ฃผ์(ํฌ์ธํฐ๊ฐ)์ ํ ๋นํด์ค
int* pointer;
int b;
int* pointer_b;
a = 0x12345678;
pointer = &a;
b = 3;
pointer_b = &b;
//d๋ 10์ง์๋ก. x๋ก ํ๋ฉด ๊ทธ๋๋ก ๋์ด
printf("%d, %p, %d, %p\\n", a, &a, *pointer, pointer);
// 305419896, 0000007C165AF7A4, 305419896, 0000007C165AF7A4
printf("%d, %p, %d, %p", b, &b, *pointer_b, pointer_b);
// 3, 0000007C165AF7E4, 3, 0000007C165AF7E4
printf("ํฌ์ธํฐ ๋ณ์์ ํฌ๊ธฐ: %zd ๋ฐ์ดํธ\\n", sizeof(pointer));
// 8๋ฐ์ดํธ ;64๋นํธ ์ฃผ์์ฒด๊ณ
return 0;
}
- ํฌ์ธํฐ ์ฐ๋ฉด ๋ฉ๋ชจ๋ฆฌ(๋ณต์ฌ) ๋ ์ ← ์์ ์ฃผ์๋ง ์ฐ๋๊น
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ OS๊ฐ → ์คํ๋ง๋ค ๋ฐ๋
๐ก PC์์ pointer = 100; ํฌ์ธํฐ์ ์ง์ ํ ๋นํ๋ฉด ์๋ OS๊ฐ ํด์ผ ํ๋ ์ผ์ด๋ฏ๋ก ์๋ฌ ๋จ.
//๋น๋๋ ๋์ง๋ง, ์ฌ์ฉํ๋ฉด ์๋ฌ(์์ธ์ค ๊ฑฐ๋ถ)
๋ฐ๋ฉด, ์๋์ด๋ ธ ๊ฐ์ ์๋ฒ ๋๋๋ ๋ณธ์ธ์ด ๊ฑด๋๋ ค์ผ ํด์ ์คํ๋ ค ์ฌ์ฉ
ํฌ์ธํฐ ๋ณ์ ์ด๊ธฐํ = NULL
#include <stdio.h>
//void๋ฉด ๋ณ์ ๋ถ๋ฅผ ๋๋ง๋ค ๋ณ์ ํ์
๋ฐ๊ฟ ์ ์์
int main(void)
{
int i = 3000;
int* p = NULL; //์๋ฌด๊ฒ๋ ์ ๊ฐ๋ฅดํด. 0์๋ฏธ
p = &i;
printf("i = %d\\n", i); //3000
printf("&i = %p\\n\\n", &i); //000000EED0F0F944
printf("p = %p\\n", p); //000000EED0F0F944
printf("p = %d\\n", *p); //3000
return 0;
}
ํฌ์ธํฐ ์ด์ฉํด์ ์๋ ๊ฐ ๋ฐ๊พธ๊ธฐ
#include <stdio.h>
int main(void)
{
int i = 10;
int* p;
p = &i;
printf("i = %d\\n", i);
*p = 20; //ํฌ์ธํฐ p์ ํด๋นํ๋ ๊ฐi์ 20๋์
printf("i = %d\\n", i);
return 0;
}
- ์ด๊ธฐํ ์ ๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋จ.int *p; *p = 100; ํ๋ฉด ์ ๋จ. int x; *p = &x; ํ์
- i.e. ์ด๋ค ๊ฐ์ ์ฃผ์์ธ์ง ๋ง ์ ํ๊ณ
- ํฌ์ธํฐ ํ์ , ๋ณ์ ํ์ ์ผ์นํด์ผ ํจ
- byte access๊ฐ ๋ค๋ฆ
ํฌ์ธํฐ์ ๋ฐฐ์ด
๋ฐฐ์ด์ & ํ์ ์ ํด๋ ๋จ
์ฃผ์ | a | a+1 | a+2 | a+3 | int๋๊น 4byte์ฉ ์ฆ๊ฐ |
“ | &a[0] | &a[1] | &a[2] | &a[3] | |
๋ณ์์ด๋ฆ | a[0] | a[1] | a[2] | a[3] | |
๋ณ์๊ฐ | 10 | 20 | 30 | 40 | |
“ | *a | *(a+1) | *(a+2) | *(a+3) | a๋ ์ฃผ์๋๊น 4byte์ฉ ์ฆ๊ฐ |
ํฌ์ธํฐ ํ๋ณํ
#include <stdio.h>
int main(void)
{
int data = 0x0A0B0C0D;
char* pc;
int* bb;
pc = (char *)&data; //๊ฐ ํ๋ ๊ฐ์ ธ์ค๊ณ 1byte์ฉ ์ด๋
bb = (int*)&data; //4๊ฐ ๊ฐ์ ธ์ค๊ณ 4byte์ฉ ์ด๋
for (int i = 0; i < 4; i++) {
printf("*(pc + %d) = %X\\n", i, *(pc + i));
}
for (int i = 0; i < 4; i++) {
printf("*(bb + %d) = %X\\n", i, *(bb + i));
}
return 0;
}
ํจ์ ํธ์ถ ์ ์ธ์ ์ ๋ฌ๋ฐฉ๋ฒ
- ๊ฐ์ ์ํ ํธ์ถ call by value
- ํจ์๋ก ๋ณต์ฌ๋ณธ์ด ์ ๋ฌ
- ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ
- ๊ณ์ฐ์ด๋ ๋์์ ์ํด ๊ฐ๋ง ํ์ํ ๊ฒฝ์ฐ
2. ์ฐธ์กฐ์ ์ํ ํธ์ถ call by reference
- ํจ์๋ก ์๋ณธ์ด ์ ๋ฌ
- C์์ ํฌ์ธํฐ ์ด์ฉํ์ฌ ํ๋ด ๋ผ ์ o
- ๋ฉ๋ชจ๋ฆฌ๊ฐ ํจ์จ์ ์
- func(int *px, *py){} ํํ
- ํจ์ ์ธ๋ถ์์ ์ ์ธ๋ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ ๋
// ์ฐธ์กฐ์ ์ํ ํธ์ถ
#include <stdio.h>
void sum(int x, int y, int* value)
{
*value = x + y;
} // ๋ฐํ ์์ด ๊ฒฐ๊ณผ ์ฌ์ฉ ๊ฐ๋ฅ, return์ ์จ์ ํ๋๊ฐ ์๋ ์ฌ๋ฌ ๊ฒฐ๊ณผ ๊ฐ๋ฅ
int main(void)
{
int a, b, value;
a = 10;
b = 20;
value = 0;
sum(a, b, &value); // a,b๋ ๋ณํ ํ์ ์์ผ๋ ๊ทธ๋๋ก
// value๋ ์ํฅ์ ๋ฐ์์ผ ํ๋ ์ฃผ์๋ฅผ ์ค์ ๊ฐ ๋ฐ๊พธ๊ณ ์ฃผ์ ๊ฐ์ ธ์ค๊ธฐ
printf("%d + %d = %d\\n", a, b, value);
return 0;
}
scanf() ํจ์ : ์ฌ์ฉ์์๊ฒ ์ฃผ์๋ฐ์์ ๋ณ์์ ๊ฐ ์ ์ฅ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i;
printf("์ ์๋ฅผ ์
๋ ฅํ์์ค: "); //์ฐฝ์ ์ถ๋ ฅ
scanf("%d", &i); //์ฐฝ์ ์
๋ ฅ
printf("%d", i); //์ฐฝ์ ์ถ๋ ฅ
return 0;
}
//์์
#include <stdio.h>
int main(void)
{
int a[] = { 10, 20, 30, 40, 50 };
printf("a = %u\\n", a);
printf("a + 1 = %u\\n", a + 1);
printf("*a= %d\\n", *a);
printf("*(a+1) = 5%d\\n", *(a + 1));
return 0;
}
//ํฌ์ธํฐ๋ฅผ ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉ
#include <stdio.h>
int main(void)
{
int a[] = { 10, 20, 30, 40, 50 };
int* p;
p = a;
printf("a[0]=%d a[1]=%d a[2]=%d \\n", a[0], a[1], a[2]);
printf("p[0]=%d p[1]=%d p[2]=%d \\n\\n", p[0], p[1], p[2]);
p[0] = 60;
p[1] = 70;
p[2] = 80;
printf("a[0]=%d a[1]=%d a[2]=%d \\n", a[0], a[1], a[2]);
printf("p[0]=%d p[1]=%d p[2]=%d \\n", p[0], p[1], p[2]);
return 0;
}
// ํฌ์ธํฐ์ ํจ์์ ๊ด๊ณ
#include <stdio.h>
void sub(int b[], int n); //์ฐธ์กฐ ํธ์ถ, ๊ฐ ํธ์ถ
int main(void)
{
int a[3] = { 1,2,3 };
printf("%d %d %d\\n", a[0], a[1], a[2]);
sub(a, 3);
printf("%d %d %d\\n", a[0], a[1], a[2]);
return 0;
}
void sub(int b[], int n)
{
b[0] = 4;
b[1] = 5;
b[2] = 6;
}
/*
#include <stdio.h>
#define SIZE 5
void print_image(int image[SIZE][SIZE])
{
for (int r = 0; r < SIZE; r++) {
for (int c = 0; c < SIZE; c++) {
printf("%03d ", image[r][c]);
}
printf("\\n");
}
printf("\\n");
}
void brighten_image(int image[SIZE][SIZE])
{
int* p = &image[0][0];
for (int r = 0; r < SIZE; r++) {
for (int c = 0; c < SIZE; c++) {
//image[r][c] += 10; //์ธ๋ฑ์ค ํ๊ธฐ๋ฒ
*p += 10;
p++;
}
}
}
int main(void)
{
int image[SIZE][SIZE] = {
{10,20,30,40,50},
{10,20,30,40,50},
{10,20,30,40,50},
{10,20,30,40,50},
{10,20,30,40,50} };
print_image(image);
brighten_image(image);
print_image(image);
return 0;
}
*/
ํฌ์ธํฐ ์ฌ์ฉ์ ์ฅ์
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์ด์ง ํธ๋ฆฌ ๋ฑ ํฅ์๋ ์๋ฃ ๊ตฌ์กฐo
- ์ฐธ์กฐ์ ์ํ ํธ์ถ ํฌ์ธํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก, ํจ์ ์ธ๋ถ๋ณ์ ๊ฐ ๋ณ๊ฒฝo
- ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋์ ๋ฉ๋ชจ๋ฆฌ( in 11์ฅ) int *b, *c; b = malloc(40); 40๋ฐ์ดํธ ํ ๋น // ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ํด ๋๋ ๋ for (int i = 0; i < 10; i++) { *(b+i) = i;} free(b); b๊ฐ ์ฌ๋ผ์ง //๋ฉ๋ชจ๋ฆฌ ํด์
c = malloc(40);
free(c);
๐ก ์คํ์ ์ ์ ํ ๋น → ์ง์ญ๋ณ์, ํจ์๋ณ์ ๋ฑ ์ ์ฅ
ํ์ ๋์ ํ ๋น ๊ด๋ฆฌ ์์ญ → ex_ malloc, calloc, realloc
free() ์ ํ๋ฉด ๋์. ๊ณ์ ๋จ์์ ์๋ฌ
ํฌ์ธํฐ์ ๋ ์ง์คํฐ
์ด์ ๋ธ๋ฆฌ์ด mov r0, #20, ; //20์ r0๋ฅผ ์ ์ฅ
์ปดํ์ผ cond 0 0 1 opcode S Rn Rd rot_imm imm8
- 32๋นํธ Cpu๊ฐ ๊ฐ์ง๋ ์ฃผ์์ ๋ฒ์๋ 32๋นํธ๋ก ๊ตฌ์ฑ
๐ GPIO : ์ ์ถ๋ ฅ์ ์ดํ
UART : ์๋ฆฌ์ผ ํต์ ํ๋ ํ๋์จ์ด ์ฅ์น → ๋นํธ ๋จ์ ๋ฐ์ดํฐ ์ ์ก,์์
→ ๋ช
๋ น์ด, ์ด๋๋ ์ค, ์ด๋๋ ์ฑ๋ ๋ณดํต 32bit
0x00000000 ~ 0xFFFFFFFF (์ด 4GB)
์ ๋ฒ์์์ RAM, ROM๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ GPIO, UART ๊ฐ์ ์ฅ์น ์ ์ด ์ํด ๋ ์ง์คํฐ์ ์ฃผ์๋ค์ด ํฌํจ๋จ
- Memory MAP : 32๋นํธ CPU์ ๋ฉ๋ชจ๋ฆฌ, ๋ ์ง์คํฐ ์ฃผ์๊ฐ ๋ณด์ฌ์ฃผ๋ ์ง๋
→ GPIO, UART, usb, ํ์ด๋จธ … ๋ฑ ์ ์ด?
ํฌ์ธํฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ ์ง์คํฐ ๊ฑด๋๋ฆฌ๊ธฐ
- RAM ์ฃผ์ 0x00000000 0x12345678๋ผ๋ 4byte๋ฅผ ์ฐ๊ณ ์ถ์
((unsigned int) 0x100000000) = 0x12345678; //4byte๋๊น int - ์ด๋ค ์ฃผ์์ ํน์ ํ ์ฌ์ด์ฆ๋งํผ ๊ฐ์ ์ฐ๊ณ ์ถ์
*(( ์ฌ์ด์ฆ์ ํด๋นํ๋ ๋ณ์ํ *) ์ฃผ์) = ๊ฐ;
10๊ฐ์ ๋ชจ๋ ๋ ์ง์คํฐ ๋ชจ์์ ํ ๋ฒ์ ๊ด๋ฆฌํ๋ฉด ๋ ํธ๋ฆฌ
So, ์ค์ ์ฝ๋์์ “๊ตฌ์กฐ์ฒด” ์ฌ์ฉ
#define PERIPH_BASE 0x40000000UL
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL)
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) // ๊ฒฐ๊ตญ 0x40020000
GPIOA -> ODR = 0xFF;
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
} GPIO_TypeDef;
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
๐ __IO : volatile unit32 : unsigned int 32๋นํธ
'Programming > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
15. ์คํธ๋ฆผ๊ณผ ํ์ผ ์ ์ถ๋ ฅ (1) | 2023.10.19 |
---|---|
13. ๊ตฌ์กฐ์ฒด (0) | 2023.10.19 |
12. ๋ฌธ์์ด (0) | 2023.10.19 |
10. ๋ฐฐ์ด (0) | 2023.10.19 |
9. ํจ์์ ๋ณ์ (0) | 2023.10.19 |