CC3200的多任务。
看过SYS/BIOS (TI-RTOS Kernel) v6.45 User's Guide后,对task和Semapore有了一定的了解。现在有个疑问
假如CC3200有两个task:task1、task2,以下这两个task的优先级相同,
情况一:task1先于task2创建,那么运行时应该是task1先运行完了,再运行task2,还是task1先运行一段时间然后task2再运行一段时间,交替运行。
情况二:task1先于task2创建,先运行的task1被Semapore_pend所阻塞(这里Semapore被初始化为0了),接下来task2运行,期间它向task1进行了Semapore_post操作,此时task2是继续先运行完了,再运行task1?还是先运行taks1再运行taks2?(如果taks1的优先级高,肯定毫无疑问是先运行taks1,但优先级相同,task1先于task2创建这种情况,我就不知道了)
按照手册,相同优先级是FIFO的模式,即先到先得。所以,情况一,task1不pend,将一直运行。情况二则是task2继续运行,直到task2 pend。
这个做几个实验应该是可以看出这个规则的。
我建了两个任务,一个就是sdk的demo中的wlan_ap,优先级为15,另外还建了一个任务,优先级只有1,按理说应该把demo中的wlan_ap运行完了,再运行另外一个任务,可是怎么wlan_ap任务每次走到ConfigureSimpleLinkToDefaultState函数的里面时,都会去执行另外一个任务呢(因为我在另外一个任务的开头是打印信息,所以一下就能看出进了任务2中),而且就执行了很短的两句话,马上就回到任务1的wlan_ap中,然后就在这里正常执行了,有点儿搞不明白究竟在ConfigureSimpleLinkToDefaultState里发生了什么导致它往低优先级的任务中走?并且很短时间后就又回来了(我也没有使用Semaphores这类的东西啊,搞不懂)。
那个函数里面有调用osi_Sleep(),不就放弃运行了吗?
好像还真是这样,刚才查了一下,里面调用了一个函数sl_WlanPolicySet,有这么个参数SL_POLICY_PM, defines a power management policy for Station mode only:看来确实隐含了osi_Sleep(),非常感谢,谢谢。