我有一个计数器列表,我在每个时钟中断检查每个计数器。每当计数器到期时,我需要将所有已过期的计数器返回给调用代码,以便知道哪一个已过期。什么是最优雅的方式来做同样的事情? 我正在考虑在数组中设置每个标志并进行检查。但是我发现在检查计数器到期时再进行一轮检查。
只要时钟周期到期,就会调用CheckCounterExpiry函数。下面不处理返回,因为这是我的查询。
void CheckCounterExpiry()
{
Node *prev, *temp;
if (head == NULL)
{
return;
}
else
{
/*Check for counter and delete, return set of deleted id types as to signal which got deleted*/
prev = NULL;
temp = head;
while (temp->next != NULL)
{
if (clocktick== temp->target)
{
if (prev == NULL)
{
head = NULL;
}
/* I need to return the list of temp->counterId here. how to do it best?*/
prev->next = temp->next;
free(temp);
}
else
{
prev= temp;
temp = temp->next;
}
}
}
}
答案 0 :(得分:0)
范式转变。请勿缩小CheckCounterExpiry()
中的链接。
由于您使用全局值head
与ISR(中断服务例程void CheckCounterExpiry()
)进行通信,当前哪些时钟处于活动状态,我建议添加另一个字段bool Active
Node
。在CheckCounterExpiry()
中,当时钟到期时将其设置为false。
因此CheckCounterExpiry()
仅更新Active
字段。让另一个例程,比如Node *GetExpiredClock()
消耗去激活的时钟。如果有的话,它会得到 1 过期的时钟,否则返回NULL。它将列表缩小为1,因为这个是node
完成的时间。如果需要,可多次呼叫。此例程可能需要中断保护,以确保不会调用CheckCounterExpiry()
。
此外,内部CheckCounterExpiry()
更改如下。这样就可以防止误操作一切。
// if (clocktick== temp->target)
if (clocktick >= temp->target)