如何执行一小段C原子代码

如何执行一小段C原子代码,c,process,atomic,C,Process,Atomic,我有一段C代码: // ... many stuff here ... if ( ((*(ptr + 0xffce)) & 3) ) { *(ptr + 0xffce) |= 3; *(ptr + 0xd415) = 1 << var; } // ... many stuff here ... /。。。这里有很多东西。。。 如果((*(ptr+0xffce))&3)){ *(ptr+0xffce)|=3; *(ptr+0xd415)=1一般来说,对硬件的

我有一段C代码:

// ... many stuff here ...
if ( ((*(ptr + 0xffce)) & 3) ) {
     *(ptr + 0xffce) |= 3;
     *(ptr + 0xd415) = 1 << var;
}
// ... many stuff here ...
/。。。这里有很多东西。。。
如果((*(ptr+0xffce))&3)){
*(ptr+0xffce)|=3;

*(ptr+0xd415)=1一般来说,对硬件的写入应该放在内核模块中。如果平台受到MMU或其他内存管理的保护,则显示的代码(写入硬件地址)将无法在用户空间中工作。理论上,用户地址空间实际上与内核地址空间不同

当处于内核模式时,解决方案很可能会自行呈现。内核中有许多计时/保护机制:抢占禁用、自旋锁、原子内、中断、高优先级内核计时器等等


一般来说,通过在给定平台上禁用所有中断,您可以实现您想要做的事情。这通常需要一个RTOS或内核代码。(禁用所有中断也会阻止调度程序运行。)但是,在大多数平台上,这是不受欢迎的。(有充分的理由。)因此,您必须按照平台指南执行此操作。“抢占禁用”这是一个很好的例子,说明了如何在不禁用所有其他功能的情况下禁用调度程序。

使用互斥锁?这样用户空间代码就看不到处于不一致状态的内存。@KerrekSB它不会阻止重新调度,好吧。@EugeneSh:不,不会,但从用户空间这就是你所能要求的。调度程序甚至不是你想要的东西可以从用户空间证明。@KerrekSB据我所知,OP试图访问一些定时非常关键的硬件外围寄存器。因此,基本上你可以证明调度程序的存在,比如说,允许访问一些可以采样的硬件时钟。atomic更关心的是正确性而不是定时。请解释你想要哪一个。如果你想要那么这是一个x-y问题,原子不是你所需要的。