Kotlin/Native pigpio库sigHandler:未处理的信号11,正在终止



我尝试将pigpio库与Kotlin/Native一起使用。首先,我关注了以下演讲:桥接物理世界:Kotlin Native on Raspberry Pi

当我试图将从回调中获得的值分配给第54行上的全局变量lastChange = tick时,就会出现sigHandler: Unhandled signal 11, terminating

我测试的整个代码如下:

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.valuesharedData.lastChange.compareAndSet(lastChange, tick.toInt())访问valua

我想这个问题与Kotlin/Native不变性规则有关。我发现的这个问题让我相信回调不是在主线程上调用的。如果这是真的,则错误是由违反mutable XOR sharedK/N规则引起的。目前无法编写代码段,但我认为您可以尝试使用AtomicInt,或者,如果它适合这里的需要,可以使用@ThreadLocal注释。

最新更新