setjmp构建简单协作式多任务系统
2008-02-23 05:27:59来源:互联网 阅读 ()
引言
本文介绍的是利用标准C语言setjmp库函数实现的具备此特点的协作式多任务系统。从本质上讲,实时多任务操作系统应该具备按照优先级抢占调度的内核。然而,在实际应用中,抢中式的多任务某种程式上带来了用户程式设计时数据保护的困难,并且,具备抢占功能的多任务内核设计时困难也比较多,这会增加操作系统自身的代码,也使他在小资源单片机系统中应用较少;而协作多任务系统的调度只在用户指定的时机发生,这会大大简化内核和用户系统的设计,尤其本文实现的系统通过条件查询来放弃CPU,既符合传统单片机程式设计的思维,又带来了多任务、模块化、可重入的编程便利。
Setjmp是标准C语言库函数的组成部分,他能够实现程式执行中的远程转操作。具体来说,他能够在一个函数中使用setjmp来初始化一个全局标号,然后只要该函数未曾返回,那么在其他任何地方都能够通过longjmp调用来跳转到setjmp的下一条语句执行。实际上,setjmp函数将发生调用处的局部环境保存在一个jmp_buf的结构当中,只要主调函数中对应的内存未曾释放(函数返回时局部内存就失效了),那么在调用longjmp的时候就能够根据已保存的jmp_buf参数恢复到setjmp的地方执行。我们的系统中就是分析了setjmp标准库函数的特点,以简单的方式实现了协作式多任务。
1 演示程式
为了便于理解,首先给出多任务演示程式的源代码。这个程式演示了协作式多任务转换、任务的动态生成、多任务共用代码等功能,一共使用了init_coos初始化根任务(也就是C语言main函数)、creat_task创建新任务和WAITFOR查询条件这3个基本的系统调用。由于面向嵌入式系统,因而程式不会中止并且运行中也没有进行任何输出,需要借助适合的调试工具来理解多任务系统的运行。
example.c文档清单:
#include<stdlib.h>
#include“co-os.h”
void tskfunc1(int argc,void *argv);
void tskfunc2(int argc,void *argv);
void subfunc(void);
volatile int cnt,test;
int main(void){
int i;
init_coos(400);
creat_tsk(tskfunc1,12,NULL,400);
creat_tsk(tskfunc2,0,NULL,400);
i=0;
while(1){
WAITFOR(cnt= =8);
while(i <cnt)test=i;
cnt ;
}
}
void tskfunc1(int argc,void *argv){
int i;
static int creat=0;
if(!creat){
creat_tsk(tskfunc1,9,NULL,400);
creat=1;
}
i=0;
while(1){
WAITFOR(cnt>argc);
test=0x55;
/*使用函数调用在子程式中测试WAITFOR*/
subfunc();
while(i <cnt)test=i^0xAA;
}
}
void tskfunc2(int argc,void *argv){
while(1){
WAITFOR( cnt>15);
cnt=0;
}
}
void subfunc(void){
int i;
WAITFOR(cnt<5);
for(i=0;i< )test=0x10*i;
}
2 内核构成
内核包括一个供外部用户程式包含的头文档(co-os.h)和具体实现的源文档(co-os.c),他们提供了演示程式中用到的3个系统调用。
内核的实现代码假定了CPU堆栈是向下增长的,并且通过宏来直接操作堆栈指针。以下代码在Microsoft VC6 for x86、Borland C Builder 5.5、SDS CrossCode7.0 for 68K和GCC3.2 for AVR四种平台中测试过,只需在co-os.h头文档中定义相应的平台类型即可顺利编译。
(1)co-os.h文档清单
#include<setjmp.h>
/*选择X86_VC6,X86_BC5,AVR_GCC或M68H_SDS.*/
#define X86_VC6
#define MAX_TSK 10
typedef struct {
void (*entry)(int argc,void *argv);
jmp_buf env;
int argc;
void *argv;
}TVB;
extern TCB tcb[MAX_TSK];
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: PID控制C源程式
下一篇: 使用C 构建嵌入式研发框架
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash