99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
小小調(diào)度器——調(diào)度器核心的純C實(shí)現(xiàn)
小小調(diào)度器——原來(lái)C代碼還能這么寫(xiě),原作者沒(méi)少挨打吧!
小小調(diào)度器——開(kāi)局default,優(yōu)雅總藏于細(xì)節(jié)之中
作者動(dòng)態(tài) 更多
基于stm32采用PWM驅(qū)動(dòng)伺服控制器學(xué)習(xí)筆記
05-13 15:25
基于STM32驅(qū)動(dòng)TM1638學(xué)習(xí)筆記——軟件篇
04-19 12:42
基于TM1638驅(qū)動(dòng)8位數(shù)碼管設(shè)計(jì)分享
02-24 11:26
RT-Thread驅(qū)動(dòng)之路: Studio創(chuàng)建FAL分區(qū)⑤
01-02 08:30
RT-Thread驅(qū)動(dòng)之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

小小調(diào)度器——調(diào)度器核心的純C實(shí)現(xiàn)


開(kāi)局分割線:接著我們上一篇,其實(shí)小小調(diào)度器最不同于其它實(shí)時(shí)任務(wù)框架的點(diǎn)就在于他的核心是基于:_LINE_的應(yīng)用(純C的實(shí)現(xiàn),并沒(méi)有用到和cpu相關(guān)的寄存器操作,所以他是可以忽略硬件進(jìn)行移植的,只要編譯器支持),當(dāng)然這并不是原作者的原創(chuàng)(真要是我怕你也不敢用),使用_LINE_行號(hào)記錄程序運(yùn)行位置,最早是有PT thread采用的,感興趣的童鞋可以自行度娘,言歸正傳,先從LINE用法開(kāi)始下刀:

ANSI C 規(guī)定了預(yù)定義宏,__LINE__:表示當(dāng)前源代碼的行號(hào);

#define WaitX(tickets)  do { _lc=(__LINE__%255)+1; return (tickets) ;case (__LINE__%255)+1:;} while(0);

int func(void)
{
		while(1)
		{
				WaitX(50);    //假定該行代碼在文件中的行號(hào)是18
				LED0=!LED0;
		}
}

這里有兩個(gè)需要注意的,define WaitX宏為什么寫(xiě)為一行,因?yàn)閷?xiě)一行__LINE__的值就是行號(hào)而且是相同的,雖然宏寫(xiě)一行看起來(lái)很難理解,但是這的確是必須的。

接下來(lái)解釋下_lc=(__LINE__%255)+1; _lc類型為char,取值范圍在0-255,而0為剛進(jìn)入函數(shù)開(kāi)始直接,所以需要避過(guò)該號(hào),所以實(shí)際取值應(yīng)該在1-255之間,__LINE__的實(shí)際值可能超過(guò)255,所以需對(duì)其取余操作,防止跳轉(zhuǎn)沖突(該錯(cuò)誤可在編譯階段查找出來(lái),并不需要太過(guò)擔(dān)心,一旦出現(xiàn)沖突,解決方案也很簡(jiǎn)單,再任務(wù)中多打一行空格即可錯(cuò)開(kāi)行號(hào)沖突)。

到這里我們?cè)賮?lái)看WaitX(50);這個(gè)宏到底執(zhí)行了什么,其實(shí)就以下三點(diǎn):

1.記錄該行號(hào)(因?yàn)楹竺娉绦蛞D(zhuǎn)到該行繼續(xù)執(zhí)行)。

2.跳走,返回值50(返回值是給到調(diào)度任務(wù),調(diào)度任務(wù)計(jì)時(shí)到后,主動(dòng)調(diào)用當(dāng)前任務(wù))

3.進(jìn)入當(dāng)前任務(wù),從記錄行號(hào)開(kāi)始執(zhí)行。


