当前位置: 首页 > 工具软件 > Contiki > 使用案例 >

contiki学习笔记(七)contiki系统

宰父熙云
2023-12-01

八、contiki进程

contiki编程的核心文档

contiki的一个进程由一个单一的原线程组成。

Files
file	process.c

contiki进程内核的实现。

file	process.h
 	
contiki进程接口的头文件。
Return values
#define	PROCESS_ERR_OK   0
 	返回值,指示操作成功。	
#define	PROCESS_ERR_FULL   1
 	返回值,指示事件队列已满。 	
 

//Process protothread functions
#define	PROCESS_BEGIN()
 	Define the beginning of a process. 
 	定义流程的开始。
#define	PROCESS_END()
 	Define the end of a process. 
 	定义流程的结束。
 	contiki的程序必须介于BEGIN和END之间
#define	PROCESS_WAIT_EVENT()
 	Wait for an event to be posted to the process. 
 	等待一个事件发布的过程。
#define	PROCESS_WAIT_EVENT_UNTIL(c)
 	Wait for an event to be posted to the process, with an extra condition. 
 	等待一个事件被发布到进程,并附加一个额外的条件。
#define	PROCESS_YIELD()
 	Yield the currently running process. 
 	生成当前正在运行的进程。
#define	PROCESS_YIELD_UNTIL(c)
 	Yield the currently running process until a condition occurs. 
 	在出现条件之前,生成当前正在运行的进程
#define	PROCESS_WAIT_UNTIL(c)
 	Wait for a condition to occur. 
 	等待条件发生
#define	PROCESS_WAIT_WHILE(c) PT_WAIT_WHILE(process_pt, c)
	重定义
#define	PROCESS_EXIT()
 	Exit the currently running process. 
#define	PROCESS_PT_SPAWN(pt, thread)
 	Spawn(产生) a protothread(原始线程) from the process. 
#define	PROCESS_PAUSE()
 	Yield the process for a short while. 
 	让这个过程持续一段时间。


Poll and exit handlers
#define	PROCESS_POLLHANDLER(handler)
 	Specify an action when a process is polled. 
 	指定进程轮询时的操作。
#define	PROCESS_EXITHANDLER(handler)
 	Specify an action when a process exits. 
 	在进程退出时指定操作。



Process declaration and definition
#define	PROCESS_THREAD(name, ev, data)
 	Define the body of a process. 
#define	PROCESS_NAME(name)
 	Declare the name of a process. 
#define	PROCESS(name, strname)
 	Declare a process. 



Functions called from application programs
CCIF struct process *	process_current

process_event_t	process_alloc_event (void)
 	Allocate a global event number. 
 	分配全局事件号
void	process_start (struct process *p, const char *arg)
 	Start a process. 
void	process_exit (struct process *p)
 	Cause a process to exit. 
int	process_post (struct process *p, process_event_t ev, void *data)
 	Post an asynchronous event. 
 	发布异步事件
void	process_post_synch (struct process *p, process_event_t ev, void *data)
 	Post a synchronous event to a process. 
 	将同步事件发布到进程
#define	PROCESS_CURRENT()
 	Get a pointer to the currently running process. 
 	获取当前正在运行的进程的指针。
#define	PROCESS_CONTEXT_BEGIN(p)
 	Switch context to another process. 
 	将上下文切换到另一个进程。
#define	PROCESS_CONTEXT_END(p) process_current = tmp_current; }
 	End a context switch. 
 	结束上下文切换

    
    
Functions called from device drivers
void	process_poll (struct process *p)
 	Request a process to be polled. 
 	请求要被轮询的进程。

    
    
Functions called by the system and boot-up code
void	process_init (void)
 	Initialize the process module. 
int	process_run (void)
 	Run the system once - call poll handlers and process one event. 
 	运行系统一次调用轮询处理程序并处理一个事件。
int	process_nevents (void)
 	Number of events waiting to be processed. 
 	等待处理的事件数量。
