去年我问了一个问题,我用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的回调来更新这个变量。我担心当app timer的回调试图同时更新“timerCounter”的值时,会读取错误的值“timerCounter”。如果app timer的回调不是一个中断例程,它只是结构程序的一部分,我认为竞争条件不会发生。谢谢。
嗨jackiechau,
明确地说,ke_timers被认为是BLE事件,这意味着为了调度BLE事件,应该打开BLE核心,并且应该定期运行rwip_schedule()。
我没有看到你提到的场景中的任何竞争条件,ke_timers不是中断驱动的事件,当指定的内核计时器已经经过时,调度程序应该运行,提供计时器已经经过的消息,找到特定计时器的回调并调用回调。
由于MT_dialog