Contiki rtos中的“产量”是什么意思

Mlo*_*der 2 rtos process contiki contiki-process

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

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.
Run Code Online (Sandbox Code Playgroud)

产生一个进程是否意味着在 contiki 中执行一个进程。contiki 是无堆栈的又是什么意思。

kfx*_*kfx 5

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

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

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

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

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

 static int i = 1;
 PROCESS_YIELD();
 printf("i=%d\n", i);
Run Code Online (Sandbox Code Playgroud)

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