int	process_is_running (struct process *p)
 	Check if a process is running. 
Detailed Description
A process in Contiki consists of a single protothread.

Define Documentation

#define PROCESS	(	 	name,
 	strname
)	
声明一个进程

这个宏声明了一个进程。进程有两个名称:进程结构的变量(C程序使用)和人类可读的字符串名称(调试时使用)。配置选项允许删除可读名称以保存RAM。

Parameters:
name 进程结构的变量名。
strname 进程名称的字符串表示形式。

#define PROCESS_BEGIN()
定义流程的开始。

这个宏定义了进程的开始,并且必须始终出现在PROCESS_THREAD()定义中。PROCESS_END()宏必须在流程结束时出现。

#define PROCESS_CONTEXT_BEGIN	(	 	p	)	

Value:

{\
struct process *tmp_current = PROCESS_CURRENT();\
process_current = p

.将上下文切换到另一个进程

This function switch context to the specified process and executes the code as if run by that process. Typical use of this function is to switch context in services, called by other processes. Each PROCESS_CONTEXT_BEGIN() must be followed by the PROCESS_CONTEXT_END() macro to end the context switch.

此函数将上下文切换到指定的进程,并执行代码,就像由该进程运行一样。此函数的典型用途是切换其他进程调用的服务中的上下文。各进程上下文_BEGIN()必须后面跟着Process_Context_End()宏以结束上下文切换。

Example:

PROCESS_CONTEXT_BEGIN(&test_process);
 etimer_set(&timer, CLOCK_SECOND);
 PROCESS_CONTEXT_END(&test_process);

Parameters:
p 要用作上下文的进程

#define PROCESS_CONTEXT_END	(	 	p	)	process_current = tmp_current; }
	End a context switch.
	此函数结束上下文切换并更改回前一个进程。

Parameters:
p 要用作上下文的进程

#define PROCESS_CURRENT	(		)	
获取当前正在运行的进程的指针。

.通常,此宏用于将事件发送到当前进程

#define PROCESS_END	(		)	
定义流程的结束。

这个宏定义了一个过程的结束。它必须出现在PROCESS_THREAD()定义中,并且必须始终包含它。当到达PROCESS_END()宏时,进程退出。

#define PROCESS_ERR_FULL 1

返回值,指示事件队列已满。
此值从process_post()返回,以指示事件队列已满,无法发布事件。

#define PROCESS_ERR_OK 0

返回值,指示操作成功。

#define PROCESS_EXITHANDLER	(	 	handler	)	

指定进程退出时的操作。

Note:
此声明必须紧接在PROCESS_BEGIN()宏之前。

Parameters:
handler 要执行的动作。

#define PROCESS_NAME	(	 	name	)	

声明进程的名称。

此宏通常用于头文件中声明在C文件中实现的进程的名称。

#define PROCESS_PAUSE	(		)	

让这个过程持续一段时间。

该宏将在短时间内生成当前运行的进程,从而让其他进程在进程继续之前运行。

#define PROCESS_POLLHANDLER	(	 	handler	)	

在轮询流程时指定一个操作。

Note:
指定一个acThis声明必须紧跟在PROCESS_BEGIN()宏之前。当一个进程被轮询时。

此声明必须在PROCESS_BEGIN之前声明

Parameters:
handler The action to be performed.

#define PROCESS_PT_SPAWN	(	 	pt,
 	thread
)		

从进程中衍生一个原型线程。

Parameters:
pt 新原生线程的原生线程状态(struct pt)
thread 对protothread函数的调用。

#define PROCESS_THREAD	(	 	name,
 	ev,
 	data
)		

定义进程的主体

每当系统中发生事件时,都会调用该流程,流程总是以PROCESS_BEGIN()宏开始,以PROCESS_END()宏结束。

#define PROCESS_WAIT_EVENT	(		)	

Wait for an event to be posted to the process. //等待事件发生

此宏将阻塞当前正在运行的进程,直到该进程接收到一个事件。

