我正在使用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是无堆栈的。
答案 0 :(得分:3)
Contiki使用所谓的 protothreads (Contiki特定术语),以支持此操作系统中的多个应用程序级进程。 Protothread只是计算机科学中被称为coroutine的编程抽象的一个奇特名称。
"产率"在这种情况下,"收益率执行" (即放弃执行)。它意味着让其他的protothreads执行,直到出现一个发送到当前原始线程的事件为止。这些事件可以由其他protothreads和中断处理程序函数生成。 "等待"宏类似,但允许产生并等待特定的事件或条件。
Contiki protothreads是无堆叠的,因为它们都共享相同的全局执行堆栈,而不是"真正的"通常获得自己的堆栈空间的线程。因此,Contiki protothreads中不会保留值局部变量。例如,执行此操作是未定义的行为:
static int i = 1;
PROCESS_YIELD();
printf("i=%d\n", i);
传统的Contiki方式如何处理这种限制是将所有protothread-local变量声明为static:
{{1}}
其他选择当然是使用全局变量,但是有很多全局变量是糟糕的编程风格。在protothread函数中声明的静态变量的好处是它们对其他函数(包括其他protothreads)是隐藏的,即使它们在低级别它们被分配在全局静态存储区域中。
答案 1 :(得分:1)
在一般案例中," Yield"在任何OS中都意味着同步调用调度程序(即按需而不是通过中断),以便将控制的机会提供给其他线程。在 RTOS 中,这样的特征只会影响相同优先级的线程,并且可以另外使用或代替先发制人的循环调度。大多数RTOS没有明确的yield函数,或者在某些情况下(例如VxWorks),使用零长度延迟可以实现相同的效果。
在Contiki中的协作调度程序中,需要这样的函数来允许其他线程在其他非阻塞线程中运行。一个线程总是有控制权,直到它调用一个bocking或yielding函数。
Contiki调度程序的协作性质意味着它不能归类为RTOS。有可能实现适合特定应用程序的实时行为,但只能通过仔细和适当的应用程序设计,而不是通过内在的调度程序行为。