스케줄러
: 여러 개의 함수를 몇 초 마다 각각 실행되는 것
C -> 어셈블리어로 변환 -> 각 명령어의 사이클 수와 CPU 클럭을 알아내면 for 루프의 수행시간을 알아낼 수 있다.
ex) 클럭 speed 100MHz -> 10ns라면 총 cycle 수를 구하여 cycle * 10ns를 통해 함수 실행 시간을 구할 수 있다.
공루프 : for 루프로 딜레이를 주는 경우
시스템 마다 정확한 값을 갖기가 어렵고, 최적화 옵션에 따라 컴파일러가 무시할 때도 있다.
int -> stdint 형으로 바꿔주자! : 시스템 마다 인트 크기를 맞춰주기 위해서
bool -> stdbool 형으로 바꿔주자! : 1에서 true로
선점형 스케줄러는 구현 어려움
Context Switching을 직접 구현하기 어려움
PC 등 레지스터들을 다 메모리에 백업하는 Timer에 어셈블리어로 구현해야 함
#include "delay.h"
#include <Windows.h>
#include <time.h>
void delay_init(uint32_t ms)
{
// delay 방법 1 (비추천)
// for (int i = 0; i < ms * 100000; i++) {};
// delay 방법 2 (추천) , <Windows.h> 사용, 윈도우 전용
// Sleep(ms);
// delay 방법 3 (추천) , <time.h> 사용, 타 운영체제에서도 사용가능한 일반적인 sleep
clock_t start_clock = clock();
clock_t next_clock = clock();
while (1)
{
if (next_clock - start_clock >= ms) break;
next_clock = clock();
}
}
#include <stdio.h>
int main()
{
int a = 50;
int b = 70;
int* p[2][3] =
{
&a, &a, &b,
&b, &b, &a,
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ", *p[i][j]);
}
printf("\n");
}
return 0;
}
배열 포인터
는 배열을 가리키는 포인터
이다.
#include <stdio.h>
int main()
{
char vect[5] = { "ABCD" };
char(*p)[5] = &vect; // char(*p)[] 이렇게 선언해줘도 된다.
for (int i = 0; i < 5; i++)
{
printf("%c ", (*p)[i]);
}
return 0;
}
#include <stdio.h>
#include <string.h>
void go(char (*p)[4])
{
int n = strlen(*p);
for (int i = n - 1; i >= 0; i--)
{
printf("%c ", (*p)[i]);
}
}
int main()
{
char buf[4] = "KFC";
go(&buf);
return 0;
}
#include <stdio.h>
void bbq(int x, char y)
{
printf("%d %c BBQ\n", x,y);
}
void moms()
{
printf("MOMS\n");
}
int go()
{
return 100;
}
int main()
{
void (*p)(int,char) = &bbq;
void (*q)() = &moms;
(*p)(12, 'K'); // 12 K BBQ
(*q)(); // MOMS
int (*k)() = &go;
int ret = (*k)();
printf("%d\n", ret); // 100
return 0;
}
#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
int gop(int a, int b)
{
return a * b;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b); // 1 3
int (*p[4])(int, int) = { &sum, &gop, &sum, &gop };
for (int i = 0; i < 4; i++)
{
printf("%d ", (*p[i])(a, b)); // 4 3 4 3
}
return 0;
}