OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4209|回复: 2

检测ucosii堆栈大小得函数不太会使用,请教一下各位大神,附上代码

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-8-8
在线时间
6 小时
发表于 2020-1-23 15:44:14 | 显示全部楼层 |阅读模式
1金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"
#include "string.h"
#include "EXNT.h"



/////////////////////////UCOSIIèÎÎñéèÖÃ///////////////////////////////////
//START èÎÎñ
//éèÖÃèÎÎñóÅÏ輶
#define START_TASK_PRIO                              2 //¿aê¼èÎÎñμÄóÅÏ輶éèÖÃÎa×îμí
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define START_STK_SIZE                                  64
//èÎÎñ¶ÑÕ»       
OS_STK START_TASK_STK[START_STK_SIZE];
//èÎÎñoˉêy
void start_task(void *pdata);       
                          
//LED0èÎÎñ
//éèÖÃèÎÎñóÅÏ輶
#define LED0_TASK_PRIO                               0
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define LED0_STK_SIZE                                      64
//èÎÎñ¶ÑÕ»       
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//èÎÎñoˉêy
void led0_task(void *pdata);


//LED1èÎÎñ
//éèÖÃèÎÎñóÅÏ輶
#define LED1_TASK_PRIO                               1
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define LED1_STK_SIZE                                          64
//èÎÎñ¶ÑÕ»
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//èÎÎñoˉêy
void led1_task(void *pdata);


#define TASK_PRI_CHKTASK   3   //

#define TASK_STK_SIZE_CHKTASK  512 //

OS_STK gaTaskCheckTask[TASK_STK_SIZE_CHKTASK];

void CheckStackTask(void* pArg);



int main(void)
{       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏ輶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏ輶£¬2λÏìó|óÅÏ輶
        delay_init();            //Ñóê±oˉêy3õê¼»ˉ          
        LED_Init();                          //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
//        Data();
        uart_init(115200);
        OSInit();   
        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//′′½¨Æeê¼èÎÎñ
        OSStart();         
}
          
//¿aê¼èÎÎñ
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
        pdata = pdata;
  OS_ENTER_CRITICAL();                        //½øèëáù½çÇø(ÎT·¨±»ÖD¶Ï′ò¶Ï)   
                OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);                                                  
                OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);

        OSTaskCreateExt(CheckStackTask, NULL,&gaTaskCheckTask[TASK_STK_SIZE_CHKTASK-1], TASK_PRI_CHKTASK, TASK_PRI_CHKTASK,gaTaskCheckTask, TASK_STK_SIZE_CHKTASK, NULL, OS_TASK_OPT_STK_CLR|OS_TASK_OPT_STK_CHK);
        OSTaskSuspend(START_TASK_PRIO);        //1òÆeÆeê¼èÎÎñ.
        OS_EXIT_CRITICAL();                                //íË3öáù½çÇø(¿éòÔ±»ÖD¶Ï′ò¶Ï)
}



void CheckStackTask(void* pArg)
{
        u8 err1 =0,err2=0;
        OS_STK_DATA OSTKDataSize1,OSTKDataSize2;
        while(1)
        {
                err1=OSTaskStkChk(LED0_TASK_PRIO,&OSTKDataSize1);
                OSTimeDly(100);
                err2=OSTaskStkChk(LED1_TASK_PRIO,&OSTKDataSize2);
                OSTimeDly(100);
               
                printf("Task1 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize1.OSFree,OSTKDataSize1.OSUsed,err1);
                printf("Task2 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize2.OSFree,OSTKDataSize2.OSUsed,err2);
                printf("*******\n\n");

        }
       
}


void led0_task(void *pdata)
{                
        while(1)
        {
                LED0=0;
                delay_ms(80);
                LED0=1;
                delay_ms(920);
        }
}


void led1_task(void *pdata)
{          
        while(1)
        {
                LED1=0;
                delay_ms(300);
                LED1=1;
                delay_ms(300);
        }
}


///上面的CheckStackTask的任务是用于检测LED0跟LED1这两个任务的大小用的,现在遇到的问题是调用OSTaskStkChk()函数返回值69,OSFree跟OSUsed都是0,
///查看了一下函数返回值的说明发现提示的是要在OSTaskCreateExt()函数的参数最后一项加上OS_TASK_OPT_STK_CLR,我加上之后发现也没什么变化,还是0,返回值还是69,不知道哪里出了问题了


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10542
金钱
10542
注册时间
2017-2-18
在线时间
1908 小时
发表于 2020-2-3 11:27:43 | 显示全部楼层
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-6-9
在线时间
6 小时
发表于 2020-2-17 17:58:04 | 显示全部楼层
UCOSII源码注释上说的“使用OSTaskStkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的”应该用OSTaskCreateExt()函数创建LED0跟LED1这两个任务
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表