📄 misc.c
字号:
/*lmjx porting r&s to simuos 20050117*/
#include "arch/arch.h"
#include "inc/queue.h"
#include "inc/kernel.h"
#include "inc/memory.h"
#include "inc/ipc.h"
#include "inc/kapi.h"
extern void (*IntVetTbl[8])(void);
sp_t g_current_sp = 0,g_next_sp = 0;
struct regs_context
{
u16 es;
u16 di;
u16 si;
u16 bp;
u32 en_init;
u32 entry;
u32 exit;
u32 arg;
u16 earg;
};
typedef struct regs_context regs_t;
static void __entry_init(void)
{
ENABLE_IRQ;
}
sp_t __stack_init(entry_t entry, arg_t arg, sp_t stack_base)
{
regs_t* regs;
regs = (regs_t*)((u32)stack_base - sizeof(regs_t));
regs->es = (u16)0x0000;
regs->di = (u16)0x0000;
regs->si = (u16)0x0000;
regs->bp = (u16)0x0000;
regs->en_init = (u32)&__entry_init;
regs->entry = (u32)entry;
#if CFG_TASK_DEL_EN > 0
regs->exit = (u32)task_delete;
#endif
regs->arg = (u32)arg;
regs->earg = (u16)0xffff;
simuTaskCreate(entry,arg);
return (sp_t)regs;
}
void __simuos_do_tick(void)
{
register u8 cprio;
for (cprio = 0; cprio < TASK_IDLE_PRIO; cprio++) {
if (_tasks[cprio].delay != 0 &&
!(_tasks[cprio].state & STATE_SUSPEND)) {
if (--_tasks[cprio].delay == 0) {
__ready_que_add(cprio);
}
}
}
__schedule();
}
void __switch_start(sp_t next_sp)
{
g_current_sp = next_sp;
g_next_sp = next_sp;
simuSchedule();
}
void __switch_to(sp_t __p_* current_spadr, sp_t next_spadr)
{
g_current_sp = * current_spadr;
g_next_sp = next_spadr;
simuSchedule();
}
int CtxSwitchGetTaskFuc(unsigned int*curTaskFuc,unsigned int *nextTaskFuc)
{
if((g_current_sp==0)||(g_next_sp==0)){
return 1;
}
*curTaskFuc = (unsigned int)(((regs_t*)g_current_sp)->entry);
*nextTaskFuc = (unsigned int)(((regs_t*)g_next_sp)->entry);
return 0;
}
void IntVectSet(unsigned char irq, void (*isr)(void))
{ if ((irq >=0) && (irq < 8))
IntVetTbl[irq]=isr;
}
/*===========================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -