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

Zak*_*kir 0 c embedded multithreading

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

void reach_target_value(volatile int* addr, int value);
Run Code Online (Sandbox Code Playgroud)

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

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

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

tof*_*fro 5

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

可能的答案范围从你的"天真"忙等待方法,这可以是一个完全有效的解决方案,例如,等待中断的AVR Tiny,并且绝对没有别的事可做,超过使用计时器任务经常观看更改mprotect在嵌入式Linux系统上使用以观察变量"在硬件中"并在某些代码写入该内存时立即接收信号(以及许多其他方法来解决该问题).

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

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

总而言之:面试官绝对不会期待看到代码 - 他们希望听到你的澄清问题以及你能够解决问题的能力,最终提出一个可行的(明显简单的)问题解决方案.我实际上觉得这是一个非常好的面试问题.