UCOS操作系統(tǒng)堆棧淺談
//*********************************************************************************
//* 函數(shù)名 :TaskStart
//* 返回值 :N/A
//* 參數(shù) :void *p_arg
//* 函數(shù)說明:創(chuàng)建TaskStart任務(wù)
//* 作 者:啊呆
//********************************************************************************
static void TaskStart(void *p_arg)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
// prevent compiler warning
p_arg = p_arg;
// install uC/OS-IIs clock tick ISR
OS_ENTER_CRITICAL();
IRQSetVect(TMR1_VEC, OSTickISR);
OSSetTickRate(lc_clk_get_freq(CLK_SYS_SEL), OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
// initialize uC/OS-IIs statistics
OSStatInit();
TaskStartCreateTasks();
for (;;)
{
// clear the context switch counter
OSCtxSwCtr = 0;
// wait one second
OSTimeDly(OS_TICKS_PER_SEC);
}
}
//*******************************************************************************
//* 函數(shù)名 :TaskStartCreateTasks
//* 返回值 :N/A
//* 參數(shù) :N/A
//* 函數(shù)說明:創(chuàng)建任務(wù)
//* 作 者:啊呆
//******************************************************************************
static void TaskStartCreateTasks(void)
{
//初始化,創(chuàng)建每個任務(wù)對應(yīng)需要的信號量
init_buzzer_proc();
init_ModeEXE_proc();
init_ctrlmsg_get_proc();
init_twoChRec_proc();
InitStackMark();
//創(chuàng)建任務(wù)
OSTaskCreate(buzzer_proc, (void *)0, &BuzzerStk[BUZZER_STK_SIZE-1], TASK_3_PRIO);
OSTaskCreate(ctrlmsg_get_proc, (void *)0, &CtrlmsgStk[CTRLMSG_STK_SIZE-1], TASK_5_PRIO);
OSTaskCreate(stordev_mount_proc, (void *)0, &StorDevStk[STORDEV_MOUNT_STK_SIZE-1], TASK_6_PRIO);
OSTaskCreate(mode_switch_proc, (void *)0, &ModeSwitchStk[MODE_SWITCH_STK_SIZE-1], TASK_7_PRIO);
OSTaskCreate(ModeEXE_proc, (void *)0, &ModeExeStk[MODE_EXE_STK_SIZE-1], TASK_11_PRIO);
}
//**************************************************************************
//* 函數(shù)名 :InitStackMark
//* 返回值 :N/A
//* 參數(shù) :N/A
//* 函數(shù)說明:初始化堆棧棧頂
//* 作 者:啊呆
//**************************************************************************
void InitStackMark(void)
{
//初始化每個堆棧棧頂
BuzzerStk[0]=0x5153;
BuzzerStk[1]=0xAA55;
CtrlmsgStk[0]=0x5153;
CtrlmsgStk[1]=0xAA55;
StorDevStk[0]=0x5153;
StorDevStk[1]=0xAA55;
ModeSwitchStk[0]=0x5153;
ModeSwitchStk[1]=0xAA55;
ModeExeStk[0]=0x5153;
ModeExeStk[1]=0xAA55;
}
//*****************************************************************************
//* 函數(shù)名 : CheckStkOverFlow
//* 返回值 :BOOLEAN
//* 參數(shù) :INT8U TaskName
//* 函數(shù)說明:初檢測堆棧溢出
//* 作 者:啊呆
//******************************************************************************
BOOLEAN CheckStkOverFlow(INT8U TaskName)
{
//判斷是否堆棧溢出
if(TaskName==buzzer)
{
if(BuzzerStk[0]==0x5153 && BuzzerStk[1]==0xAA55)
return FALSE;
}
else if(TaskName==ctrlmsg)
{
if(CtrlmsgStk[0]==0x5153 && CtrlmsgStk[1]==0xAA55)
return FALSE;
}
else if(TaskName==stordev_mount)
{
if(StorDevStk[0]==0x5153 && StorDevStk[1]==0xAA55)
return FALSE;
}
else if(TaskName==mode_switch)
{
if(ModeSwitchStk[0]==0x5153 && ModeSwitchStk[1]==0xAA55)
return FALSE;
}
else if(TaskName==ModeEXE)
{
if(ModeExeStk[0]==0x5153 && ModeExeStk[1]==0xAA55)
return FALSE;
}
評論