久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
小小調度器問星整理版[可設置選擇8/16/32位] 極小資源MCU操作系統
[打印本頁]
作者:
xyb851
時間:
2020-7-3 10:19
標題:
小小調度器問星整理版[可設置選擇8/16/32位] 極小資源MCU操作系統
在原作者smset基礎上增加1、可以在宏定義里選擇8位 16位還是32位2、定義任務用TASK開頭
// 任務0 任務定義以TASK開頭
TASK task0(){
_SS
while(1){
WaitX(50);
LED0=!LED0;
}
_EE
}
復制代碼
3、增加實時性更高的等待某條件定義。
4、更多詳細信息請參考附件內容。
最近修改記錄:
2020-07-03
1、增加 普通函數無阻塞延時開關宏定義,方便在不使用普通函數無阻塞延時功能時減少RAM占用和更新任務的時間:
NORMALDELAY 默認為0關閉,修改為1則打開
2020-04-17
1、同步smset的小小調度器1.11(16位定時器版),新增的等待某個條件或超時溢出
WaitUtilT(A,TimeOut)
2、在smset的WaitUtilT(A,TimeOut)基礎上,增加等待某個條件為某個值或超時溢出
WAITUNTILT(A,VAL,TimeOut)
2019-05-30
1、增加等待某個條件為某個值或超時溢出
A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
WAITUNTILO(A,VAL,TaskVAL,ONLY)
每增加一個超時判斷會增加一個調度器位數對應內存占用
2、添加 void runTasks(void); 聲明,確保部分編譯器不會報錯
2019-05-29
1、整合群主semet的普通函數無阻塞延時
2、添加變量位數類型定義,方便根據編譯器環境定義修改
注意:無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數使用
51hei.png
(4.54 KB, 下載次數: 56)
下載附件
2020-7-3 11:02 上傳
全部資料51hei下載地址:
小小調度器1.1.6問星整理版.zip
(2.95 KB, 下載次數: 43)
2020-7-3 10:18 上傳
點擊文件名下載附件
小小調度器1.1.6問星整理版
下載積分: 黑幣 -5
#ifndef __xxddq_H
#define __xxddq_H
/*
* @Project : 小小調度器問星整理版
* @Descripttion : 可設置選擇8/16/32版本,在原來的基礎上進一步增強
* @version : 1.1.6 maintask版
* @Author : smset
* @Date : 2015-06-02 09:02:31
* @LastEditors : 問星
* @LastEditTime : 2020-07-03 09:54:57
* @History :
* 2020-07-03
* 1、增加 普通函數無阻塞延時開關宏定義,方便在不使用普通函數無阻塞延時功能時減少RAM占用和更新任務的時間:
* NORMALDELAY 默認為0關閉,修改為1則打開
*
* 2020-04-17
* 1、同步smset的小小調度器1.11(16位定時器版),新增的等待某個條件或超時溢出
* WaitUtilT(A,TimeOut)
* 2、在smset的WaitUtilT(A,TimeOut)基礎上,增加等待某個條件為某個值或超時溢出
* WAITUNTILT(A,VAL,TimeOut)
*
* 2019-05-30
* 1、增加等待某個條件為某個值或超時溢出
* A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
* WAITUNTILO(A,VAL,TaskVAL,ONLY)
* 每增加一個超時判斷會增加一個調度器位數對應內存占用
* 2、添加 void runTasks(void); 聲明,確保部分編譯器不會報錯
*
* 2019-05-29
* 1、整合群主semet的普通函數無阻塞延時
* 2、添加變量位數類型定義,方便根據編譯器環境定義修改
* 注意:無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數使用
*/
/****小小調度器開始********************************************/
//可根據編譯器環境修改定義變量位數類型,如果出現重復定義錯誤提示,可以注釋掉變量類型定義
#define U8 unsigned char //8位變量類型定義
#define U16 unsigned int //16位變量類型定義
#define U32 unsigned long //32位變量類型定義
#define MAXTASKS 2 //定義調度器主任務數:1-255
#define BITS 8 //定義調度器位數可選值:8/16/32
#define NORMALDELAY 0 //普通函數無阻塞延時開關:0=關;1=開
#define SEM U16 //信號量定義宏
#if (BITS==8)
#define TASK U8
#define TICKET_MAX 0xFF
#endif
#if (BITS==16)
#define TASK U16
#define TICKET_MAX 0xFFFF
#endif
#if (BITS==32)
#define TASK U32
#define TICKET_MAX 0xFFFFFFFF
#endif
volatile TASK timers[MAXTASKS];
#if (NORMALDELAY==1)
volatile TASK delaycount;
#endif
void runTasks(void);
//任務頭
#define _SS static U8 _lc=0; switch(_lc){default:
//任務尾
#define _EE ;}; _lc=0; return TICKET_MAX;
//等待X個時鐘周期
#define WaitX(tickets) do { _lc=(__LINE__%255)+1; return (tickets) ;case (__LINE__%255)+1:;} while(0);
//等待某個條件
#define WaitUntil(A) do { while(!(A)) WaitX(1);} while(0);
//等待某個條件為某個值 A條件變量;VAL條件值
#define WAITUNTIL(A,VAL) do { WaitX(1);} while((A)!=VAL);
//等待某個條件或超時溢出
#define WaitUtilT(A,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(1); _count--; } while((!(A))&&(_count>0));} while(0);
//等待某個條件為某個值或超時溢出
#define WAITUNTILT(A,VAL,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(1); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);
//等待某個條件為某個值或超時溢出 A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
#define WAITUNTILO(A,VAL,TaskVAL,ONLY) do {static TASK A##ONLY;A##ONLY=TaskVAL;do {WaitX(1);A##ONLY--;} while((A)!=VAL && A##ONLY!=0);}while(0);
//只能用在RunTask調用的任務里 實時性更高 等待某個條件
#define WaitUntilR(A) do { while(!(A)) WaitX(0);} while(0);
//只能用在RunTask調用的任務里 實時性更高 等待某個條件為某個值 A條件變量;VAL條件值
#define WAITUNTILR(A,VAL) do { WaitX(0);} while((A)!=VAL);
//只能用在RunTask調用的任務里 實時性更高 等待某個條件或超時溢出
#define WaitUtilTR(A,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while((!(A))&&(_count>0));} while(0);
//只能用在RunTask調用的任務里 實時性更高 等待某個條件為某個值或超時溢出
#define WAITUNTILTR(A,VAL,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);
//運行任務
#define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) { TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;} } while(0);
//運行任務,前面的任務優先保證執行
#define RunTaskA(TaskName,TaskID) do { if (timers[TaskID]==0) {TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;continue;} } while(0);
//調用子任務
#define CallSub(SubTaskName) do {TASK currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1: currdt=SubTaskName(); if(currdt!=TICKET_MAX) return currdt;} while(0);
//調用子任務,傳入一個參數,傳入的參數需在釋放CPU前使用
#define CallSub1(SubTaskName,p1) do {TASK currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1: currdt=SubTaskName(p1); if(currdt!=TICKET_MAX) return currdt;} while(0);
//調用子任務,傳入二個參數,傳入的參數需在釋放CPU前使用
#define CallSub2(SubTaskName,p1,p2) do {TASK currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1: currdt=SubTaskName(p1,p2); if(currdt!=TICKET_MAX) return currdt;} while(0);
//初始化任務調度
#define InitTasks() do {U8 i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } while(0);
#if (NORMALDELAY==0)
//更新任務
#define UpdateTimers() do{U8 i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=TICKET_MAX)) timers[i-1]--;}} while(0);
#endif
#if (NORMALDELAY==1)
//更新任務
#define UpdateTimers() do{U8 i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=TICKET_MAX)) timers[i-1]--;} if(delaycount>0) delaycount--;} while(0);
//普通函數無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數 使用
#define DELAYX(tickets) do{delaycount=tickets;while(delaycount>0) {runTasks();}}while(0);
#endif
//初始化信號量
#define InitSem(sem) do{sem=0;}while(0);
//等待信號量
#define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);
//發送信號量
#define SendSem(sem) do {sem=0;} while(0);
//等待信號量或定時器溢出
#define WaitSemX(sem, tickets) do{sem=tickets+1;WaitX(0);if(sem>1){sem--;return 1;}}while (0);
/*****小小調度器結束*******************************************************/
/*****調用示例*************************************************
#include "xxddq.h"
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED0 = P2^5;
// 任務0 任務定義以TASK開頭
TASK task0(){
_SS
while(1){
WaitX(50);
LED0=!LED0;
}
_EE
}
// 任務1 任務定義以TASK開頭
TASK task1(){
_SS
while(1){
// WaitX(100);
// LED1=!LED1;
test1();
}
_EE
}
// 任務2 任務定義以TASK開頭
TASK task2(){
_SS
while(1){
WaitX(100);
LED2=!LED2;
}
_EE
}
// TIME0初始化
void InitT0()
{
TMOD = 0x21;
IE |= 0x82; // 12t
TL0=0Xff;
TH0=0XDB;
TR0 = 1;
}
// TIM0中斷服務
void INTT0(void) interrupt 1 using 1
{
TL0=0Xff; //10ms 重裝
TH0=0XDB; //b7;
UpdateTimers(); //更新任務
RunTask(task0,0); //任務0具有精確按時獲得執行的權限,要求:task0每次執行消耗時間<0.5個 ticket
}
//無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數 使用
//TASK i 定義參數確保參數位數和調度器內定義的位數一樣
void delayx(TASK i){
DELAYX(i); //普通函數無阻塞延時
}
//普通函數
void test1(){
delayx(50);
LED0=1;
delayx(50);
LED0=0;
delayx(50);
LED0=1;
delayx(50);
LED0=0;
}
//主任務 主任務函數名必須為 runTasks
void runTasks()
{
// RunTask(task0,0);
RunTaskA(task1,1);//任務1具有比任務2高的運行權限
RunTaskA(task2,2);//任務2具有低的運行權限
}
// 主循環
void main()
{
InitT0();
InitTasks(); //初始化任務,實際上是給timers清零
//主循環或主循環內的函數或主循環函數調用的子函數里,必須有一個無阻塞延時函數執行
while(1){
// delayx(1); //無阻塞延時1個任務時鐘
test1(); //調用了無阻塞延時函數的普通函數
// runTasks(); //沒有普通函數調用無阻塞延時函數時,可以只調用主任務
}
}
**************************************************************/
#endif
復制代碼
作者:
xyb851
時間:
2020-10-25 14:15
2020-10-15
1、整合SETJMP版.可通過定義SETJMP切換
#define SETJMP 0 //版本選擇:0=SWINCH版 1=SETJMP版
2020-10-14
1、增加LCBIT宏定義來設置_lc變量類型.
#define LCBIT 0 //選擇_lc的變量類型: 0=8位;1=16位.
PICC高版本編譯器宏不支持__LINE__%255運算,LCBIT定義需設置為1。代價就是每個任務多占一個字節的RAM.
其它編譯器如果不報錯,建議 LCBIT 設置為0,和原來一樣.
小小調度器1.2.0問星整理版.rar
(3.32 KB, 下載次數: 18)
2020-10-25 14:14 上傳
點擊文件名下載附件
小小調度器1.2.0問星整理版
下載積分: 黑幣 -5
作者:
51hei團團
時間:
2020-10-26 03:13
好資料,51黑有你更精彩!!!
作者:
xyb851
時間:
2020-11-4 14:01
重要更新!!!
2020-11-04
1、修復超時判斷只能生效1次的BUG(群友"上善若水"發現)
在WaitUtilT(A,TimeOut)、WAITUNTILT(A,VAL,TimeOut)、WaitUtilTR(A,TimeOut)、WAITUNTILTR(A,VAL,TimeOut)定義里增加”_count=TimeOut;“
小小調度器1.2.1問星整理版.rar
(3.64 KB, 下載次數: 21)
2020-11-4 14:00 上傳
點擊文件名下載附件
小小調度器1.2.1問星整理版
下載積分: 黑幣 -5
作者:
jzbas
時間:
2020-12-14 00:52
贊贊贊
作者:
xyb851
時間:
2020-12-14 10:10
2020-11-06
1、增加 #define WAITUTILTRTYPE 0 //WaitUtilTR 超時等待判斷類型選擇宏
0=簡單,WaitUtilTR(A,TimeOut,TINDEX) TINDEX:超時等待索引只能0-7,每個WaitUtilTR的索引不能重復,只支持8個實時性高的超時判斷;
1=靈活 自定義變量,WaitUtilTR(A,TimeOut,T1FLAY) T1FLAY:1個調度器時鐘周期標志變量,需在調度器時鐘周期定時器中斷里將變量置1。
簡單調用示例:WaitUtilTR(f.b0,2,0);
2020-11-05
1、修改“_count”賦初值的位置,使之理合理
2、修改“WaitUtilTR(A,TimeOut)、WAITUNTILTR(A,VAL,TimeOut)”定義,解決實時性高的判斷等待超時時間不準的問題
增加“T1FLAY”一個調度器周期標志變量參數,變為“WaitUtilTR(A,TimeOut,T1FLAY)、WAITUNTILTR(A,VAL,TimeOut,T1FLAY)”
使用方式請參考例子
小小調度器1.2.3問星整理版.rar
(5.06 KB, 下載次數: 50)
2020-12-14 10:09 上傳
點擊文件名下載附件
小小調度器1.2.3問星整理版
下載積分: 黑幣 -5
作者:
一束光的旅程
時間:
2020-12-27 10:25
謝謝樓主,這個不錯。能看懂,期待更新。
作者:
一束光的旅程
時間:
2020-12-28 09:18
編譯后出現test.c(99): warning C294: unreachable code。這個怎么消除呢?
作者:
cma_ecnu
時間:
2021-1-9 11:29
支持,下載詳細學習一下
作者:
cma_ecnu
時間:
2021-1-9 11:35
有簡單的應用指導說明和具體應用的實例介紹嗎?三個LED,三個任務,不能充分說明系統真正的實用價值。
作者:
sync
時間:
2021-4-8 14:19
贊個,后續還有更新嗎?準備試試看
作者:
xieqinfu
時間:
2023-6-24 22:13
這個小小調度器現在更新到哪個版本了??
作者:
nice0513
時間:
2025-1-24 10:35
感謝分享,這個比較好 1.2.3加入了setjmp
作者:
nearsea
時間:
2025-1-25 12:15
51用OS做的看來還是少啊,關心的人不多,其實項目大還是這個方便
作者:
gsr64
時間:
2025-1-25 14:18
51用OS做我還沒做過,下載下來有空研究一下,后期有大項目用這個比較方便好。非常感謝 xyb851。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
爱爱爱av
|
天天干国产
|
久久国产精品首页
|
在线观看亚洲专区
|
99婷婷
|
97伦理
|
国产激情视频网站
|
成人乱人乱一区二区三区软件
|
欧美a区
|
日韩精品一区二区三区
|
在线日韩av电影
|
欧美啊v在线观看
|
999观看免费高清www
|
色综合美女
|
操久久
|
日本高清aⅴ毛片免费
|
久久99精品国产
|
麻豆av网站
|
久久亚洲免费
|
午夜精品久久久久久久99黑人
|
欧美精品福利视频
|
亚洲永久
|
狠狠躁天天躁夜夜躁婷婷老牛影视
|
一级国产精品一级国产精品片
|
欧美 日本 国产
|
免费观看www
|
成人性视频免费网站
|
欧美一区二区三区视频在线观看
|
暖暖成人免费视频
|
国产午夜三级一区二区三
|
成人小视频在线观看
|
欧美日韩国产在线
|
精品综合
|
日韩高清中文字幕
|
91精品一区
|
99爱国产
|
免费在线一区二区
|
japan21xxxxhd美女 日本欧美国产在线
|
欧美性猛交一区二区三区精品
|
一级一片在线观看
|
久久久久久久久久久蜜桃
|