锁定(原子)寄存器读/写
我正在使用GPIO的直接控制进行编码,为此有一些不错的资源,例如http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking;该过程涉及open(“ / dev / mem”),然后mmap操作有效地将所需的物理地址映射到您的虚拟地址空间中。然后,阅读本http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf的第6节,以了解有关如何控制I / O的信息。 要更改引脚的功能(输入或输出,或各种特殊功能),请修改GPFSELx I / O寄存器中的这3位字段(000 =输入,001 =输出对象实例)。这些修改操作被编译为具有普通加载和存储的操作(例如,将GPIO0更改为输入:*(regptr)&=〜7;编译为类似 ldr r2, [r3, #0] ; r = *ptr (load r2 from I/O register) bic r2, r2, #7 ; r2 &= ~7 str r2, [r3, #0] ; *ptr = r2 (store r2 to I/O register) 问题是这样的:如果在加载和存储之间发生中断,并且另一个进程或ISR修改了相同的I / O寄存器,则存储操作(基于读入r2的陈旧)将还原该其他操作的效果。因此,更改这些I …