UCOS操作系统堆栈浅谈Word格式.docx
- 文档编号:20589067
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:7
- 大小:17.19KB
UCOS操作系统堆栈浅谈Word格式.docx
《UCOS操作系统堆栈浅谈Word格式.docx》由会员分享,可在线阅读,更多相关《UCOS操作系统堆栈浅谈Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
2设置堆栈生产方向
uc/os-ii操作系统支持2中堆栈生长方向。
即可从高地址往低地址生长,也可以由低地址往高地址生长。
在调用OSTaskCreate()或者OSTaskCreateExt()创建任务的时候由于必须知道堆栈的生长方向,所以要在OS_CPU.H
文件中设置任务堆栈的生长方向。
#defineOS_STK_GROWTH1//设置堆栈是从上往下长的
OSTaskCreate(Task,pdata,&
TaskStk[StkSize-1],prio);
#defineOS_STK_GROWTH0//设置堆栈是从下往上长的
TaskStk[0],prio);
当然也可以这样编写创建任务的以支持堆栈的从上往下和从下往上生长
#ifOS_STK_GROWTH==1
#else
#endif
3堆栈检验
为控制产品成本,有时需要确定任务实际需要的堆栈空间的大小,避免为任务分配过多的对战空间,从而
减少应用程序代码所需的RAM数量。
uc/os-ii系统提供OSTaskStkChk()函数用以确定任务实际需要的堆栈空间。
使用堆栈检验功能必须做一下几点:
1.在OS_CFG.H文件中设置OS_TASK_CREATE_EXT为1
2.使用OSTaskCreateExt()创建任务,并且赋予任务比实际需要多一点的空间。
可以在任何任务中调用STaskStkChk()函数,对任何用OSTaskCreateExt()建立的任务进行堆栈检验。
3.在OSTaskCreateExt()中,将参数opt设置为:
OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR
4.把需要进行检测的任务的优先级作为OSTaskStkChk()的参数并调用
应使自己的应用程序运行足够长的时间,并且经历最坏的堆栈使用情况,这样才能得到正确的树木。
一旦得到所需要的对单需求,就可以重新设置堆栈的最终大小了。
在堆栈检验中,所得到的只是一个大智的堆栈使用情况,并不能说明堆栈的使用全部实际情况。
4堆栈溢出
在实际的项目中,由于产品的升级需要可能一个任务会经常修改,所需要的实际堆栈大小并不能很好的确定,即便使用堆栈检验功能后,在后续产品的升级过程中变量的增加会导致堆栈不够用。
而在调试的过程中,如果没有堆栈溢出的报警机制,一旦堆栈出现溢出,这个问题是很难一时被发现的。
在这里,我建议在系统开始运行前,把每个任务的堆栈栈顶初始化一个值,每次出现任务切换的时候就读取对应栈顶的值,如果和初始化栈顶值相同的话就说明没有问题,如果值出现改变的话那么出现堆栈溢出的概率至少达到90%以上,这样可以避免出现堆栈溢出而不能发现的尴尬。
下面是个项目的一部分,删了一些,可供参考。
#include&
user/lc_sqce_aj.h&
#include&
include_all.h&
/*sizeofeachtask'
sstacks(#ofWORDs)*/
#defineTASK_START_STK_SIZE128
#defineBUZZER_STK_SIZE128
#defineCTRLMSG_STK_SIZE128
#defineSTORDEV_MOUNT_STK_SIZE512
#defineMODE_SWITCH_STK_SIZE512
#defineMODE_EXE_STK_SIZE2000
#defineTWO_CHANNEL_REC_SIZE512
#defineALARM_STK_SIZE128
#defineTASK_STK_SIZE512
/*applicationtasks*/
#defineTASK_START_ID0
#defineTASK_1_ID1
#defineTASK_2_ID2
#defineTASK_3_ID3
#defineTASK_4_ID4
#defineTASK_5_ID5
#defineTASK_6_ID6
#defineTASK_7_ID7
#defineTASK_8_ID8
#defineTASK_9_ID9
#defineTASK_10_ID10
#defineTASK_11_ID11
#defineTASK_12_ID12
#defineTASK_13_ID13
#defineTASK_14_ID14
#defineTASK_15_ID15
/*applicationtaskspriorities*/
#defineTASK_START_PRIO0
#defineTASK_1_PRIO1
#defineTASK_2_PRIO2
#defineTASK_3_PRIO3
#defineTASK_4_PRIO4
#defineTASK_5_PRIO5
#defineTASK_6_PRIO6
#defineTASK_7_PRIO7
#defineTASK_8_PRIO8
#defineTASK_9_PRIO9
#defineTASK_10_PRIO10
#defineTASK_11_PRIO11
#defineTASK_12_PRIO12
#defineTASK_13_PRIO13
#defineTASK_14_PRIO14
#defineTASK_15_PRIO15
/*seetaskstacks*/
OS_STKTaskStartStk[TASK_START_STK_SIZE];
OS_STKBuzzerStk[BUZZER_STK_SIZE];
OS_STKCtrlmsgStk[CTRLMSG_STK_SIZE];
OS_STKStorDevStk[STORDEV_MOUNT_STK_SIZE];
OS_STKModeSwitchStk[MODE_SWITCH_STK_SIZE];
OS_STKModeExeStk[MODE_EXE_STK_SIZE];
staticvoidTaskStart(void*p_arg);
//函数声明
staticvoidTaskStartCreateTasks(void);
voidInitStackMark(void);
//************************************************************************************
//*函数名:
main
//*返回值:
N/A
//*参数:
//*函数说明:
主函数
//*作者:
啊呆
//***********************************************************************************
voidmain(void)
INT8Uerr;
//initializeuC/OS-II
OSInit();
//installuC/OS-II'
scontextswitchvector
IRQSetVect(uCOS,OSCtxSw);
OSTaskCreateExt(TaskStart,
(void*)0,
&
TaskStartStk[TASK_START_STK_SIZE-1],
TASK_START_PRIO,
TASK_START_ID,
TaskStartStk[0],
TASK_START_STK_SIZE,
OS_TASK_OPT_STK_CLR+OS_TASK_OPT_STK_CHK);
OSTaskNameSet(TASK_START_PRIO,&
StartTask&
&
err);
//startmultitasking
OSStart();
}
//*********************************************************************************
TaskStart
void*p_arg
创建TaskStart任务
//********************************************************************************
staticvoidTaskStart(void*p_arg)
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
//preventcompilerwarning
p_arg=p_arg;
sclocktickISR
OS_ENTER_CRITICAL();
IRQSetVect(TMR1_VEC,OSTickISR);
OSSetTickRate(lc_clk_get_freq(CLK_SYS_SEL),OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
//initializeuC/OS-II'
sstatistics
OSStatInit();
TaskStartCreateTasks();
for(;
;
)
{
//clearthecontextswitchcounter
OSCtxSwCtr=0;
//waitonesecond
OSTimeDly(OS_TICKS_PER_SEC);
//*******************************************************************************
TaskStartCreateTasks
创建任务
//******************************************************************************
staticvoidTaskStartCreateTasks(void)
//初始化,创建每个任务对应需要的信号量
init_buzzer_proc();
init_ModeEXE_proc();
init_ctrlmsg_get_proc();
init_twoChRec_proc();
InitStackMark();
//创建任务
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
初始化堆栈栈顶
//**************************************************************************
voidInitStackMark(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
INT8UTaskName
初检测堆栈溢出
BOOLEANCheckStkOverFlow(INT8UTaskName)
//判断是否堆栈溢出
if(TaskName==buzzer)
if(BuzzerStk[0]==0x5153&
&
BuzzerStk[1]==0xAA55)
returnFALSE;
elseif(TaskName==ctrlmsg)
if(CtrlmsgStk[0]==0x5153&
CtrlmsgStk[1]==0xAA55)
elseif(TaskName==stordev_mount)
if(StorDevStk[0]==0x5153&
StorDevStk[1]==0xAA55)
elseif(TaskName==mode_switch)
if(ModeSwitchStk[0]==0x5153&
ModeSwitchStk[1]==0xAA55)
elseif(TaskName==ModeEXE)
if(ModeExeStk[0]==0x5153&
ModeExeStk[1]==0xAA55)
returnTRUE;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UCOS 操作系统 堆栈 浅谈