去年我问了一个问题,我用app_timer_set启动一个计时器,在这个定时器回调,一个变量“timerCounter”将增加和timerCounter”将在主要检索(),我想暂停这个柜台前阅读的价值“timeCounter”,然后恢复一遍。所以我想知道如何挂起和恢复这个计时器。一个人回答说,不用担心竞争条件问题,因为这是一个单线程程序,谢谢。
void main (void) {
uint8_t get_time;
app_timer_set (SPS_TIMER TASK_APP 100);
而(1){
// <——挂起回调??
get_time = timerCounter;
// <——恢复回调??
api ();
}
}
在app_ble_timer_handler(x, x, x, x)
{
timerCounter + +;
app_timer_set (SPS_TIMER TASK_APP 100);
返回(KE_MSG_CONSUMED);
}
设备:
嗨jackiechau,
没有函数会冻结并恢复当前计时器进行计数,甚至返回计时器自启动以来已经计数的时间。在580中定时器没有这样的功能。
由于MT_dialog
嗨MT_dialog,
那么,竞态条件问题没有因为单线程程序而发生是正确的吗?谢谢。
嗨jackiechau,
你能解释一下什么是竞态条件吗?你担心的是哪个事件之间的竞态条件?例如,设置计时器和在计时器失效前取消它之间的竞争条件?
由于MT_dialog
嗨MT_dialog,
在主while循环中,一个变量"timerCounter"总是被读取,并且这个变量被app timer的回调更新。我担心一个错误的值“timerCounter”是读取时,应用程序计时器的回调是试图更新的值“timerCounter”在同一时间。如果app timer的回调不是一个中断例程,它只是结构程序的一部分,我认为竞争条件不会发生。谢谢。
嗨jackiechau,
需要明确的是,ke_timers被认为是BLE事件,这意味着为了调度BLE核心,并且rwip_schedule()应该定期运行。
我没有看到任何竞态条件,ke_timers不是中断驱动的事件,当指定的内核计时器已经运行时,调度程序应该运行,提供计时器已经运行的消息,找到特定的计时器的回调,并调用回调。
由于MT_dialog