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