uc/os-ii操作系统堆栈浅谈

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()的参数并调用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值