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

C6678 基于helloworld例程的任务切换问题

您好,

          我们现已根据论坛的相关资料,基于helloworld例程实现了从dsp向pc发送udp包的功能。

           目前的程序架构是创建了两个task,一个是用于初始化ndk的StackTest,任务等级为5,一个是用于发送udp包的sendUDPTsk,任务等级为3。程序上电运行后,执行完StackTest的打开Network以后,就会自动进入sendUDPTsk进行发数,每发一次数会Tasksleep50ms。

           我们现在想在这个程序的基础上,再增加两个任务。这几个任务需要交替进行。可是我该如何从sendUDPTsk切换到另外两个任务?

            我们原来做任务切换,就是设置标志位,然后设置相同任务等级,用taskyield交替切换。

            但是现在因为发udp用了tasksleep,现在对这样的任务切换没啥头绪?请各位大神帮忙解答,感谢

Nancy Wang:

请问你说的标志位是指什么?有没有试过通过Semaphore来实现任务的切换?
具体可以看看以下文档 4.1 Semaphore
www.ti.com/…/spruex3u.pdf

user4962317:

回复 Nancy Wang:

您好,

         我的标志位是自己设置的一个全局变量,初始值为0,对两个相同等级的任务1和2,在1中判断该变量为1直接taskyield,否则设置该变量为1后taskyield,在2中判断该变量为0直接taskyield,否则设置该变量为0后taskyield。之前是使用这样的一个任务切换机制。

          现在的程序要发udp包,必须使用tasksleep,我就不知道怎么同时使用这两种任务切换机制了?

          我又尝试往程序里增加一个任务,和发udp包的任务设置为相同等级,然后采用上述的taskyield切换,但是这样两个任务可以来回切换了,但是数发不出去了。

           tasksleep的时候是不能有别的任务存在吗?这个到底是起了一个什么作用,才让udp包发出去的?

user4962317:

回复 Nancy Wang:

我目前没有使用信号量来切换,这个udp发数的想切换必须用信号量吗?……

Nancy Wang:

回复 user4962317:

tasksleep是在一段时间内阻止该任务,可以有别的任务。
不是必须使用信号量,你现在的问题是可以实现切换了,但是影响udp发包了,目前是三个任务在切换吗?其它任务中有影响数据发送的操作吗?
请将相关代码通过附件上传看一下。

user4962317:

回复 Nancy Wang:

您好,

        我的程序主要分为 3个 任务 ,第一个任务是StackTest,和helloWorld例程中的是一样的,该任务的优先级最高,为5。

      程序执行完这个任务以后,就开始做任务切换。现在调试的情况是这样的:

     1.如果我将TestTsk和sendUDPTsk定义为相同等级任务,StackTest任务执行后会进入TestTsk,在这里我判断PktNum是否为0(设置初始值为0),若为0则+1后调用TaskYeild进行任务切换,然后会切换到sendUDPTsk进行UDP发数,调用sendto函数后无论是①注释TaskSleep,直接TaskYeild;还是②不注释TaskSleep,执行TaskSleep后再调用TaskYeild切换,PC端都无法收到UDP包;

      大概的代码是: 

 int TestTsk()

{

while(1)

{

if(PktNum==0)

{

PktNum++;

TaskYeild();}

else

{

TaskYeild();

}

}

return(0);

}

int sendUDPTsk()

{

while(1)

{

if(PktNum==1)

{

//执行UDP发数功能

PktNum=0;

//TaskSleep(50);//—无论是否注释,可以完成两个任务的切换,但是PC端都收不到UDP包

TaskYeild();

}

else

{

TaskYeild();

}

}

return(0);

}

     2.但是我将TestTsk和sendUDPTsk定义为不同等级任务,使用TaskSleep切换,PC端就可以收到UDP包。如下面两张图所示。

    我想问第一种方法为啥不行?是我哪个步骤不对吗?

user4962317:

回复 Nancy Wang:

您好,此外,我看论坛上的帖子都说,这个TaskSleep最短的时间应该是可以设置为1ms,但是我这个设置成1ms的话(不考虑任务切换的事了),PC端就收不到了,而且sendto返回值是小于0的,说是Error,这又是为啥啊?

Nancy Wang:

回复 user4962317:

单步调试看一下到哪一步有问题,并且再抓包看看是哪边的问题。

user4962317:

回复 Nancy Wang:

您好,

         请问,您的意思是我使用taskyield的这种切换是没问题的是吗?按道理是可以发送出去吗?

Nancy Wang:

回复 user4962317:

不是很确定,按道理不会影响,还是抓包看看有没有发包出去。

user4962317:

回复 Nancy Wang:

您好,

那请问,使用这种taskyield切换,udp发数后是否还需要tasksleep?这个到底是起了个啥作用才让udp包发出去的?为啥我这个就得50ms才行,我看别的1ms就可以了,这个该排查哪方面的原因?

赞(0)
未经允许不得转载:TI中文支持网 » C6678 基于helloworld例程的任务切换问题
分享到: 更多 (0)