久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 一個(gè)基于51單片機(jī)的輕量級(jí)任務(wù)調(diào)度程序 [打印本頁(yè)]

作者: zenghl    時(shí)間: 2025-2-16 15:06
標(biāo)題: 一個(gè)基于51單片機(jī)的輕量級(jí)任務(wù)調(diào)度程序
以下是一個(gè)基于51單片機(jī)的輕量級(jí)任務(wù)調(diào)度程序?qū)崿F(xiàn),采用時(shí)間片輪詢方式,具有以下特點(diǎn):

1. 支持多任務(wù)獨(dú)立周期設(shè)置
2. 無(wú)阻塞設(shè)計(jì)
3. 精確的定時(shí)器控制
4. 低資源占用
5. 實(shí)時(shí)性良好

#include <reg52.h>
#include <intrins.h>

#define MAX_TASKS 4       // 最大任務(wù)數(shù)量
#define TIMER_RELOAD 1000 // 1ms定時(shí)器重裝值(12MHz晶振)

// 任務(wù)控制塊結(jié)構(gòu)體
typedef struct {
    void (*TaskHook)(void); // 任務(wù)函數(shù)指針
    uint16_t Interval;      // 執(zhí)行間隔(ms)
    uint16_t Counter;       // 間隔計(jì)數(shù)器
    uint8_t RunFlag;        // 任務(wù)執(zhí)行標(biāo)志
} TaskControlBlock;

// 任務(wù)列表聲明
TaskControlBlock TaskList[MAX_TASKS] = {0};
uint8_t TaskCount = 0;      // 實(shí)際注冊(cè)的任務(wù)數(shù)

// 定時(shí)器初始化
void Timer0_Init(void)
{
    TMOD &= 0xF0;     // 設(shè)置定時(shí)器模式
    TMOD |= 0x01;     // T0 16位定時(shí)器模式
    TH0 = (65536 - TIMER_RELOAD) / 256;
    TL0 = (65536 - TIMER_RELOAD) % 256;
    ET0 = 1;          // 使能定時(shí)器中斷
    TR0 = 1;          // 啟動(dòng)定時(shí)器
    EA = 1;           // 總中斷使能
}

// 任務(wù)注冊(cè)函數(shù)
uint8_t Task_Create(void (*task)(void), uint16_t interval)
{
    if(TaskCount >= MAX_TASKS) return 0;

    TaskList[TaskCount].TaskHook = task;
    TaskList[TaskCount].Interval = interval;
    TaskList[TaskCount].Counter = 0;
    TaskList[TaskCount].RunFlag = 0;
    TaskCount++;

    return 1;
}

// 定時(shí)器中斷服務(wù)程序
void Timer0_ISR(void) interrupt 1
{
    static uint8_t i;

    // 定時(shí)器重裝載
    TH0 = (65536 - TIMER_RELOAD) / 256;
    TL0 = (65536 - TIMER_RELOAD) % 256;

    // 更新任務(wù)計(jì)數(shù)器
    for(i = 0; i < TaskCount; i++) {
        if(++TaskList[i].Counter >= TaskList[i].Interval) {
            TaskList[i].Counter = 0;
            TaskList[i].RunFlag = 1;
        }
    }
}

// 任務(wù)調(diào)度執(zhí)行函數(shù)
void Task_Process(void)
{
    uint8_t i;

    while(1) {
        for(i = 0; i < TaskCount; i++) {
            if(TaskList[i].RunFlag) {
                TaskList[i].RunFlag = 0;
                TaskList[i].TaskHook(); // 執(zhí)行任務(wù)
            }
        }
        // 此處可添加低功耗模式
        // PCON |= 0x01; // 進(jìn)入空閑模式
        // _nop_();
    }
}

/******************** 使用示例 ********************/
void Task1(void)
{
    // 任務(wù)1代碼(執(zhí)行周期10ms)
}

void Task2(void)
{
    // 任務(wù)2代碼(執(zhí)行周期50ms)
}

