使用 RTEMS 信号量同步时,信号处理程序更新的变量是否已优化?

Are variables updated by signal handlers optimized out when using RTEMS semaphore synchronization?

假设函数 isr_callback() 在硬件中断时被调用。如果my_function()将变量数据设置为0,等待tx_complete_semaphore,当tx_complete_semaphore被[释放时,my_function()中变量数据会更新为1吗=13=]()?或者变量数据是否必须限定为易失性才能在 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);
}

您应该将 data 限定为 volatile,因为对于编译器而言,数据在 my_function.

过程中发生更改是不可推断的

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

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

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