新四季網

寵物任務的詳細流程(探討多任務下餵狗的方式)

2023-11-08 08:40:03

寵物任務的詳細流程? 一直以來,我不斷的探索RTOS的使用方法,以UC/OS-II為基礎當然努力的結果是逐漸形成了一個可以使用的軟體平臺但我意識到如果沒有相應文檔的支持或許這個東西也許只有我自己能使用了另外提高的空間有限所以今天就從這個困擾我許久的問題入手,慢慢的介紹我這兩年來努力的成果,我來為大家科普一下關於寵物任務的詳細流程?以下內容希望對你有幫助!

寵物任務的詳細流程

一直以來,我不斷的探索RTOS的使用方法,以UC/OS-II為基礎。當然努力的結果是逐漸形成了一個可以使用的軟體平臺。但我意識到如果沒有相應文檔的支持或許這個東西也許只有我自己能使用了。另外提高的空間有限。所以今天就從這個困擾我許久的問題入手,慢慢的介紹我這兩年來努力的成果。

關於多任務下如何才能有效的使用看門狗這個問題其實也不是很難。關鍵是在於餵狗的策略。你沒辦法像以前一樣。在程序的開頭初始化看門狗,然後在程序中的某一點調用餵狗指令,清除看門狗計數器。因為你要明白,你想要清楚的知道每一個任務都必需有條不紊的工作的。任何一個任務死掉就得停止餵狗。這就是問題的關鍵了。所以你不可以在每個任務裡直接調用餵狗指令。那是混亂的沒有實際意義。

那麼不能直接餵狗,自然就想到間接餵狗的方式了。如何才能做到間接餵狗。我使用了軟體看門狗的方式。給每個任務一個軟體模擬出來的看門狗計數器。然後在適當的時候定時的查詢每一個軟體看門狗的餵狗情況,由此決定是否調用餵狗指令,清除看門狗計數器。如果發現有任何一個軟體看門狗溢出,就停止餵狗,讓系統復位。

如何定時查詢軟體看門狗的餵狗情況? UC/OS-II系統時間節拍鉤子函數是個不錯的選擇。隨後再給出具有體的實現。

void OSTimeTickHook (void)

{ SoftWdtISR; //定時查詢每一個軟體看門狗餵狗狀況。

}

軟體看門狗是一個什麼樣的東西??從數據結構上來說,它是這樣子的:

typedef struct soft_wach_dog_timer{

uint16 watchDogTimeOut; //看門狗計數超時初值

uint16 watchDogTime; //看門狗定時器

uint8 watchDogCountBack; //上一次看門餵狗計數器

uint8 watchDogCount; //看門狗餵狗計數器

SWDT_STAT watchDogState; //看門狗定時器狀態

uint8 NOUSE8;

}SOFT_WATCH_DOG_TIMER;

好吧,我來一個個介紹,才幾個變量而以,很容易的。先講第二個成員吧,uint16 watchDogTime; 這個就是軟體看門狗的定時器了,每當調用SoftWdtISR的時候如果相應看門狗沒有餵狗操作該值會被減去1,否則將從第一個成員uint16 watchDogTimeOut複製一份拷貝。所以第一個成員變量叫做看門狗計數超時初值。那麼第三個和第四個成員變量是幹嗎用的呢,這兩個就是用來判斷是否有餵狗操作。第五個成員是表示軟體看門狗狀態的。總共有三種狀態。

typedef enum{ SWDT_STAT_IDLE, //軟體看門狗空閒

SWDT_STAT_SUSPEN, //軟體看門狗掛起

SWDT_STAT_RUN //軟體看門狗運行

}SWDT_STAT; 接下來看看SoftWdtISR的實現吧。

