我调用Task_sleep(standbyDurationUs / Clock_tickPeriod);函数使模块进入standby模式,然后我用按键唤醒,在中断服务中我改变了进入Task_sleep();函数的标志位,但是实际情况是标志位改变了但是模块依然是standby模式,请问怎么才能退出Task_sleep(standbyDurationUs / Clock_tickPeriod)函数?
Susan Yang:
请问您现在使用的是什么芯片?
Levi:
回复 Susan Yang:
您好 Susan Yang
CC1310
Levi:
回复 Susan Yang:
Susan Yang
我使用的是CC1310,请问TaskSleep()函数调用之后怎么才能停止呢?我采用过把 TaskSleep()函数中的值减小到微秒级,按照standby例程中所描述芯片应该处于IDLE模式,但是实际山设备并没有切换模式,请问我要怎么做才能切换模式呢?
Eggsy Pang:
回复 Levi:
请问你用的是哪一个例程?你所说的标志位是什么呢?TaskSleep()并没有这个参数。
使用TaskSleep(),时间到后,并不是一定恢复到工作模式,如果当前程序没有其他任务代码要运行,RTOS自动处于到待机模式
Levi:
回复 Eggsy Pang:
您好:
我用的pinStandby例程,标志例程没有的,我自己加的按键和标志;您说TaskSleep()函数在时间到的时候才会醒来执行一次需要执行的任务,也就是说不能使这个函数的计时停止;那么能不能不使用这个函数用其它方式进入standby模式,从而实现模式切换。
Eggsy Pang:
回复 Levi:
你可以参考pinshutdown这个例程,它是让mcu处于最低功耗模式,可以用按键切换到工作模式,如果你不想最低功耗模式,想切到standby模式,在上面小改一下就可以了
Felix ZF:
回复 Levi:
建议使用semaphore进行任务调度
使用Semaphore_pend将task block掉,和使用task_sleep效果一样,都是将当前task block掉,执行优先级更低的就绪任务,如果没有其他任何就绪的user task,则执行系统的idle task,这时RTOS就可以将系统置于sleep状态
当之前使用Semaphore block掉的任务需要重新被执行的时候,可以使用Semaphore_post,这样只要当前没有比该task优先级更高的任务在执行或处于就绪状态时,例如,系统处于sleep状态,则该task就可以退出sleep,从之前被Semaphore_pend block的位置继续往下执行
Felix ZF:
回复 Levi:
你可以在HWI中post Semaphore来实现任务调度,将系统从sleep切换成active