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

时间:2020-09-28 14:46:01

标签: kotlin raspberry-pi kotlin-native pigpio

我尝试将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()
}

如何防止此错误?

亲切的问候 罗杰

2 个答案:

答案 0 :(得分:1)

经过一番尝试,我找到了解决方案,但不知道这是否是最佳解决方案。

作为AtomicInt的全局变量无效,但这种方式有效:

@SharedImmutable
val sharedData = SharedData()

class SharedData {
    var lastChange = AtomicInt(0)
}

通过这种方式,我可以通过val lastChange = sharedData.lastChange.valuesharedData.lastChange.compareAndSet(lastChange, tick.toInt())来访问量值

答案 1 :(得分:0)

罗杰!
我想这个问题与Kotlin / Native immutability rules有关。我发现这个issue可以说服我以为未在主线程上调用回调。如果是这样,则错误是由违反mutable XOR shared K / N规则引起的。目前无法编写摘要,但是我认为您可以尝试使用AtomicInt,或者在需要时使用@ThreadLocal注释。