|
|||||||||||
| 技術(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 欄目:單片機 |
現(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 于 2005/12/15 19:36:00 發(fā)布:
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 于 2005/12/15 19:37:00 發(fā)布:
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 于 2005/12/15 19:46:00 發(fā)布:
os 其實其調(diào)度部分是基于網(wǎng)絡(luò)狀態(tài)機,每個任務(wù)其實是一個函數(shù) 由系統(tǒng)按優(yōu)先級調(diào)度函數(shù),每個任務(wù)必須主動放棄CPU,才會運行 下一個任務(wù). |
|
| 5樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/12/15 20:13:00 發(fā)布:
如何處理 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 于 2005/12/16 10:23:00 發(fā)布:
謝謝您 哦!這個我是在一般的C編譯器模擬的, 主要是想:有些時候要延時,會浪費很多 CPU時間,所以當需要延時時,就可以把 其切換出去運行別的函數(shù)。 |
|
| 7樓: | >>參與討論 |
| 作者: qfqf16 于 2005/12/16 10:32:00 發(fā)布:
...... 我原來編的OS不是這樣的,是一個實時多任務(wù)的。 由于在學(xué)校里沒有那么好的條件,只有拿51來試試, 我同學(xué)說RTOS太占內(nèi)存拉,所以我才會想到編一個 這樣的。其實也就是一個簡單的前后臺程序框架。 |
|
| 8樓: | >>參與討論 |
| 作者: ketp 于 2005/12/16 16:06:00 發(fā)布:
OS主要是為了編程方便而不是實時性 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |