用单片机编写协作式系统的凝问?????
今天想了很久都想不明白,程序是怎么样用 setjump longjup 的 现向大学请教,。。。在此先谢过先。。用的是Keil-C 或IAR编译器看Help.hourdev_615207VIZ867.zip(文件大小:27K) (原文件名:OS.zip)
相关的资料:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4547063&bbs_page_no=1&bbs_id=1006
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4547063&bbs_page_no=1&bbs_id=1006
头文件:
#include <setjmp.h>
#define MAX_TSK 5 //Limit is <=5 MCU:89C52
typedef struct {
void (*entry)(int argc,void *argv);
jmp_buf env; // return value_buf..
int argc;
void *argv;
}TCB;//task control brock;
//----------------------------
extern TCB tcb;
extern int task_num,tskid;
//=================API interfance function=========================
void init_coos(int mainstk);
int creat_tsk(void(*entry)(int argc,void *argv),int argc,void *argv,int stksize);
//==================================================================
#define WAITFOR(condition) do{ \
setjmp(tcb.env);\
if(!(condition)){ \
tskid++; \
if(tskid>=task_num) tskid =0; \
longjmp(tcb.env,1); \
} \
}while(0)
//以上longjmp(tcb.env,1); 返回那个setjmp点? 回复【楼主位】studyplacefor
-----------------------------------------------------------------------
-----------------------------------------------------------------------
实现文件:
#include <reg52.h>
#include "o_os.h"
#define SAVE_SP(p) p=(int*)SP
#define RESTORE_SP(p) SP=(int)p
TCB tcb;
int task_num=1;
int tskid;
static int stktop,oldsp;//stack_top,last stack_pointer_location
//***********************************//
//
//
//----------------------------------//
void init_coos(int mainstk){
SAVE_SP(stktop);
stktop=stktop+sizeof(void(*)(void))/sizeof(int)
-(mainstk+sizeof(int)-1)/sizeof(int);//void(*)(void) is a fuction_point
}
//=======================================================
int creat_tsk(void(*entry)(int argc,void *argv),
int argc,void *argv,int stksize){
if(task_num>=MAX_TSK) return -1; // error
SAVE_SP(oldsp);
RESTORE_SP(stktop); //point to the Stack_top
if(!setjmp(tcb.env)){ //与那个longjmp对应的???????
//the task no exit and the new one.
RESTORE_SP(oldsp);
tcb.entry=entry;
tcb.argc=argc;
tcb.argv=argv;
task_num++;
stktop -= ( stksize+sizeof(int)-1 )/sizeof(int); //the task_stackgrowth downwardly.
}
else
tcb.entry(tcb.argc,tcb.argv);
return 0;
} 回复【1楼】studyplacefor
-----------------------------------------------------------------------
主文件:
// (^_^)
#include<stdlib.h>
#include"o_os.h"
void tskfunc1(int argc,void *argv);
void tskfunc2(int argc,void *argv);
void subfunc(void);
//=================================
volatile int cnt,test; //define volatile variable
//======================
int main(void)
{
int i;
init_coos(400); //init the stack_heap;
creat_tsk(tskfunc1,12,NULL,400);//new a task
creat_tsk(tskfunc2,0,NULL,400);
i=0;
while(1)
{
WAITFOR(cnt==8); //平均占用CPU ,执行任务
while(i++<cnt) test = i; //test: for debug .
cnt++;
}
}
//===========================================
void tskfunc1(int argc,void *argv){
int i;
static int creat=0; // the guard_flag, it's no need in my opinion
if(!creat){
creat_tsk(tskfunc1,9,NULL,400);
creat=1;
}
i=0;
while(1){
WAITFOR(cnt>argc);//how can he avoid the death_loop ?
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<cnt;i++) test = 0x10 * i;
cnt++;
} 回复【2楼】studyplacefor
-----------------------------------------------------------------------
我的问题:
你好,!
谢谢你的关注!?
首先祝你新年愉快,事业高升,身体健康!
我对本程序的不懂的如下:
1、main.c:
void tskfunc1(int argc,void *argv)函数中有用到递归吗?
“
if(!creat){
creat_tsk(tskfunc1,9,NULL,400); ”
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
while(1){
WAITFOR(cnt>argc);这里这个偱环是如何跳出的,怎么防止死偱环的?
test=0x55;//
/*使用函数调用在子程序中测试WAITFOR*/
subfunc();
while(i++<cnt) test = i^0xaa;//产生测试码?
}
2、o_os.h:
#define WAITFOR(condition) do{ \
setjmp: 、、、、、、/// A处
longjmp:是返回到那里? 是A处还是co_os.c模块的B处?
3、co_os.c:if(!setjmp(tcb.env)){/////////////////////////////////////////B处 B处
RESTORE_SP(oldsp);
tcb.entry=entry;
总的:如果君愿意#希望能大约讲解下,是怎么样切换任务的
thank you ,
yours studyplacefor
2011.02.09
页:
[1]