使用 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() 中正确更新。
我检查了两种情况下生成的汇编程序代码,一种是数据易失性,一种是数据非易失性。在这两种情况下,数据都是在获取信号量后加载的,但只有第一种情况是在获取信号量之前加载数据。
假设函数 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() 中正确更新。
我检查了两种情况下生成的汇编程序代码,一种是数据易失性,一种是数据非易失性。在这两种情况下,数据都是在获取信号量后加载的,但只有第一种情况是在获取信号量之前加载数据。