首页 > 解决方案 > 嵌入式系统:设计一个监控地址的 API

问题描述

在一家半导体公司的技术面试中,这个问题被作为一个起点提出来。我想没有正确答案 - 这个开放式问题的目的是衡量工程师的深度和舒适度。问题:- 设计一个 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
  }
}

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

标签: cmultithreadingembedded

解决方案


这确实是一个可以(正如您所假设的)以最广泛的方式回答的问题。那个面试问题的重点不是你的答案(在你得到的前提条件下,无论如何你都无法回答)——而是你的澄清问题,你是否有方法和技能来通过越来越详细的问题来追踪问题.

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

做事的“正确方式”是什么,取决于你的面试官实际上希望你问的大量先决条件,(如果没有这些问题的答案,就不可能回答)比如

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

而且,总结一下:面试官绝对不希望看到代码——他们希望听到你的澄清问题和你解决问题的能力,最终为一个(显然很简单的)问题提出一个可行的解决方案。我实际上发现这是一个非常好的面试问题。


推荐阅读