#define PROCESS_WAIT_EVENT_UNTIL	(	 	c	)	

等待一个事件被发布到进程,并附加一个额外的条件。
这个宏类似于PROCESS_WAIT_EVENT(),因为它会阻塞当前正在运行的进程,直到该进程接收到一个事件。但是PROCESS_WAIT_EVENT_UNTIL()接受一个额外的条件,该条件必须为true,以便进程继续。

Parameters:
c 该条件必须为真,流程才能继续。

#define PROCESS_WAIT_UNTIL	(	 	c	)	

等待条件发生。
这个宏不能保证过程产生收益,因此应该谨慎使用。在大多数情况下,应该使用PROCESS_WAIT_EVENT()、PROCESS_WAIT_EVENT_UNTIL()、PROCESS_YIELD()或PROCESS_YIELD_UNTIL()。

Parameters:
c 等待的条件

#define PROCESS_YIELD_UNTIL	(	 	c	)	

Yield the currently running process until a condition occurs.

生成当前正在运行的进程,直到出现条件。

这个宏不同于PROCESS_WAIT_UNTIL(),因为PROCESS_YIELD_UNTIL()保证至少产生一次。这确保了进程不会在无限循环中结束并独占CPU。

Parameters:
c 等待的条件

Function Documentation

CCIF process_event_t process_alloc_event	(	void		)	

Allocate a global event number.分配全局事件号

Allocate a global event number.分配全局事件号

Returns:
The allocated event number

在Contiki中,128以上的事件号是全局的,可以从一个进程发布到另一个进程。此函数分配一个这样的事件号。

Note:

目前无法释放已分配的事件号。

CCIF void process_exit	(	struct process *	p	)	

使进程退出

Parameters:
p 要退出的进程
此函数导致进程退出。进程可以是当前正在执行的进程,也可以是当前正在运行的另一个进程。

void process_init	(	void		)	

初始化进程模块

此函数初始化流程模块,应由系统启动代码调用。

CCIF int process_is_running	(	struct process *	p	)	

检查进程是否正在运行。

Parameters:
p 进程
Return values:
如果进程正在运行,则为非零。
如果进程没有运行,则为零。

int process_nevents	(	void		)	

Number of events waiting to be processed.等待处理的事件数量。

Returns:
当前等待处理的事件的数量。

CCIF void process_poll	(	struct process *	p	)	

请求对一个进程进行轮询。

此函数通常从中断处理程序调用,以轮询进程。

Parameters:
p 指向进程的进程结构的指针。

CCIF int process_post	(	struct process *	p,
process_event_t	ev,
void *	data 
)		

发布异步事件。

此函数向一个或多个进程发布异步事件。事件的处理被延迟到内核调度目标进程之后。事件可以广播给所有进程,在这种情况下,系统中的所有进程都将被调度来处理该事件。

Parameters:
ev 要发布的事件
data 与事件一起发送的辅助数据
p 事件应该发布到的进程,或者如果事件应该发布到所有进程,则为PROCESS_BROADCAST。
Return values:
process_err_ok 可以发布事件。
PROCESS_ERR_FULL,无法发布事件。

CCIF void process_post_synch	(	struct process *	p,
process_event_t	ev,
void *	data 
)		

向流程发布同步事件。

Parameters:
p 指向进程的进程结构的指针。
ev 要发布的事件
data 指向与事件一起发布的其他数据的指针。

int process_run	(	void		)	

运行系统一次调用轮询处理程序并处理一个事件。

这个函数应该从main()程序中反复调用,以实际运行Contiki系统。它调用必要的轮询处理程序,并处理一个事件。该函数返回事件队列中等待的事件数,以便调用者可以选择在没有挂起事件时将CPU置为休眠状态。

Returns:
当前在事件队列中等待的事件数。

CCIF void process_start	(	struct process *	p,
const char *	arg 
)	

开始一个进程

Parameters:
p 指向进程结构的指针。
arg 可以传递到新进程的参数指针。

 类似资料: