新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > UCOS操作系統(tǒng)堆棧淺談

UCOS操作系統(tǒng)堆棧淺談

作者: 時間:2016-12-01 來源:網絡 收藏
//*********************************************************************************
//* 函數名 :TaskStart
//* 返回值 :N/A
//* 參數 :void *p_arg
//* 函數說明:創(chuàng)建TaskStart任務
//* 作 者:啊呆
//********************************************************************************
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);
}
}
//*******************************************************************************
//* 函數名 :TaskStartCreateTasks
//* 返回值 :N/A
//* 參數 :N/A
//* 函數說明:創(chuàng)建任務
//* 作 者:啊呆
//******************************************************************************
static void TaskStartCreateTasks(void)
{
//初始化,創(chuàng)建每個任務對應需要的信號量
init_buzzer_proc();
init_ModeEXE_proc();
init_ctrlmsg_get_proc();
init_twoChRec_proc();
InitStackMark();
//創(chuàng)建任務
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);
}
//**************************************************************************
//* 函數名 :InitStackMark
//* 返回值 :N/A
//* 參數 :N/A
//* 函數說明:初始化堆棧棧頂
//* 作 者:啊呆
//**************************************************************************
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;
}
//*****************************************************************************
//* 函數名 : CheckStkOverFlow
//* 返回值 :BOOLEAN
//* 參數 :INT8U TaskName
//* 函數說明:初檢測堆棧溢出
//* 作 者:啊呆
//******************************************************************************
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;
}
return TRUE;
}
上一頁 1 2 下一頁

評論


技術專區(qū)

關閉