main 함수에서 진행 (HW setup, Init들 끝나고 순수 sw 동작가능한 상태)
kernel_init > IDLE task 살림
: task가 (ready, running)X > kernel 을 점유할 task공간
typedef struct task_tcb_struct {
char task_name[200];
void *sp; /* 스택 포인터 */
uint32 receive_siganl ; /* 받은 Signal */
uint32 wait_signal ; /* 기다리는 Signal */
uint32 pri; /* Task의 Priority */
task_tcb_link_type link; /* for TCB list */
} task_tcb_type ;
typedef struct {
struct task_tcb_struct *next_ptr;
struct task_tcb_struct *prev_ptr;
} task_tcb_link_type ;
typedef void (*task_func_type)();
// 함수의 이름을 만들어주기위해 타입을만듬
// 이름을 자유롭게 바꿀 수 있음
void kernel_init (
tcb_type ptcb,
unsigned char* pstack,
dworkd pri,
task_func_type ftask,
char *ptaskname,
)
dword idle_stack [IDLE_STACK_SIZ]; /* Stack for MC task. */
int main (void)
{
kernel_init(
1. &idle_task_tcb, /* IDLE task TCB */
2. (void *)idle_stack, /* IDLE task stack */
3. IDLE_PRI, /* IDLE task PRIORITY */
5. idle_task, /* IDLE task 본체 */
4. "IDLE_task")
return 0; /* Never Returns : 여기로는 다시는 안돌아와요 */
}
>>
기본적으로 kernel 은 TCB 를 가지고놈
1. IDLE task 를 Task tcb 에 등록
2. idle_stack : tcb에 IDLE task가 사용하게될 stack 알려줌
ptcb->sp = pstack;
// 1번에서 ptcb를 idle task 로 설정함
> 이제부터 IDLE task가 사용할 stack은 idle_stack
3. Priority 설정
ptcb->pri = pri;
4. taskname
while ( (ptcb->task_name[loop] = ptaskname[loop] ) && ( index++ < 200 ) );
// while문이 한줄로서 끝난걸 알리기위한 " ; "
ptcb->task_name[199] = '\0'
5. 실행
ftask = idle_task
ftask();
+
실행 도 해야하지만 idle 이외의 task 들을 kernel API 를 통해 살려야함
> idle_task()진입 > task들 define, start 해주는 routine
void idle_task()
{
define_tasks();
start_tasks();
while (1)
{
wait_signal (WORK);
}
}
>
define_tasks()들에는 TCB 장난으로 task 본체를 실행하게됨
ex) sleep_task
void sleep_task()
{
sleep_task_init();
wait_signal (START); /* ⓐ define하게 되면 sleep_task()가 실행되며 여기에서 기다림 */
while (1)
{
wait_signal (WORK); /* ⓑ task의 무한 loop 내부 */
}
}
>
define 을 하면 모든 task들이 START 신호를 기다리는 a 에서 걸림
idle_task에서 start_tasks() 를 하면?
> define 했던순으로 task들에게 START 신호를 보내줌
> task들을 while문안으로 진입 > WORK 신호를 기다림
idle_task가 WORK 하는일은 잘 없음
> task들이 모두 일을 안해야 마지막으로 idle_task 에 WORK 를 날려주는건데
> task들이 일을 안할땐 power saving mode로 시스템 셧다운시킴
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
Device Control (0) | 2025.01.13 |
---|---|
Kernel Porting (0) | 2025.01.11 |
Watch dog (0) | 2025.01.11 |
DPC ,APC, Bottom Half (0) | 2025.01.11 |
Queue , Inter Task Communication (0) | 2025.01.10 |