2

我正在使用 contiki 并试图理解其中使用的术语。我在互联网上到处观察某些词,例如产量,无堆栈。一些例子

PROCESS_EVENT_CONTINUE : This event is sent by the kernel to a process that is waiting in a PROCESS_YIELD() statement.
PROCESS_YIELD(); // Wait for any event, equivalent to PROCESS_WAIT_EVENT().
PROCESS_WAIT_UNTIL(); // Wait for a given condition; may not yield the process.

产生一个过程是否意味着在 Contiki 中执行一个过程。另外,contiki 是无堆栈的是什么意思。

4

2 回答 2

5

Contiki 使用所谓的protothreads(Contiki 特有的术语)来支持该操作系统中的多个应用程序级进程。Protothread 只是计算机科学中称为协程的编程抽象的一个花哨名称。

“yield”在这种情况下是“yield execution”的缩写(即放弃执行)。它的意思是“让其他 protothreads 执行,直到出现针对当前 protothread 的事件”。此类事件既可以由其他原型线程生成,也可以由中断处理函数生成。“等待”宏类似,但允许让步并等待特定事件或条件。

Contiki protothreads 在某种意义上是无堆栈的,因为它们都共享相同的全局执行堆栈,而不是“真正的”线程通常获得自己的堆栈空间。因此,局部变量的值不会跨产量保留在 Contiki protothreads 中。例如,这样做是未定义的行为:

 int i = 1;
 PROCESS_YIELD();
 printf("i=%d\n", i); // <- prints garbage

传统的 Contiki 处理这个限制的方法是将所有 protothread-local 变量声明为静态的:

 static int i = 1;
 PROCESS_YIELD();
 printf("i=%d\n", i);

当然,其他选项是使用全局变量,但是拥有大量全局变量是不好的编程风格。在 protothread 函数中声明的静态变量的好处是它们对其他函数(包括其他 protothreads)是隐藏的,即使在低级别它们被分配在全局静态内存区域中。

于 2016-01-05T15:13:21.153 回答
1

一般情况下,在任何操作系统中“让步”意味着同步调用调度程序(即按需而不是通过中断),以便将控制机会提供给其他线程。在RTOS中,这样的功能只会影响具有相同优先级的线程,并且可以附加使用或代替需要抢占式循环调度。大多数 RTOS 没有明确的屈服函数,或者在某些情况下(例如 VxWorks)可以使用零长度延迟来实现相同的效果。

在诸如 Contiki 中的协作调度器中,这样的函数对于允许其他线程在其他非阻塞线程中运行是必要的。在调用阻塞或让步函数之前,线程始终具有控制权。

Contiki 调度程序的协作性质意味着它不能被归类为 RTOS。有可能实现适合特定应用程序的实时行为,但只能通过仔细和适当的应用程序设计,而不是通过内在的调度程序行为。

于 2016-01-09T17:38:41.283 回答