1 声明仓库巨细
在uc/os-ii操作体系的使命切换和中止处理过程中,需求保存处理器的内部寄存器和变量的值,这就
要求每个使命都有自己的仓库空间。仓库有必要声明为OS_STK类型,而且由接连的内存空间组成,能够静态
分配空间(在编译时分配),也能够动态分配仓库空间(在运转时分配)。因为选用动态分配方法,会导致
内存中含有很多内存碎片,因而不引荐运用动态分配方法。其两种声明方法如下:
静态分配方法:
static OS_STK TaskStk[StkSize];
或许
OS_STK TaskStk[StkSize];
动态分配方法:
OS_STK *pstk;
pstk = (OS_STK*)malloc(StkSize);
if(pstk != (OS_STK*)0) //判别仓库分配是否成功
{
printf(“Create TaskStk Success”);
}
2 设置仓库出产方向
uc/os-ii操作体系支撑2中仓库成长方向。即可从高地址往低地址成长,也能够由低地址往高地址成长。
在调用OSTaskCreate()或许OSTaskCreateExt()创立使命的时分因为有必要知道仓库的成长方向,所以要在OS_CPU.H
文件中设置使命仓库的成长方向。
#define OS_STK_GROWTH 1 //设置仓库是从上往下长的
OSTaskCreate(Task,pdata,&TaskStk[StkSize – 1],prio);
或许
#define OS_STK_GROWTH 0 //设置仓库是从下往上长的
OSTaskCreate(Task,pdata,&TaskStk[0],prio);
当然也能够这样编写创立使命的以支撑仓库的从上往下和从下往上成长
#if OS_STK_GROWTH == 1
OSTaskCreate(Task,pdata,&TaskStk[StkSize – 1],prio);
#else
OSTaskCreate(Task,pdata,&TaskStk[0],prio);
#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”
/* size of each tasks stacks (# of WORDs) */
#define TASK_START_STK_SIZE 128
#define BUZZER_STK_SIZE 128
#define CTRLMSG_STK_SIZE 128
#define STORDEV_MOUNT_STK_SIZE 512
#define MODE_SWITCH_STK_SIZE 512
#define MODE_EXE_STK_SIZE 2000
#define TWO_CHANNEL_REC_SIZE 512
#define ALARM_STK_SIZE 128
#define TASK_STK_SIZE 512
/* application tasks */
#define TASK_START_ID 0
#define TASK_1_ID 1
#define TASK_2_ID 2
#define TASK_3_ID 3
#define TASK_4_ID 4
#define TASK_5_ID 5
#define TASK_6_ID 6
#define TASK_7_ID 7
#define TASK_8_ID 8
#define TASK_9_ID 9
#define TASK_10_ID 10
#define TASK_11_ID 11
#define TASK_12_ID 12
#define TASK_13_ID 13
#define TASK_14_ID 14
#define TASK_15_ID 15
/* application tasks priorities */
#define TASK_START_PRIO 0
#define TASK_1_PRIO 1
#define TASK_2_PRIO 2
#define TASK_3_PRIO 3
#define TASK_4_PRIO 4
#define TASK_5_PRIO 5
#define TASK_6_PRIO 6
#define TASK_7_PRIO 7
#define TASK_8_PRIO 8
#define TASK_9_PRIO 9
#define TASK_10_PRIO 10
#define TASK_11_PRIO 11
#define TASK_12_PRIO 12
#define TASK_13_PRIO 13
#define TASK_14_PRIO 14
#define TASK_15_PRIO 15
/*see task stacks*/
OS_STK TaskStartStk[TASK_START_STK_SIZE];
OS_STK BuzzerStk[BUZZER_STK_SIZE];
OS_STK CtrlmsgStk[CTRLMSG_STK_SIZE];
OS_STK StorDevStk[STORDEV_MOUNT_STK_SIZE];
OS_STK ModeSwitchStk[MODE_SWITCH_STK_SIZE];
OS_STK ModeExeStk[MODE_EXE_STK_SIZE];
static void TaskStart(void *p_arg); //函数声明
static void TaskStartCreateTasks(void);
void InitStackMark(void);
//************************************************************************************
//* 函数名 :main
//* 返回值 :N/A
//* 参数 :N/A
//* 函数阐明:主函数
//* 作 者:啊呆
//***********************************************************************************
void main(void)
{
INT8U err;
// initialize uC/OS-II
OSInit();
// install uC/OS-IIs context switch vector
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,
(void *)0,
OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
OSTaskNameSet(TASK_START_PRIO, “Start Task”, &err);
// start multitasking
OSStart();
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/317707.html