void SoftWdtISR(void){

SOFT_WATCH_DOG_TIMER *SoftWatchDogTimerPtr = SoftWatchDogTimerList;

uint8 i = 0;

if(StopWDTFedMake == TRUE){

return;

}

for(i=0; iwatchDogState == SWDT_STAT_RUN){

//軟體看門狗有餵食,重裝看門狗計數上限

if(SoftWatchDogTimerPtr->watchDogCount != SoftWatchDogTimerPtr->watchDogCountBack){

SoftWatchDogTimerPtr->watchDogCountBack = SoftWatchDogTimerPtr->watchDogCount;

SoftWatchDogTimerPtr->watchDogTime = SoftWatchDogTimerPtr->watchDogTimeOut;

}else if(--SoftWatchDogTimerPtr->watchDogTime == 0){ //沒有餵狗,看門狗計時器減一操作 //其中任一個運行著的看門狗超時停止餵硬體看門狗

StopWDTFedMake = TRUE;

return;

}

}

SoftWatchDogTimerPtr ;

}//調用硬體餵狗

FeedDog;

}

SoftWdtISR函數隻對狀態為運行的軟體看門狗定時器進行檢查,每次都要判斷watchDogCountBack 是否等於watchDogCount,相等就表示該軟體看門狗沒有調用餵狗操作,然後執行軟體看門狗計數watchDogTime值減一操作。如果不相等就把watchDogCount的值賦給watchDogCountBack,。並且把watchDogTimeOut的值賦給watchDogTime,清除看門狗計數器。

當watchDogTime值為0,表示軟體看門狗溢出,需要復位系統。這有些曲折和複雜了,以後會改進。到時會去掉watchDogCountBack 、watchDogCount,這兩個成員。那麼該如何使用看門狗呢,我們要知道總共有幾個任務,為每個任務分配一個軟體看門狗,為每個看門狗分配一個ID。然後要清空所有軟體看門狗和初始化硬體看門狗:

typedef enum{//往這裡添加軟體看門狗ID

KEY_TASK_SWDT_ID,

MP3_TASK_SWDT_ID,

MAX_SWDT_ID,

}SWDT_ID;

//軟體看門狗定時器數組

SOFT_WATCH_DOG_TIMER SoftWatchDogTimerList[MAX_SWDT_ID] = {0};

void SoftWDTInit(void){

OS_MEMSET(SoftWatchDogTimerList, 0, sizeof(SOFT_WATCH_DOG_TIMER)*MAX_SWDT_ID); StopWDTFedMake = 0; //初始化硬體看門狗

WatchDogInit(1000,1);

}

軟體看門狗的使用:

Void KeyBoardTask(void *pdata){

//任務開始的地方,初始化軟體看門狗

SoftWdtInit(KEY_TASK_SWDT_ID,2000);

While(1){

const DEV_FUN* Device = NULL;

HAL_ERR_CODE err;

uint8 key_value[2] = {0};

uint8 data_addr = 0; /* 讀取一按鍵 */

SoftWdtFed(KEY_TASK_SWDT_ID); //任務主循環中餵狗

Device = DeviceOpen(I2C0_ID,&err);

……………………………..//以下代碼省略。

DeviceClose(&Device);

}

}

首先就是在任務開始的地方調用SoftWdtInit(KEY_TASK_SWDT_ID,2000);設置軟體看門狗溢出時間,單位mS. 然後在任務的主循環中調用SoftWdtFed(KEY_TASK_SWDT_ID);餵狗.接下來看看軟體看門狗初始化,和餵狗的實現。軟體看門狗的初始化:

//初始化軟體看門狗

BOOL SoftWdtInit(SWDT_ID SwdtId, uint16 TimerTop){

SOFT_WATCH_DOG_TIMER *SoftWatchDogTimerPtr = SoftWatchDogTimerList;

uint16 osTick = 0;

if(SwdtId >= MAX_SWDT_ID){

return 0;

}

if(SoftWatchDogTimerPtr->watchDogState == SWDT_STAT_IDLE){

SoftWatchDogTimerPtr = SwdtId;

osTick = MsToOSTicks(TimerTop);//將mS時間換算成系統時鐘節拍

SoftWatchDogTimerPtr->watchDogTimeOut = osTick;

SoftWatchDogTimerPtr->watchDogTime = osTick;

SoftWatchDogTimerPtr->watchDogState = SWDT_STAT_RUN;

return 1;

}else{

return 0;

}

}

