由于經常涉及到單片機開發,所以需要一個能夠跑多任務的程序框架,用操作系統有點兒浪費資源,用普通線程方式又不能執行多任務,所以采取分時復用的方式,來跑多任務。
寫一個范本為以后開發服務。
單片機源程序如下:
- #include "common.h"
- /**************************************************************************************
- * Variable definition
- **************************************************************************************/
- static TASK_COMPONENTS TaskComps[] =
- {
- {0, 60, 60, TaskDisplay}, // 顯示時鐘
- {0, 20, 20, TaskKeySan}, // 按鍵掃描
- {0, 500, 500, TaskDispStatus}, // 顯示工作狀態
- {0, 0, 0, TaskKeyProcess}, // 按鍵處理任務
- // 這里添加你的任務。。。。
- };
- void main(void)
- {
- WDT_Config(); //初始化看門狗
- TaskInit(); //任務端口資源初始化
- Timer0Init(); //系統時間片管理器初始化
- while(1)
- {
- WDT_CLR(); //喂狗
- TaskProcess(); //任務處理函數
- if(keyup_data!=0) //有按鍵按下需要進行處理
- TaskComps[3].Run = 1;
- }
- }
- void Timer0Init(void) //1毫秒@24.000MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x30; //設置定時初值
- TH0 = 0xF8; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //開啟定時器0中斷
- EA = 1;
- }
- /**************************************************************************************
- * FunctionName : TimerInterrupt()
- * Description : 定時中斷服務函數
- * EntryParameter : None
- * ReturnValue : None
- **************************************************************************************/
- void Timer0_Interrupt() interrupt 1
- {
- uint8 i;
- for (i=0; i<TASK_NUM; i++) // 逐個任務時間處理
- {
- if (TaskComps[i].Timer) // 時間不為0
- {
- TaskComps[i].Timer--; // 減去一個節拍
- if (TaskComps[i].Timer == 0) // 時間減完了
- {
- TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復計時器值,從新下一次
- TaskComps[i].Run = 1; // 任務可以運行
- }
- }
- }
- }
- /**************************************************************************************
- * FunctionName : WDT_Config()
- * Description : 看門狗配置
- * EntryParameter : None
- * ReturnValue : None
- **************************************************************************************/
- void WDT_Config(void)
- {
- WDT_CONTR = 0x04; //看門狗定時器溢出時間計算公式: (12 * 32768 * PS) / FOSC (秒)
- //設置看門狗定時器分頻數為32,溢出時間如下:
- //11.0592M : 1.14s
- //18.432M : 0.68s
- //20M : 0.63s
- //24M : 0.52s
- WDT_CONTR |= 0x20; //啟動看門狗
- }
- /**************************************************************************************
- * FunctionName : TaskProcess()
- * Description : 任務處理
- * EntryParameter : None
- * ReturnValue : None
- **************************************************************************************/
- void TaskProcess(void)
- {
- uint8 i;
- for (i=0; i<TASK_MAX; i++) // 逐個任務時間處理
- {
- if (TaskComps[i].Run) // 時間不為0
- {
- TaskComps[i].TaskHook(); // 運行任務
- TaskComps[i].Run = 0; // 標志清0
- }
- }
- }
復制代碼
所有資料51hei提供下載:
42 程序框架.rar
(168.62 KB, 下載次數: 72)
2019-12-24 22:00 上傳
點擊文件名下載附件
51分時復用程序框架 下載積分: 黑幣 -5
|