www.pudn.com > r&s1.10°æ±¾£«Îĵµ.rar > kernel.h


/* 
=============================================================================== 
| Copyright (C) 2004 RuanHaiShen, All rights reserved. 
| SUMMARY:  
|   Base support function and condition variable definitions. 
| 
| DESCRIPTION: 
|   See http://www.01s.org for documentation, latest information, license  
|   and contact details. 
|   email:ruanhaishen@01s.org 
=============================================================================*/ 
#ifndef __KERNEL_H__ 
#define __KERNEL_H__  
/*===========================================================================*/ 
 
struct queque_struct 
{ 
#if TASK_QUE_SIZE == 1 
    uint que; 
#else 
    uint que[TASK_QUE_SIZE]; 
#endif 
}; 
typedef struct queque_struct queue_t; 
 
struct task_struct 
{ 
    sp_t    stack; 
    tick_t  delay; 
    u8      state;      /*task state    */ 
#if CFG_PRIO_MODE > 1 
    union { 
        u8  normal; 
        u8  current; 
    } prio;             /*priority      */ 
    u8      lock; 
#endif 
#if CFG_IPC_EN > 0 
    queue_t* pend_q; 
#endif 
#if CFG_TASK_NAMESZ > 0 
    char    name[CFG_TASK_NAMESZ]; 
#endif 
}; 
typedef struct task_struct task_t; 
 
#if CFG_TASK_INFO_EN > 0 
struct info_struct 
{ 
    u8      prio; 
    u8      state; 
    tick_t  delay; 
    u8*     stack; 
    s8      cpu_usage; 
}; 
typedef struct info_struct info_t; 
#endif 
 
/*===================================================*/ 
extern u8       _current_prio; 
extern u8       _sched_lock; 
extern task_t   _tasks[CFG_MAX_TASKS]; 
extern queue_t  _ready_queue; 
 
#define __ready_que_init()                    __queue_init(_ready_queue) 
#define __ready_que_remove(prio)              __queue_remove(_ready_queue, prio) 
#define __ready_que_add(prio)                 __queue_add(_ready_queue, prio) 
#define __ready_que_get(next)                 __queue_get(_ready_queue, next) 
#define __ready_que_move(from, to)            __queue_move(_ready_queue, from, to) 
#define __ready_que_susremove(prio, state)    __queue_susremove(_ready_queue, prio, state) 
 
/*===================================================*/ 
#define __dummy() 
 
 
/*contex.asm-------------------------------------------------------*/ 
void __switch_start(sp_t); 
void __switch_to(sp_t*, sp_t); 
 
 
/*sched.c----------------------------------------------------------*/ 
void __schedule(void); 
void __queue_remove_f(queue_t* q, u8 prio); 
void __queue_add_f(queue_t* q, u8 prio); 
void __ready_que_move_f(u8 from, u8 to); 
void __memcpy(void* pdest, const void* psrc, u16 size); 
void __memclr(void* pdest, u16 size); 
#if CFG_PRIO_MODE > 1 
bool __prio_if_normal(u8 prio); 
#endif 
 
#define __prio_normal(cprio)    _tasks[cprio].prio.normal 
#define __prio_current(prio)    _tasks[prio].prio.current 
 
#define __intr_enter() \ 
do { \ 
    _sched_lock++; \ 
} while (0) 
 
#define __intr_exit(flag) \ 
do{ \ 
    _sched_lock--; \ 
    if (flag) \ 
        __schedule(); \ 
} while (0) 
 
#if CFG_PRIO_MODE > 1 
# define __nprio_lock(cprio) \ 
do { \ 
    _tasks[cprio].lock++; \ 
} while (0) 
# define __nprio_unlock(cprio) \ 
do { \ 
    _tasks[cprio].lock--; \ 
} while (0) 
#endif 
 
/*timer.c----------------------------------------------------------*/ 
u8  __do_tick(void); 
 
/*task.c----------------------------------------------------------*/ 
u8*   __stack_init(entry_t entry, arg_t arg, sp_t ptos); 
void  __task_init(void); 
void  __idle_task(arg_t arg); 
 
#if CFG_TASK_INFO_EN > 0 
u32  __get_max_idlecnt(void); 
void __usrtask_suspend(void); 
void __usrtask_resume(void); 
void __info_task(arg_t arg); 
#endif 
 
 
/*===========================================================================*/ 
#endif