TI中文支持网
TI专业的中文技术问题搜集分享网站

28335移植ucos2 v2.52 时调用ucos函数时实参无法传递给形参的问题

我用的芯片是TMS320F28335,板子是第三方的,CCS用的是v5.5,。我想将ucos移植到DSP上,现在已经成功了部分,可以实现任务切换,但是现在的一个问题是,我想在任务中创建任务时,出现了实参无法传递给形参的问题,代码如下:

#include "DSP28x_Project.h"
#include "includes.h"
#include "BSP.h"

#define  TASK_STK_SIZE   512   //任务堆栈长度

OS_STK   MyTaskStk[TASK_STK_SIZE];  //定义任务堆栈区
OS_STK   YouTaskStk[TASK_STK_SIZE];  //定义任务堆栈区
#pragma DATA_SECTION( MyTaskStk, "MultiTaskStk");
#pragma DATA_SECTION( YouTaskStk, "MultiTaskStk");

INT8U err;

INT16U YouTaskRun = 0;

OS_EVENT *Task_Semp;

void  MyTask(void *pdata);   //声明一个任务
void  YouTask(void *pdata);   //声明一个任务

/************************主函数*********************************************/

void  main (void)
{

    DSP_Init();

    OSInit();     //初始化uCOS_II

    err = OSTaskCreate( &MyTask,   //创建任务MyTask
      ( void* )0,    //给任务传递参数
            &MyTaskStk[ 0 ],//设置任务堆栈栈顶指针
            1);    //使任务MyTask的优先级别为0

 

    OSStart();     //启动uCOS_II的多任务管理
}

void  MyTask(void *pdata)
{
    pdata = pdata;

 err = OSTaskCreate( &YouTask,( void* )0,&YouTaskStk[ 0 ],3 );    //使任务MyTask的优先级别为0

    //OSStatInit();

    for (;;)
 {
     OS_ENTER_CRITICAL();

     Sci_Xmit( 'M' );

     OS_EXIT_CRITICAL();

     //OSTimeDly( 100 );
     OSTimeDlyHMSM( 0, 0, 0, 100 ); //等待
    }
}

void  YouTask(void *pdata)
{
    pdata = pdata;

    for (;;)
 {
     OS_ENTER_CRITICAL();

     Sci_Xmit( 'Y' );

     OS_EXIT_CRITICAL();

     //OSTimeDly( 100 );
     OSTimeDlyHMSM( 0, 0, 0, 100 ); //等待
    }
}

当任务执行到MyTask时,首先是创建YouTask任务,首先附上OSTaskCreate函数代码:

INT8U  OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
{
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr;
#endif
    OS_STK    *psp;
    INT8U      err;

#if OS_ARG_CHK_EN > 0
    if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
        return (OS_PRIO_INVALID);
    }
#endif
    OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing …  */
                                             /* … the same thing until task is created.              */
        OS_EXIT_CRITICAL();
        psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);    /* Initialize the task's stack         */
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                        /* Increment the #tasks counter        */
            OS_EXIT_CRITICAL();
            if (OSRunning == TRUE) {         /* Find highest priority task if multitasking has started */
                OS_Sched();
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
            OS_EXIT_CRITICAL();
        }
        return (err);
    }
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);
}

,其中,当执行到OS_TCBInit这个函数时,在此例中,会将任务优先级,prio,实参为3的参数,传递给形参,但是在单步调试中发现,prio始终未0,也就是出现了实参无法传递给形参的情况,但是奇怪的是,我在OSStart之前创建任务,却可以成功,类似的情况也出现在其他地方,例如在OSTimeHMSM中,首先是其源代码:

INT32U ticks;
INT16U loops;
INT8U  OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
{
    //INT32U ticks;
    //INT16U loops;

    if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
        if (minutes > 59) {
            return (OS_TIME_INVALID_MINUTES);    /* Validate arguments to be within range              */
        }
        if (seconds > 59) {
            return (OS_TIME_INVALID_SECONDS);
        }
        if (milli > 999) {
            return (OS_TIME_INVALID_MILLI);
        }
                                                 /* Compute the total number of clock ticks required.. */
                                                 /* .. (rounded to the nearest tick)                   */
        ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
           + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
        loops = (INT16U)(ticks / 65536L);        /* Compute the integral number of 65536 tick delays   */
        ticks = ticks % 65536L;                  /* Obtain  the fractional number of ticks             */
        OSTimeDly((INT16U)ticks);
        while (loops > 0) {
            OSTimeDly(32768);
            OSTimeDly(32768);
            loops–;
        }
        return (OS_NO_ERR);
    }
    return (OS_TIME_ZERO_DLY);
}

这个函数的源代码是我进行了修改的,从代码中看,变量ticks和loops,如果是在函数体内进行定义,那么在hours等参数不为0的情况下,如ticks即使进行了计算,结果还是为0,但按上述代码,将其声明为全局变量,便不会有以上问题。

对于上述问题,可以归结为实参无法传递给形参的情况,我怀疑是堆栈的问题,但是照理说我实现了任务的切换,堆栈应该没有问题,又或者是不是CCS配置的问题?请问一下该如何解决? 

 

 

 

 

赞(0)
未经允许不得转载:TI中文支持网 » 28335移植ucos2 v2.52 时调用ucos函数时实参无法传递给形参的问题
分享到: 更多 (0)