类似于系统调用的工作方式int 0x80,是否可以在内核中实现自己的ISR,以便在softirq上假设int 0x120或与任何其他softirq程序计数器一起从用户空间跳转到内核空间?
正在进入特权模式内核只与有关int 0x80,或与任何软中断实现我可以自动或禁用保护模式并进入我们必须通过编写其相关的标志做手工特权模式进入特权模式?
还有一两件事,如果能够实现这种类型的ISR的,是数据交换的最佳方法是使用寄存器EBX,ECX,EDX,ESI,EDI和EBP或任何其他方式仍然存在?
我已经看过如何在linux内核中定义和触发我自己的新softirq?但没有得到我想要的解决方案.
我会更明确一些,为什么我需要这个
我实现了很少的内核函数,它们直接与硬件外设交谈,我希望它们使用软件中断从用户空间触发.不能使用具有可用驱动程序体系结构的系统调用,因为我需要减少执行时间.
我在Android应用程序上使用Paho java客户端库.代码如下.
MqttAndroidClient client_Panic = new MqttAndroidClient(this.getApplicationContext(), serverURL, CLIENT_ID);
try {
MqttConnectOptions options = new MqttConnectOptions();
options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
options.setCleanSession(false);
options.setKeepAliveInterval(90);
options.setConnectionTimeout(100);
IMqttToken token = client_Panic.connect(options);
//Few callbacks
} catch (MqttException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
并在需要时发布消息
String msg = "messages";
MqttMessage message = new MqttMessage();
message.setPayload(msg.getBytes());
try {
client_Panic.publish(topic, message);
} catch (MqttException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但不知何故不完整.我需要的是,每当其他客户订阅同一主题时,应该获得最后保留的消息,哪个发布者可能早先发布过.
为此我搜索了他们的文档,我得到了
protected void setWill(String topic,
MqttMessage msg,
int qos,
boolean retained)
Run Code Online (Sandbox Code Playgroud)
因此,setWill根据文档可以选择启用保留选项.所以我尝试了
options.setConnectionTimeout(100);
options.setWill(topic,null,2,true); // This place I added
IMqttToken token = client_Panic.connect(options);
Run Code Online (Sandbox Code Playgroud)
但是 …
我在 EC2 上的 Ubuntu 上运行 mosquitto 代理。我也做了一个改变max_queued_messages 1000,max_inflight_messages 10在/etc/mosquitto/mosquitto.conf
我使用qos=2发布到这个代理并保留 enabled。对于发布,我使用mosquitto_pub -t 1 -m "{c:{d:\"pN\",m:\"Pr1\"}}" -r -q 2. 订阅者方面我正在使用 org.eclipse.paho.android.service:1.0.2具有相同 qos=2 的库。
并且仅通过options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1)for 参数提供单个选项client.connect(options)。
如果连接到服务器的订阅者设备由于任何原因断开连接并再次重新连接,那么问题就来了,然后只获得最后一条保留的消息,而缺少消息之间的所有内容。
而且,即使尚未发布任何内容,重新连接后仍会获取订阅者设备在断开连接之前可能已经获得的最后保留消息。
我希望在重新连接订阅者后应该获得在断开连接期间发布的所有消息,如果已经获得,则不应再次显示。想知道如何以及在哪里做。
android ×2
mqtt ×2
paho ×2
c ×1
iot ×1
java ×1
linux-kernel ×1
mosquitto ×1
softirq ×1
system-calls ×1