0

假设函数 isr_callback() 在硬件中断上被调用。如果 my_function() 设置变量 data 为 0,并等待 tx_complete_semaphore,那么当 tx_complete_semaphore 被 isr_callback() 释放时,变量 data 是否会在 my_function() 中更新为 1?或者是否必须将变量数据限定为 volatile 才能在 my_function() 中正确更新?

static int data;
static rtems_id tx_complete_semaphore;
void isr_callback(void)
{
  data = 1;
  /* interrupts as disabled here */
  rtems_semaphore_release(tx_complete_semaphore);
}
  
void my_function(void)
{
  data = 0;
  /* data will be 0 here */
  printf("data is %i", data)
  /* Interrupts are enabled here */
  rtems_semaphore_obtain(tx_complete_semaphore,
                         RTEMS_WAIT,
                         RTEMS_NO_TIMEOUT);
  /* what is the value of data here? */
  printf("data is %i", data);
}
4

2 回答 2

0

不,这里不需要限定符“volatile”,因为 RTEMS 信号量同步确保变量数据在 my_function() 中正确更新。

我检查了两种情况下生成的汇编程序代码,一种是数据易失性,另一种是数据不是易失性。在这两种情况下,数据都是在获得信号量之后加载的,但只有在第一种情况下,数据是在获得信号量之前加载的。

于 2021-04-22T09:30:35.007 回答
0

您应该符合条件,data因为volatile对于编译器而言,无法推断出数据在my_function.

volatile您一起确保编译器不依赖先前已知的值0,因为它可以在函数之外随时更改。

于 2021-04-22T08:37:28.067 回答