studyplacefor 发表于 2011-2-10 22:44:36

用单片机编写协作式系统的凝问?????

今天想了很久都想不明白,程序是怎么样用 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 发表于 2011-2-10 22:44:51

回复【楼主位】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;

}

studyplacefor 发表于 2011-2-10 22:45:18

回复【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++;
}

studyplacefor 发表于 2011-2-10 22:45:42

回复【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]
查看完整版本: 用单片机编写协作式系统的凝问?????