- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因为 Contiki 提供的内置列表不符合我的需求(使用太多内存),我实现了自己的列表版本,该版本已针对我打算如何使用它进行了优化。
在任何时候,这些列表中都会有一个由多个进程/原线程对其进行操作(即添加/删除元素)。但是,添加/删除不会发生在进程/原型(prototype)线程 block 内,而是在一个函数内调用,该函数是通过进程/原型(prototype)线程发起的一系列函数调用来调用的。
例如,
void funct2()
{
// add or remove element from shared list
}
void func1()
{
// some stuff
func2();
// more stuff
}
PROCESS_THREAD(temp1, ev, data)
{
PROCESS_BEGIN();
func1();
PROCESS_END();
}
PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
func1();
PROCESS_END();
}
因此,我无法使用 Contiki 的内置机制来创建互斥体(通过使用 pt-sem.h),因为它必须出现在进程/原型(prototype)线程 block 中。这是因为虽然我可以在实际进程 block 中创建锁(见下文),但这将导致阻塞进程的时间远远超过所需的时间
PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
// get lock
func1();
// release lock
PROCESS_END();
}
这是一个非常有问题的问题,因为从列表中添加和删除元素不是原子的;如果在删除或添加元素到列表时发生中断,事情将无法正常运行。是否可以轻松地做我想做的事?即在函数调用中原子地添加和删除列表中的元素,而不是在进程/原型(prototype)线程 block 中?
最佳答案
您似乎对原型(prototype)线程的作用感到困惑。原始线程方法是一种协作调度形式。当执行流要求让出时,原型(prototype)线程只能在特定点让出。中断永远不能将执行流程切换到另一个原型(prototype)线程。
因此,有两个不同的选择:
1) 如果您的列表同时从原线程和中断处理程序上下文访问,您需要在禁用中断的情况下对列表进行所有修改。因此,您的锁定/解锁代码分别是禁用/启用中断。
2) 如果您的列表仅从原始线程访问,则不需要任何锁定。这是推荐的设计。
事实上,使用原型(prototype)线程的主要优点是在 99% 的情况下不需要锁。
关于c - 函数内的互斥 Contiki,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50559566/
Contiki 调度程序是抢占式的吗? Tinyos 不是;有 nanork,我不确定它的发展处于什么状态。 最佳答案 Contiki 支持抢占式线程。引用: https://github.com/c
我想使用 Contiki OS 中的广播函数来广播整数数组。然而,当给出整数数组作为输入时, packetbuf_copyfrom() 函数似乎对我不起作用。当通过 Cooja 的“ radio 消息
我正在使用 Contiki 操作系统编写程序。 我有 remote_firmware.c 文件和一个名为 parser 的文件夹,其中包含文件 parser.h 和 parser.c 我在其中编写了方
我正在尝试在 Contiki 中为 Zolertia REmote 编写一个程序,它将从传感器读取一个值,并且根据这个值以及 Remote 上的用户按钮是否被长时间按下,LED 将被打开打开、变暗或将
我试图理解 examples/cc26xx/cc26xx-ble-client-demo 中存在的 IPv6-over-BLE UDP-client 演示示例,该代码具有以下头文件: #include
嗨,我尝试将 cooja simluator 中的 mqtt mote 连接到桌面上的 mosquitto 服务器。但它一直无法连接,我能够 ping rpl 路由器,但不能 ping 我的 mqtt
我有以下问题,我的模拟结果卡在 while 循环中。在我看来,原因是我们无法在循环结束之前在mote 1.0上执行recv_uc。然而,是 mote 1.0 本身调用 unicast_send(&
我想将模拟的时间戳值作为 int 发送。更清楚地说,如果节点输出是: 00:39.841 ID:6 unicast message ready to be sent 我希望能够在消息中输入值
因为 Contiki 提供的内置列表不符合我的需求(使用太多内存),我实现了自己的列表版本,该版本已针对我打算如何使用它进行了优化。 在任何时候,这些列表中都会有一个由多个进程/原线程对其进行操作(即
在我的一个 Contiki 应用程序中,我从进程 (P) 调用某个函数 (f)。当驻留在 (f) 中的循环中至少有一个 'printf' 时,(P) 中的 'printf' 会正确显示结果。然而,当同
在我的代码中,我需要声明两个进程。在第一个过程中,我想这样调用第二个: PROCESS_THREAD(Initialization_process, ev, data) { PROCESS_
我正在开发一个需要 msp430 数学函数的应用程序。使用 powf、sqrt 等函数时,会发生内存溢出 (ROM)。一个这样的例子是,当我使用这个 float i 变量而不使用静态时,我的代码可以工
是否有可能在 contiki os 中列出所有正在运行的进程并在调试输出(即 UART)上输出结果? 最佳答案 在 contiki platform.c 和 main() 中插入: struct pr
我正在使用无线传感器网络负责人评估其在我的工作中的性能。我想测量延迟和总能耗以找到每个节点中的剩余能量。所以我的问题是我有一些 tx rx cpu cpu_idle 的值,我不知道如何使用它们来计算我
我正在 Contiki 作为我的学术工作,现在我有一个问题,我应该从 Contiki 中的示例文件夹中具体引用哪个文件来模拟场景,例如 - 具有 ipv6 节点的 30 个节点物联网,所有这些节点都将
我刚刚开始研究Contiki-OS。我对 Contiki - Antelope 感兴趣。我尝试使用 AQL(Antelope 查询语言)在串行 Cooja 模拟中创建关系、属性和插入元组。像这样: c
在不更改任何其他文件的情况下,我尝试运行 ccm-star-tests在 cooja 模拟器中的 z1 微粒上。 对于encryption节点输出为: Testing verification ...
我想将全局地址转换为链接级地址(或者即使可以进行相反的操作),我在 uip6.c 文件中有以下函数。我想将 rep (其中 rep 为我提供带有 fe80 之类的前缀的 lladdress)转换为 s
如何在recv_uc 函数中打印接收到的数据?在这种情况下是 var 的值。我使用 packetbuf_copyfrom(&var, 5) 将 var 放入发送的数据包中。 PROCESS(sendi
我想为 Contiki OS 添加一个第三方库。确切地说,我正在尝试添加 nettle 3.0 密码学库。 我是否应该使用 contiki 平台的特殊标志来构建相关库,不确定具体是什么?海合会 msp
我是一名优秀的程序员,十分优秀!