This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我用的芯片是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配置的问题?请问一下该如何解决?