임베디드/임베디드 레시피

Bootup 중 kernel로 진입 - main()

twoweeks-within 2025. 1. 11. 20:00

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