音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

俺最近寫的一個OS

作者:qfqf16 欄目:單片機
俺最近寫的一個OS
現(xiàn)在大家都在學(xué)OS,我也想學(xué)學(xué)OS,乘現(xiàn)在在大學(xué)里有時間,多學(xué)學(xué)
就自己動手也寫啦個OS,不過,這個OS是單任務(wù)的,雖然實時性
沒有多任務(wù)的RTOS強,但比沒有的好.全部是C語言寫的,
有什么不妥的地方,請各位大蝦們多多指點指點!!^_^THANK YOU!!

/**********本程序只供學(xué)習(xí)使用**************************/
/*
*******************************************************************************************************
**                                                  SecOS
**
**                                 (c) COPYRIGHT 2005 - 2006 , qin feng
**                                           All Rights Reserved
**
**                                               V1.00
**
**
**文   件   名: SecOS.H
**創(chuàng)   建   人: qinfeng
**描        述: EX0文件
*******************************************************************************************************
*/
#include "SecOS.h"            /*系統(tǒng)頭文件*/

uint8 Buf[4];                /*定義緩沖區(qū)*/

void main(void)
{    
    OSTaskStart(0);            /*啟動任務(wù)0*/
    OSTaskStart(2);            /*啟動任務(wù)2*/
    OSBufCreate(Buf,4);        /*創(chuàng)建數(shù)據(jù)緩沖區(qū)*/
    OSStart();                /*啟動操作系統(tǒng)*/
}

void Task0(void)    /*任務(wù)由系統(tǒng)幫循環(huán),任務(wù)中不能無限循環(huán)*/
{
    uint8 a=1;
    uint8 err;
    a++;
    a++;
    OSBufWrite(Buf,a,&err);    /*把a寫入Buf中*/
    if(err==OS_BUF_FULL)
    {
        printf("OS_BUF_FULL!\n");
    }
    else
    {
        printf("OS_BUF_WRITE!.........a=%d\n",a);
    }
    OSSignSend(1);        /*啟動任務(wù)1*/
    OSSignWait(2);        /*任務(wù)等待2個時鐘周期*/
}

void Task1(void)
{
    uint8 b=8;
    uint8 err;
    b++;
    err=OSBufRead(Buf,&b);    /*從Buf中讀取數(shù)據(jù)存入b中*/
    if(err==OS_BUF_EMPTY)
    {
        printf("OS_BUF_EMPTY!\n");
    }
    else
    {
        printf("OS_BUF_READ!............b=%d\n",b);    
    }
    OSSignWait(OS_SIG);    /*任務(wù)1等待任務(wù)0的信號*/
}

void Task2(void)
{
    uint8 c=10;
    uint8 err;
    c--;
    err=OSBufRead(Buf,&c);    /*從Buf中讀取數(shù)據(jù)存入c中*/
    if(err==OS_BUF_EMPTY)
    {
        printf("OS_BUF_EMPTY!\n");
    }
    else
    {
        printf("OS_BUF_READ!............c=%d\n",c);    
    }
    OSTimeTick();        /*系統(tǒng)時鐘,一般在時鐘中斷中調(diào)用*/
}

2樓: >>參與討論
qfqf16
os
/*
********************************************************************************************************
** 系統(tǒng)宏名稱
********************************************************************************************************
*/        
#define OS_SIG 0        /*0為無限等待信號*/
#define OS_BUF_EMPTY 0
#define OS_BUF_WRITE 1
#define OS_BUF_FULL 0
#define OS_BUF_READ 1
#define OSTaskStart(Id) OSSignSend(Id)
typedef unsigned CHAR  uint8;

/*
********************************************************************************************************
** 任務(wù)配置部分
********************************************************************************************************
*/
#define OS_MAX_TASKS 3 /*任務(wù)數(shù)目*/

#ifdef SecOS_SYS

extern void Task0(void);
extern void Task1(void);
extern void Task2(void);
/*數(shù)組TaskMap[]按任務(wù)優(yōu)先級次序保存任務(wù)地址*/
void (*TaskMap[OS_MAX_TASKS])(void)={Task0,Task1,Task2};

#endif
/*
********************************************************************************************************
** 系統(tǒng)函數(shù)名稱
********************************************************************************************************
*/
extern void OSSignSend(uint8 Id);
extern void OSSignWait(uint8 Tick);
extern void OSStart(void);
extern void OSTimeTick(void);
extern void OSBufCreate(uint8 *Buf,uint8 Size);
extern void OSBufWrite(uint8 *Buf,uint8 Data,uint8 *Err);
extern uint8 OSBufRead(uint8 *Buf,uint8 *Data);



3樓: >>參與討論
qfqf16
os
#define SecOS_SYS

#include "SecOS.h"

uint8 OSRdy=0;
uint8 OSNowTaskID=0;
uint8 OSTaskTick[OS_MAX_TASKS];
uint8 const OS_Map[]={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};