void main(void)
{
    Timer0_Init();

    // 創(chuàng)建任務(wù)
    Task_Create(Task1, 10);  // 10ms周期任務(wù)
    Task_Create(Task2, 50);  // 50ms周期任務(wù)

    // 啟動(dòng)任務(wù)調(diào)度
    Task_Process();
}
```

代碼說(shuō)明:

1. 定時(shí)器配置:
- 使用定時(shí)器0,16位自動(dòng)重裝載模式
- 1ms定時(shí)中斷基準(zhǔn)(基于12MHz晶振)
- 中斷服務(wù)程序中維護(hù)任務(wù)計(jì)數(shù)器

2. 任務(wù)管理:
- 采用TaskControlBlock結(jié)構(gòu)管理任務(wù)
- 支持動(dòng)態(tài)任務(wù)注冊(cè)(需在系統(tǒng)初始化時(shí)完成)
- 每個(gè)任務(wù)獨(dú)立維護(hù)自己的計(jì)數(shù)器

3. 執(zhí)行控制:
- 中斷服務(wù)程序僅設(shè)置執(zhí)行標(biāo)志
- 主循環(huán)輪詢執(zhí)行就緒任務(wù)
- 任務(wù)函數(shù)在非中斷環(huán)境下執(zhí)行

4. 實(shí)時(shí)性保障:
- 中斷服務(wù)程序執(zhí)行時(shí)間極短(<50us)
- 任務(wù)執(zhí)行間隔誤差<1ms
- 無(wú)阻塞設(shè)計(jì),任務(wù)間相互獨(dú)立

使用注意事項(xiàng):

1. 任務(wù)函數(shù)應(yīng)遵循以下原則:
   - 執(zhí)行時(shí)間盡可能短
   - 避免使用阻塞延時(shí)
   - 禁止在任務(wù)中關(guān)閉中斷

2. 定時(shí)器基準(zhǔn)設(shè)置:
   - 根據(jù)實(shí)際晶振頻率調(diào)整TIMER_RELOAD值
   - 計(jì)算公式:TIMER_RELOAD = 65536 - (Fosc/12/1000)

3. 任務(wù)周期范圍:
   - 最小周期:1ms
   - 最大周期:65535ms

4. 擴(kuò)展建議:
   - 可添加任務(wù)優(yōu)先級(jí)機(jī)制
   - 可增加任務(wù)掛起/恢復(fù)功能
   - 可結(jié)合看門狗確保系統(tǒng)可靠性

該調(diào)度程序在STC89C52RC單片機(jī)實(shí)測(cè)中,任務(wù)調(diào)度抖動(dòng)小于50us,可滿足大多數(shù)嵌入式實(shí)時(shí)控制需求。


作者: lzzasd    時(shí)間: 2025-2-16 19:21
能不能介紹下任務(wù)掛起/恢復(fù)功能的實(shí)現(xiàn)??

作者: Lthrwy    時(shí)間: 2025-2-20 08:50
我用51做了一個(gè)小程序,其中有小燈在C端口在不同狀態(tài)按1秒閃爍或長(zhǎng)亮,但是在使用時(shí),A端口按鍵按下讓B,D端口輸出高低電平后,閃爍的時(shí)間變長(zhǎng)了,
作者: Lthrwy    時(shí)間: 2025-2-20 10:07
大佬,我用51寫了一個(gè)小程序,A端口小燈根據(jù)按鍵2的按下以1秒間隔閃爍(用定時(shí)器),但是在按下按鍵1,讓另外的端口B,C一個(gè)輸出高電平,一個(gè)輸出低電平之后,閃爍的間隔變得很長(zhǎng),是什么原因




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91精品国产综合久久香蕉麻豆 | аⅴ资源新版在线天堂 | 国产女人叫床高潮大片免费 | 久久久久一区二区三区四区 | 在线视频 亚洲 | 欧美日韩中文字幕 | 午夜成人免费视频 | 中文字幕精品视频在线观看 | www4虎| 嫩草视频入口 | 亚洲精品高清视频在线观看 | 欧美www在线观看 | 久久精品一区二区三区四区 | 亚洲午夜精品视频 | 成人欧美一区二区 | 91精品国产综合久久福利软件 | 午夜精品一区 | 国产成人久久av免费高清密臂 | 日韩欧美字幕 | 欧美九九九 | 日日夜夜视频 | 黄视频网址 | 精品国产91亚洲一区二区三区www | 在线观看免费av网 | 欧美一区二区在线观看视频 | 中文字幕av免费 | a级毛片基地 | 成人一区二区在线 | 国产精品色婷婷久久58 | 成人在线播放网站 | 精品久久九 | 免费观看黄色片视频 | 精品视频成人 | 黄网站免费在线观看 | 成人在线播放网站 | av毛片| 免费观看一级黄色录像 | 99久久精品免费看国产免费软件 | 99这里只有精品视频 | 日本精品一区二区三区在线观看 | 亚洲视频区|