接下來(lái),隆重介紹下即將登場(chǎng)的調(diào)度任務(wù):本質(zhì)上其就是一個(gè)定時(shí)器任務(wù)(框架任務(wù),必不可少),運(yùn)行環(huán)境為:中斷運(yùn)行,代碼如下:

void INTT0(void) interrupt 1 using 1      //看這個(gè)樣子明顯是個(gè)中斷函數(shù)
{
	TL0=0Xff; //寄存器操作,10ms執(zhí)行一次中斷
	TH0=0XDB; //寄存器操作,這不是重點(diǎn)
	UpdateTimers();  //這里是重點(diǎn),看著像函數(shù),實(shí)際這也是個(gè)宏。
}

重點(diǎn)就是UpdateTimers()宏展開(kāi)的實(shí)現(xiàn):

//用最簡(jiǎn)單的方式:純C實(shí)現(xiàn)調(diào)度器核心代碼。
do{
	unsigned char i; 
	for(i=MAXTASKS;i>0 ;i--)
	{
		if((timers[i-1]!=0)&&(timers[i-1]!=65535))   timers[i-1]--;
	}
} while(0);

      這段宏完成了定時(shí)器任務(wù)最主要的功能,主要是對(duì)timers數(shù)組進(jìn)行--操作,timers數(shù)組里面記錄的每個(gè)任務(wù)的延時(shí)時(shí)間(專業(yè)一點(diǎn)叫做阻塞時(shí)間),當(dāng)一個(gè)任務(wù)被阻塞時(shí),return返回值就會(huì)被寫(xiě)入對(duì)應(yīng)的timers數(shù)組中。

      每一個(gè)任務(wù)都有一個(gè)自己的timers,所以timers數(shù)組的最大值就是MAXTASKS(最大任務(wù)數(shù))。一個(gè)任務(wù)有三中狀態(tài):

1. timers為0,這個(gè)時(shí)候的任務(wù)要么是就緒態(tài)(即將運(yùn)行),要么就是運(yùn)行態(tài)。

2. timers不為0,也不是最大值(65535),這個(gè)時(shí)候的任務(wù)為阻塞態(tài)(也就是延時(shí)時(shí)間還沒(méi)到)。

3. timers為65535(最大值),這個(gè)時(shí)候的任務(wù)為停止態(tài)(也就是生命周期結(jié)束了,不再參與系統(tǒng)調(diào)度)。

有了這個(gè)調(diào)度框架(定時(shí)任務(wù))再配合程序猿自己定義的任務(wù)函數(shù),那么小小os就可以簡(jiǎn)簡(jiǎn)單單的跑起來(lái)了。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 3
收藏 4
關(guān)注 151
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧
主站蜘蛛池模板: 97se亚洲国产一区二区三区 | 国产伦一区二区三区视频 | 无码日韩精品一区二区免费 | 国产精成人品 | 久久精品三级视频 | 欧洲美妇乱人伦视频网站 | 狠狠干五月天 | 毛片视频网站 | 人人鲁免费播放视频 | 91羞羞| 91无码视频在线观看 | 日本午夜高清 | 中文精品一区二区三区四区 | 日本一区精品 | av网站免费观看 | 一本大道香蕉久在线播放29 | 国产乱码在线 | 2级毛片 | 国产三级免费观看 | 欧美日韩亚洲中文字幕一区二区三区 | 欧美在线看片a免费观看 | 亚洲一区精 | 精品无码一区二区三区在线 | 欧美在线视频一区在线观看 | av私库在线 | 最近免费日本视频在线 | 绿帽在线 | 逼特逼视频在线 | 久久的色 | 国产欧美一级 | 天堂网www天堂在线资源库 | 亚洲激情四射视频中文字幕久久 | 91精品观看 | 亚洲高清影视 | 91九色丨porny丨交换 | 超碰人人草人人 | 国产综合高清在线观看 | 亚洲欧美日韩精品成人 | 日本少妇高潮正在线播放 | 嫩草视频网 | 国内久久久 |