/*
********************************************************************************************************
** 函數(shù)名稱: OSSignSend
** 功能描述: 喚醒任務(wù),既使指定任務(wù)就緒
** 輸 入:      TaskID
********************************************************************************************************
*/
void OSSignSend(uint8 Id)
{
    OSRdy |= OS_Map[Id];
}
/*
********************************************************************************************************
** 函數(shù)名稱: OSSignWait
** 功能描述: 使指定任務(wù)等待信號
** 輸 入:      TaskID
********************************************************************************************************
*/
void OSSignWait(uint8 Tick)
{
    OSTaskTick[OSNowTaskID]=Tick;
    OSRdy &= ~OS_Map[OSNowTaskID];
}
/*
********************************************************************************************************
** 函數(shù)名稱: OSTimeTick
** 功能描述: 系統(tǒng)時鐘函數(shù)
** 輸 入:     無
********************************************************************************************************
*/
    void OSTimeTick(void)
{
    uint8 i;
    for(i=0;i<OS_MAX_TASKS;i++)
    {
        if(OSTaskTick[i]!=0)
        {
            OSTaskTick[i]--;
            if(OSTaskTick[i]==0)
            {
                OSSignSend(i);
            }
        }
    }
}
/*
********************************************************************************************************
** 函數(shù)名稱: OSStart
** 功能描述: 啟動多任務(wù)環(huán)境
** 輸 入:      無
********************************************************************************************************
*/
void OSStart(void)
{
     uint8 rdy;
     uint8 i;
    while(1)
    {
        rdy=OSRdy;
        for(i=0;i<OS_MAX_TASKS;i++)
        {
            if(rdy&0x01)
            {
                OSNowTaskID=i;
                TaskMap[i]();
                continue;
            }
            rdy=rdy>>1;        
        }        
    }
}

/*
********************************************************************************************************
** 函數(shù)名稱: OSBufCreate
** 功能描述: 創(chuàng)建緩沖區(qū)
** 輸 入:      緩沖區(qū)指針,大小
********************************************************************************************************
*/
void OSBufCreate(uint8 *Buf,uint8 Size)
{
    Buf[0]=3;
    Buf[1]=0;
    Buf[2]=Size-1;
}
/*
********************************************************************************************************
** 函數(shù)名稱: OSBufRead
** 功能描述: 讀數(shù)據(jù)緩沖區(qū)
** 輸 入:       緩沖區(qū)指針,數(shù)據(jù)指針
********************************************************************************************************
*/

uint8 OSBufRead(uint8 *Buf,uint8 *Data)
{
    if(Buf[1]==0)
        return OS_BUF_EMPTY;
    *Data=Buf[*Buf];
    Buf[1]--;
    Buf[0]++;
    if(Buf[0]>Buf[2])
        Buf[0]=3;    
    return OS_BUF_READ;
}


/*
********************************************************************************************************
** 函數(shù)名稱: OSBufWrite
** 功能描述: 數(shù)據(jù)寫入緩沖區(qū)
** 輸 入:       緩沖區(qū)指針,數(shù)據(jù)指針,錯誤
********************************************************************************************************
*/
void OSBufWrite(uint8 *Buf,uint8 Data,uint8 *Err)
{
    uint8 s,TEMP,i;
    s=Buf[2]-2;
    TEMP=Buf[0]+Buf[1];
    if(Buf[1]>s)
    {
        *Err= OS_BUF_FULL;
    }
    else
    {
        if(TEMP>Buf[2])
            i=Buf[0]+Buf[1]-Buf[2]+2;
        else            
            i=Buf[0]+Buf[1];
        Buf[i]=Data;
        Buf[1]++;
        *Err= OS_BUF_WRITE;
    }    
}

4樓: >>參與討論
qfqf16
os
其實其調(diào)度部分是基于網(wǎng)絡(luò)狀態(tài)機,每個任務(wù)其實是一個函數(shù)
由系統(tǒng)按優(yōu)先級調(diào)度函數(shù),每個任務(wù)必須主動放棄CPU,才會運行
下一個任務(wù).

5樓: >>參與討論
農(nóng)民講習(xí)所
如何處理 printf之類的引起的硬件沖突問題?
不要把OS想的太簡單了。:)

補充更正:樓主的不是時間片,不存在這個問題,00的OS會。
另:樓主做的這個一點意義也沒有,但想法是對的,因為只要轉(zhuǎn)換下每個任務(wù)的書寫結(jié)構(gòu)就可以實現(xiàn)樓主的意思,不存在任務(wù)調(diào)度問題,也沒必要安個任務(wù)調(diào)度,只要在樓主的類似OSStart中的while(1)放到main中就可以。優(yōu)秀的前后臺多任務(wù)結(jié)構(gòu)就是如此(每個任務(wù)快進快出)

繼續(xù)+:
對printf、delay()之類函數(shù)一定要堅決徹底說再見,用緩沖和狀態(tài)變化替代,這樣才能寫出好的程序。

* - 本貼最后修改時間:2005-12-15 20:26:25 修改者:農(nóng)民講習(xí)所

6樓: >>參與討論
qfqf16
謝謝您
哦!這個我是在一般的C編譯器模擬的,
主要是想:有些時候要延時,會浪費很多
CPU時間,所以當需要延時時,就可以把
其切換出去運行別的函數(shù)。

7樓: >>參與討論
qfqf16
......
我原來編的OS不是這樣的,是一個實時多任務(wù)的。
由于在學(xué)校里沒有那么好的條件,只有拿51來試試,
我同學(xué)說RTOS太占內(nèi)存拉,所以我才會想到編一個
這樣的。其實也就是一個簡單的前后臺程序框架。



8樓: >>參與討論
ketp
OS主要是為了編程方便而不是實時性
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
單片機設(shè)計項目招標
想學(xué)C51,想各位前輩請教
mifare1卡Anticollition出錯的問題
誰用過MSC1210單片機的看門狗
液晶顯示問題
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號