process - 'Yield'在Contiki rtos中意味着什么

标签 process rtos 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.

产生进程是否意味着在 Contiki 中执行进程。另外,Contiki 是无堆栈的意味着什么。

最佳答案

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

在此上下文中,“Yield”是“yieldexecution”的缩写(即放弃执行)。它的意思是“让其他原型(prototype)线程执行,直到出现针对当前原型(prototype)线程的事件”。此类事件可以由其他原型(prototype)线程和中断处理函数生成。 “wait”宏类似,但允许产生并等待特定事件或条件。

Contiki 原型(prototype)线程是无堆栈的,因为它们都共享相同的全局执行堆栈,这与通常拥有自己的堆栈空间的“真实”线程相反。因此,局部变量的值不会跨 yield 保留在 Contiki 原型(prototype)线程中。例如,这样做是未定义的行为:

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

处理此限制的传统 Contiki 方法是将所有 protothread 局部变量声明为静态:

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

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

关于process - 'Yield'在Contiki rtos中意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614258/

相关文章:

c++ - 操作系统任务调度模拟器

operating-system - 当没有用户代码运行时,CPU 中会发生什么?

c - 'FILE' 在 Contiki 中是未知类型

c - 将struct的成员声明为c中的指针并使用它

windows - Windows 服务和 Windows 进程之间有什么区别?

c++ - 写入映射文件

c - 如何在 RTOS 中查找任务中的内存泄漏?

Contiki:使用 Rime 打印接收到的数据

c - 为什么子进程会执行一些意外的行?

python - 线程和进程之间的范围问题?