Contiki进程间调用报错invalid storage class,求正确实现方法
在Contiki中正确调用另一个进程的方法
你遇到的错误是因为不能直接像调用普通函数那样调用PROCESS_THREAD宏定义的进程函数——PROCESS_THREAD是Contiki用来生成进程线程逻辑的特殊宏,它会展开成带有特定存储类的函数,直接调用会触发编译错误。
下面是两种正确的实现方式:
1. 使用process_start()启动另一个进程
这是最常用的方式,用来启动一个新的进程实例(如果进程还未运行)。
首先确保目标进程已经用PROCESS()宏正确声明:
// 声明并定义广播进程 PROCESS(example_broadcast_process, "Broadcast Process"); PROCESS_THREAD(example_broadcast_process, ev, data) { PROCESS_BEGIN(); // 这里写你的广播进程逻辑 while(1) { // 等待事件或执行任务 PROCESS_WAIT_EVENT(); } PROCESS_END(); }
然后在初始化进程中调用process_start()启动它:
PROCESS(Initialization_process, "Initialization Process"); PROCESS_THREAD(Initialization_process, ev, data) { PROCESS_BEGIN(); // 正确启动example_broadcast_process process_start(&example_broadcast_process, NULL); PROCESS_END(); }
2. 使用process_post()给已运行的进程发送事件
如果目标进程已经在运行,你可以通过发送事件的方式触发它执行特定逻辑:
PROCESS_THREAD(Initialization_process, ev, data) { PROCESS_BEGIN(); // 给example_broadcast_process发送一个内置或自定义事件 process_post(&example_broadcast_process, PROCESS_EVENT_CONTINUE, NULL); PROCESS_END(); }
在example_broadcast_process中,你可以通过判断ev参数来处理这个事件:
PROCESS_THREAD(example_broadcast_process, ev, data) { PROCESS_BEGIN(); while(1) { PROCESS_WAIT_EVENT(); if(ev == PROCESS_EVENT_CONTINUE) { // 处理收到的事件逻辑 } } PROCESS_END(); }
关键注意点
- 所有进程必须先用
PROCESS()宏声明,Contiki的进程管理系统才能识别和调度它们。 - 永远不要直接调用
PROCESS_THREAD展开后的函数,它不是普通的可调用函数,而是Contiki进程调度器管理的线程入口。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

