久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
我的ModBus主機-調度篇
[打印本頁]
作者:
qinlu123
時間:
2021-11-15 13:29
標題:
我的ModBus主機-調度篇
開始本篇之前我想先談一下為什么要把一個ModBus主機分成4篇來寫,一是代碼的分層理念,隨著工作時間的增長以及工作的深入你會發現分層是那么的至關重要不僅僅是代碼的可讀性更重要的是更方便的維護。初期寫代碼一個文件中甚至一個函數中既有功能代碼又有底層代碼,當增刪功能或者平臺移植的時候都不知道去哪里哭,分層也許在初期會增加代碼量顯得很麻煩但是當你的架構建立起來之后會變得十分方便,解決問題得心應手。操作系統幫你做好了底層的分層和軟件層面的任務調度,但是應用層面依然需要個人來做好。分層理念需要時時有處處有。二是ModBus的一對多特性,當一個主機任務讀取某個從機的數據并等待從機應答時,必須保證別的主機任務不要來動ModBus總線,如果有個不長眼的主機任務過來咔咔操作了總線那么之前等待從機應答的任務就崩潰了。可能有人說了等待應答的時候我直接while死等不就行了,直接斷了別的主機任務的念想,當然這樣是可以解決問題的不過要是某個從機不在線就會導致整個系統卡死一段時間,要是你用了操作系統還好如果是裸機那就非常影響用戶體驗并且會使其他任務比如刷屏按鍵出現一些莫名其妙的問題,我們都知道人的新陳代謝越快身體越強壯,同樣任務輪詢越快系統也越強壯。無論你使用操作系統還是裸機都要避免使用阻塞式的寫法。所以我們才大費周章分4層來解決一個ModBus主機問題。本篇調度篇內容很少但是整個ModBus主機系統的重中之重。
我們先來看代碼。
#ifndef __RS485_H
#define __RS485_H
#include "Header.h"
#include "THP.h"
#include "EPC.h"
#include "Delay.h"
extern uint16_t RS485BusSilentTime1;
void RS485Device1Init(void);
void RS485Device1Handle(void);
#endif
復制代碼
#include "RS485Device.h"
uint16_t RS485BusSilentTime1;
void RS485Device1Init(void)
{
THPInit();
EPCInit();
}
static uint8_t TaskHandle(uint8_t En, uint8_t (*Task)(void*), void *Dev, uint8_t *BusTake, uint8_t TaskID, uint16_t *DelayTime)
{
if((En!=0) && ((*BusTake==0)||(*BusTake==TaskID)))
{
if(Task(Dev) != 0)
{
/*釋放總線*/
*BusTake = 0;
Set_Delay_Time(10,DelayTime);
}
else
{
/*占用總線*/
*BusTake = TaskID;
return 1;
}
}
return 0;
}
void RS485Device1Handle(void)
{
static uint8_t BusTake=0;
if(CheckDelay(&RS485BusSilentTime1) == 0)
{
if(TaskHandle(EPC1.S_P_En,SetPreVal,&EPC1,&BusTake,1,&RS485BusSilentTime1) != 0)
{
return;
}
if(TaskHandle(THP1.Enable,ReadTHP,&THP1,&BusTake,2,&RS485BusSilentTime1) != 0)
{
return;
}
if(TaskHandle(EPC1.R_En,ReadEPC,&EPC1,&BusTake,3,&RS485BusSilentTime1) != 0)
{
return;
}
}
}
復制代碼
通過代碼可以看到該層引用了任務篇創建的"THP.h"和"EPC.h",在這里我們要對三個主機任務進行調度。
首先來看函數“
static uint8_t TaskHandle(uint8_t En, uint8_t (
Task)(void
), void *Dev, uint8_t *BusTake, uint8_t TaskID, uint16_t *DelayTime)
”;
該函數參數比較多,分別為任務使能信號(uint8_t En)、任務主體(uint8_t (
Task)(void
))、設備名稱(void *Dev)、是誰在使用總線(uint8_t *BusTake)、任務編號(uint8_t TaskID)、總線靜默時間控制(uint16_t *DelayTime);
該函數邏輯很簡單,就是判斷任務使能信號是否置位了并查看總線被哪個任務占用,若總線空閑或者被自己占用就去占用總線去執行任務主體函數,若任務主體函數返回0說明正在等待從機應答接著占用總線并返回1告知調度器我還沒用完,否則說明任務完成了釋放總線并給總線插入10ms的靜默時間然后返回0告訴調度器我完事了讓別人來吧。
函數“
void RS485Device1Handle(void)
”就是最終的調度器它在main函數的while循環中被執行,它首先實現10ms的總線靜默然后挨個詢問主機任務的當前狀態并滿足他們的需求。
至此,我的ModBus主機就完結了。
作者:
jxcrgt35
時間:
2021-11-20 09:49
謝謝分享,能否提供一些關于分層的思想的文章,學習。
作者:
海陽螃蟹
時間:
2022-2-16 21:05
謝謝分享,能否提供一些關于分層的思想的文章,學習。
作者:
alangada
時間:
2022-3-9 08:33
mark,標記學習下
作者:
63451141
時間:
2022-3-21 22:25
mark,標記學習下
作者:
大漠落日
時間:
2022-5-7 14:38
上的操作系統?
作者:
lihuaxu66
時間:
2022-5-20 12:10
謝謝分享,能否提供一些關于分層的思想的文章,學習
作者:
sindycn
時間:
2022-12-11 15:36
mark,標記學習下
作者:
liixaofei5
時間:
2023-4-16 09:43
,標記學習一下,感謝分享
作者:
qhp777
時間:
2023-5-12 16:42
mark,標記學習下
作者:
ngyl
時間:
2023-8-6 14:58
moubus在工作中我遇到了,也看了大概的基本原理,但程序寫不出來,借鑒一下樓主的
作者:
jxcrgt35
時間:
2023-8-15 14:34
思路清晰,程序扎實
作者:
qinlu123
時間:
2024-10-30 16:59
大漠落日 發表于 2022-5-7 14:38
上的操作系統?
裸機,我自己的框架
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产丝袜一区二区三区免费视频
|
日韩美女一区二区三区在线观看
|
精品九九九
|
尤物在线精品视频
|
桃花av在线
|
午夜影院在线观看视频
|
9999精品视频
|
cao在线
|
久久综合狠狠综合久久综合88
|
7777在线视频
|
国精日本亚洲欧州国产中文久久
|
日韩久草
|
伦理一区二区
|
精品国产99
|
国产欧美精品一区二区色综合
|
国产毛片毛片
|
黄在线免费观看
|
亚洲欧美国产精品久久
|
欧美日韩三级在线观看
|
九九久久国产
|
欧美日韩国产精品一区二区
|
夜夜夜操
|
日韩成人专区
|
精品99在线
|
在线中文字幕视频
|
一区二区在线不卡
|
99pao成人国产永久免费视频
|
国产区第一页
|
日韩免费在线
|
欧美精品91
|
玖玖玖在线观看
|
精品综合
|
91精品国产欧美一区二区成人
|
一区二区中文
|
欧美成人在线网站
|
亚洲品质自拍视频网站
|
亚洲精品9999久久久久
|
久久精品二区
|
欧美白人做受xxxx视频
|
免费观看毛片
|
国产真实乱对白精彩久久小说
|