搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 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[MAX_TSK];
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[tskid].env);  \  
  if(!(condition)){          \
   tskid++;                   \
if(tskid>=task_num) tskid =0; \
       longjmp(tcb[tskid].env,1);   \   
                   }             \
   }while(0)


//以上longjmp(tcb[tskid].env,1); 返回那个setjmp点?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 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[MAX_TSK];

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[task_num].env)){   //与那个longjmp对应的???????  
                                  //the task no exit and the new one.
RESTORE_SP(oldsp);

tcb[task_num].entry=entry;

tcb[task_num].argc=argc;

tcb[task_num].argv=argv;

task_num++;

stktop -= ( stksize+sizeof(int)-1 )/sizeof(int); //the task_stack  growth downwardly.

}

else  

tcb[tskid].entry(tcb[tskid].argc,tcb[tskid].argv);

return 0;

}

出0入0汤圆

 楼主| 发表于 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++;
}

出0入0汤圆

 楼主| 发表于 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[task_num].env)){  /////////////////////////////////////////B处 B处
                                   
RESTORE_SP(oldsp);

tcb[task_num].entry=entry;


总的:如果君愿意#希望能大约讲解下,是怎么样切换任务的

thank you     ,

                  yours   studyplacefor  
                              2011.02.09
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 18:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表