這裡就沒什麼好說的,從軟體看門狗定時器數組裡,根據ID找到相應的軟體看門狗,然後初始化watchDogTimeOut,置watchDogState狀態為運行。

餵狗: //軟體看門狗餵食

void SoftWdtFed(SWDT_ID SwdtId){

SOFT_WATCH_DOG_TIMER *SoftWatchDogTimerPtr = SoftWatchDogTimerList; if(SwdtId >= MAX_SWDT_ID){

return;

}

SoftWatchDogTimerPtr = SwdtId;

OS_ENTER_CRITICAL;

SoftWatchDogTimerPtr->watchDogCount ;

//保證這兩個值使終不相等 if(SoftWatchDogTimerPtr->watchDogCount == SoftWatchDogTimerPtr->watchDogCountBack){

SoftWatchDogTimerPtr->watchDogCount ;

}

OS_EXIT_CRITICAL;

}

這個也很簡單,根據ID找到相應的軟體看門狗,然後執行SoftWatchDogTimerPtr->watchDogCount ;並保證SoftWatchDogTimerPtr->watchDogCount 不等於SoftWatchDogTimerPtr->watchDogCountBack多餘的部分:

之前說過watchDogCount 、watchDogCountBack這兩個是多餘的所以將來會改成: void SoftWdtFed(SWDT_ID SwdtId){

SOFT_WATCH_DOG_TIMER *SoftWatchDogTimerPtr = SoftWatchDogTimerList;

if(SwdtId >= MAX_SWDT_ID){

return; }

SoftWatchDogTimerPtr = SwdtId;

OS_ENTER_CRITICAL;

SoftWatchDogTimerPtr->watchDogTime = SoftWatchDogTimerPtr->watchDogTimeOut;

OS_EXIT_CRITICAL;

}

相應的SoftWdtISR也需要簡化。

最後介紹兩個函數: void SuspenWdt(SWDT_ID SwdtId); //掛起軟體看門狗。void RunWdt(SWDT_ID SwdtId); //恢復運行軟體看門狗。

,
同类文章
貓咪多久需要擠肛門腺(貓咪肛門腺到底要不要擠)

貓咪多久需要擠肛門腺(貓咪肛門腺到底要不要擠)

鏟屎官最近聞到自家的貓咪散發出一股臭味,久久揮散不去,走哪帶哪。 貓咪也開始頻繁在地上摩擦自己的屁股,這是貓咪需要擠肛門腺了嘛? 鏟屎官立刻就某度了一下,結果有人說要擠!有人說不要擠!這給人整暈乎了,到底是擠還是不擠啊! 本篇文章就幫鏟屎官們理理清楚,先出結論:不用擠!
寧波流浪狗愛心救助直播(寧波最暖心物業)

寧波流浪狗愛心救助直播(寧波最暖心物業)

救人一命 勝造七級浮屠 那救狗一命呢? 天熱了 小動物們都很愛折騰啊 論壇上剛來了一隻最不要臉的邊牧犬 現在又有了一隻錯估自己頭型 伸進欄杆卻出不來的流浪狗 …… (拍的略糊,可這小眼神看著又慘又想笑) 東論網友@quyd拍攝 終於,這副慘狀引來好心
蜘蛛俠新角色首曝(蜘蛛俠新女友黑貓)

蜘蛛俠新角色首曝(蜘蛛俠新女友黑貓)

2021年還剩下幾天就將成為過去式,而未來式的2022年也是站在了接力點前,而伴隨著2022年虎年的到來,關於漫威這段時間的很多消息傳聞也是不斷湧現出來,有關於後續的項目作品的,也有關於之前漫威項目新消息的。 所以,今天咱們就來看看,漫威這段時間都有哪些新消息曝光: 【1】8個漫威秘
狗突然的對主人叫心臟都要嚇壞了(主人以為狗狗躺在血泊中)

