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

问题描述

我尝试将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.valuesharedData.lastChange.compareAndSet(lastChange,tick.toInt())来访问量值

,

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...