[펌웨어] 스케쥴러

정재훈·2022년 5월 3일
0

FirmWare

목록 보기
6/7

스케줄러

스케줄러 : 여러 개의 함수를 몇 초 마다 각각 실행되는 것

C -> 어셈블리어로 변환 -> 각 명령어의 사이클 수와 CPU 클럭을 알아내면 for 루프의 수행시간을 알아낼 수 있다.
ex) 클럭 speed 100MHz -> 10ns라면 총 cycle 수를 구하여 cycle * 10ns를 통해 함수 실행 시간을 구할 수 있다.

공루프 : for 루프로 딜레이를 주는 경우
시스템 마다 정확한 값을 갖기가 어렵고, 최적화 옵션에 따라 컴파일러가 무시할 때도 있다.

int -> stdint 형으로 바꿔주자! : 시스템 마다 인트 크기를 맞춰주기 위해서
bool -> stdbool 형으로 바꿔주자! : 1에서 true로

선점형 스케줄러는 구현 어려움
Context Switching을 직접 구현하기 어려움
PC 등 레지스터들을 다 메모리에 백업하는 Timer에 어셈블리어로 구현해야 함

Delay

#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;
}
profile
여러 방향으로 접근하는 개발자

0개의 댓글