嵌入式系统:设计监控地址的API

时间:2018-05-17 23:00:07

标签: c multithreading embedded

这个问题被作为半导体公司技术面试的起点。我想没有正确的答案 - 这个开放式问题的目的是衡量工程师的深度和舒适度。问题: - 设计一个监控地址的API,并在地址包含特定值时返回: -

void reach_target_value(volatile int* addr, int value);

我天真的解决方案是这样的: -

void reach_target_value(volatile int* addr, int value)
{
  while(*addr != value)
  {
    //Do nothing - spin in a tight loop
  }
}

现在显然在多处理/多线程环境中,如果在执行进程/线程被上下文切换时地址恰好达到目标值,则可能会错过返回。在这种情况下,如何增强代码以确保它在多线程环境中运行良好,其中多个线程将监视具有不同目标值的相同地址?感谢您的阅读 - 感谢您的建议 - 代码 - 指针!

2 个答案:

答案 0 :(得分:5)

这是一个可以(正如您所假设的)以最广泛的方式回答的问题。这个面试问题的关键不在于你的答案(你得到的先决条件,你无论如何都无法回答) - 而是你的澄清问题,你是否有方法和技巧来通过越来越详细的问题包围问题来追查问题

可能的答案范围从您的"天真"忙等待方法,这可以是一个完全有效的解决方案,例如,等待中断的AVR Tiny,并且绝对没有别的事可做,而不是使用计时器任务经常监视使用{{1}的更改在嵌入式Linux系统上观看变量"在硬件中"一旦某些代码写入该内存,就会收到一个信号(还有很多其他方法可以解决问题)。

"正确的方式"做事情取决于你的面试官实际期望你提出的大量先决条件,(并且没有答案,没有可能的答案),如

  • 我们是在谈论裸机,还是有RTOS,甚至是嵌入式Linux或Windows?
  • 如果是裸机,我们是否可以在支持观察内存更改的环境中工作(某些ARM嵌入式CPU有)?
  • 系统在等待内存更改时是否还有其他任务?
  • 我们是否有定时器,如果是,预计变量的频率会有多大变化(例如,如果我们使用定时器方法,我们可能会错过更改的机会有多大,以及对变更做出反应的最低期望是什么? ,我们是否可以错过更改?)
  • 我们是否在虚拟内存环境中工作,支持可帮助我们完成mprotect的页面错误?相关:我们是否有任何可以帮助我们的硬件,如MMU或硬件观察点支持?
  • 如果我们有多个等待更改的线程,它们有多少,这是我们之前知道的常数,还是消费者随时间变化?
  • 如何到更改它的任务之间同步的内存地址?我们可以通过互斥体或类似物来访问它吗?
  • ....

而且,总结一下:面试官肯定不会期待看到代码 - 他们希望听到你的澄清问题和你在问题上的能力,最终提出一个可行的解决方案(显然很简单) )问题。我实际上觉得这是一个非常好的面试问题。

答案 1 :(得分:3)

我认为在循环中重复检查不是一个好的设计。

实际上,这个问题与以下问题具有相同的技术要点: Watch a memory location/install 'data breakpoint' from code?

当您检测到内存更改时,是检查值并确定是否返回的时间。