SimpleBLEPeripheral的例程里,P1IO中断服务程序里调用osal_stop_timerEx函数不起作用。
您好,我的问题是这样的:是不是在中断服务程序里调用osal_stop_timerEx(),是不起作用的?
我用 osal_start_timerEx() 函数设置一个20ms的事件,这20ms是等待P1.6端口的中断信号。如果20ms内顺利进入P1的中断服务程序,就调用osal_stop_timerEx()函数取消这个事件计时。
运行时,20ms内顺利进入中断,然后中断程序里也调用了osal_stop_timerEx()去取消这个20ms的事件计时,可是中断服务程序结束后,竟然又进入了这个20ms的事件处理。
一开始我以为20ms时间太短,然后我把事件时间设置成100ms,问题依旧。难道在中断服务程序里调用osal_stop_timerEx()函数,不起作用?
下面是我操作过程:
首先定义事件ID
然后,获取任务ID
然后,设置一个20ms的事件,等待P1.6的中断
进入P1中断服务程序时,osal_stop_timerEx()停止事件
补充:20ms的事件处理
改正了这里的错误,问题依旧,osal_stop_timerEx()依然不能停止20ms事件计时。
再次怀疑,20ms时间太短,导致等到执行osal_stop_timerEx()时,20ms计时已经结束,20ms的事件标志已经置位;
再次实验:把20ms计时改成3s计时事件,断点设在P1中断里osal_stop_timerEx()的后面。
实验结果:P1IO 中断里的osal_stop_timerEx() 依旧没有成功停止3s计时事件,中断处理程序运行结束后,依旧进入了3s计时事件处理部分;
结论:此问题中,P1IO 中断里的osal_stop_timerEx() 没有成功取消计时事件,原因不在计时事件时间长短;
再次实验
实验目的:测试osal_stop_timerEx()在 P1IO 中断处理程序外面有没有作用;
实验方法:在调用设置20ms计时事件函数语句的后面,紧接着运行osal_stop_timerEx()取消该20ms计时事件。
实验结果:1、20ms事件计时确实被停止了;
2、同时又发现一个有趣的现象,该函数osal_stop_timerEx()是有返回值的,可是上图中这句
communic_busy = osal_stop_timerEx( temp_TaskID, COMMUNICATE_TIMEOUT_EVT );
执行完之后,变量communic_busy的值居然没有变化;
此次实验结论:osal_stop_timerEx()在 P1IO 中断处理程序外面是可以停止事件计时的。
疑问:难道osal_stop_timerEx()真的不可以在P1IO 中断程序中成功实现停止事件计时?
你好,
感谢你的回馈,问题反映的非常详细。
我明天会仔细阅读你反映的问题,然后在自己的demo板上测试。
有结论后再反馈给你。
谢谢,那就麻烦您了。