问题描述
我尝试将Pigpio库与Kotlin / Native结合使用。首先,我按照以下说明进行操作: Bridge The Physical World: Kotlin Native on Raspberry Pi
发生sigHandler: Unhandled signal 11,terminating
时,当我尝试分配从回调获取的值到第54行的全局变量lastChange = tick
我测试的整个代码如下:
package ch.lichtwellenreiter.omrr
import kotlinx.cinterop.staticCFunction
import pigpio.*
const val GPIO_BUTTON = 6
var lastChange: UInt = 0u
fun main() {
initGPIO()
println()
setupButton()
println()
while (true) {}
}
private fun initGPIO() {
println("Init GPIO")
if (gpioInitialise() < 0) {
println("GPIO Error initialising")
return
}
}
private fun setupButton() {
println("Setup pin")
val buttonPort = GPIO_BUTTON.toUInt()
initPortWithMode(buttonPort,PI_INPUT)
println("Register callback for pin")
gpioSetAlertFunc(buttonPort,flankChangeDetected)
}
private fun initPortWithMode(port: UInt,mode: Int) {
if (gpioSetMode(port,mode.toUInt()) < 0) {
println("Could not set mode for GPIO$port")
return
}
}
val flankChangeDetected = staticCFunction<Int,Int,UInt,Unit> { gpio,level,tick ->
println("Callback called")
val ticker: UInt = tick
val pin: Int = gpio
val lvl: Int = level
println("Calculate time")
val time = ticker - lastChange
println("Set lastChange")
lastChange = tick
println("Is DCC signal?")
if ((time > 55u && time < 61u) || (time > 113u && time < 119u)) println(time)
println()
}
如何防止此错误?
亲切的问候 罗杰
解决方法
经过一番尝试,我找到了解决方案,但不知道这是否是最佳解决方案。
作为AtomicInt的全局变量无效,但这种方式有效:
@SharedImmutable
val sharedData = SharedData()
class SharedData {
var lastChange = AtomicInt(0)
}
通过这种方式,我可以通过val lastChange = sharedData.lastChange.value
和sharedData.lastChange.compareAndSet(lastChange,tick.toInt())
来访问量值
罗杰!
我想这个问题与Kotlin / Native immutability rules有关。我发现这个issue可以说服我以为未在主线程上调用回调。如果是这样,则错误是由违反mutable XOR shared
K / N规则引起的。目前无法编写摘要,但是我认为您可以尝试使用AtomicInt,或者在需要时使用@ThreadLocal
注释。