狗突然的對主人叫心臟都要嚇壞了(主人以為狗狗躺在血泊中)

家裡養了狗,那真就是隨時準備迎接新驚喜,尤其是柯基這種渾身上下散發著「智慧」氣質的狗狗。 這隻超可愛的柯基叫作Cartier,它的主人在泰國大城經營著一家咖啡館兒,平時它就跟主人在店裡呆著,四處遛遛什麼的。 前幾天主人像往常一樣讓Cartier出門自己上廁所然後等它回來。結果等了好久
貓超卡划算嗎(10元貓超卡又來了)

貓超卡划算嗎(10元貓超卡又來了)

前言:收到顯示器,黑色背景下全是彩色亮點,換貨; 不過27寸4K的屏幕,用電腦真的爽,比筆記本爽多了,雖然我這個筆記本是16寸的。01 10元貓超卡又來? 一、活動概覽 活動地址:https://developer.aliyun.com/adc/series/activity/serv
戰神貓熊滿級(娜貓的雙子指令形態登場)

戰神貓熊滿級(娜貓的雙子指令形態登場)

在最新的特攝雜誌上,出現了比較有趣的劇照,首先就是關於女騎假面騎士娜貓的新形態。雖然是女騎,但其實她的新形態比較少,目前一直都是在使用這個節拍形態,終於有了新的形態了。另外就是之前因為基洛利而下線的假面騎士棕熊,似乎並沒有死亡,然後再度歸來。然後就是假面騎士極狐和邪魔徒的立場了,似乎是合作了?因為
世界排名前10最聰明的狗貴賓(能記住一千多個單詞)

世界排名前10最聰明的狗貴賓(能記住一千多個單詞)

2021年5月10日,Hub City Animal Project宣布展出一座銅像,以紀念「世界上最聰明的狗狗」——Chaser。 她有多聰明呢?她在1歲時就能記住約4百個單詞,在三歲時,她的詞彙量已經超過了一千個! Chaser飼主的女兒Bianchi還說道,除了知道哪個單詞對應
淘寶目前暢銷的玩具(天貓618四大類玩具熱賣榜)

淘寶目前暢銷的玩具(天貓618四大類玩具熱賣榜)

截止6月20日23:59,天貓「618年中大促」落下帷幕。與往年鋪天蓋地的宣傳相比,今年整個活動周期都顯得有些安靜,平臺方甚至沒在活動結束第一時間發布最終成交額數據。這不免讓人忐忑:今年的行情是否很差? 從玩具業來看,不是很樂觀。中外玩具全媒體中心記者從部分廠商處獲悉,由於疫情對經濟造成的
愛養貓的女生什麼性格(養女兒如養貓)

愛養貓的女生什麼性格(養女兒如養貓)

在眾多想生兒子的家庭中,不全是因為重男輕女,而是有些夫妻感覺養女兒後經歷失望和傷心,許多方面要比養男孩更操心。 可女兒不是一直被稱為爸爸媽媽的貼心小棉襖嗎?為何會有人這樣比喻女兒呢?這不得不提有些女孩總在感情中犯傻的情況。 不久前的假期我參加了多場婚禮,現場有許多新娘新郎的長輩,在一聲聲祝
已滅絕的金剛鸚鵡(最高可賣上萬歐元)

已滅絕的金剛鸚鵡(最高可賣上萬歐元)

金剛鸚鵡原產於巴西的亞馬遜熱帶雨林地區。圖據《國家地理》網站 金剛鸚鵡是色彩豔麗的大型鸚鵡,羽毛五彩斑斕,像彩虹一樣漂亮。平均體長在90-100釐米左右。它們智商很高,模仿能力超強,平均壽命有65年之久。由於廣受喜歡,金剛鸚鵡長期以來成為不法分子走私的對象。據美國《國家地理》雜誌報導,隨