首页 > 编程知识 正文

单片机 时间片轮询 架构,单片机轮询程序实验报告

时间:2023-05-06 21:32:31 阅读:182144 作者:4120

Author :家里有仙妻谢wzdhs

Date:2021/2/3

学一件事一定要学总结。 学习单片机也不例外。 总结了用单片机做项目时的代码框架,在这里写下自己的成长过程,也分享给大家参考!

首先,在本程序中结合移植,针对不同的MCU等差异,声明必要的修正如下。 1 .中断服务函数Timer1Callback (; 2 .主函数中timer_1_enable(32768/10,Timer1Callback ); //我处中断100ms一次,做实验参数32768表示1S,我处32768/10表示100ms。 虽然速度已经很慢了,但是为了兼容打印,事件没有实际的任务,所以速度太快了,打印跟不上。 在实际操作中,可以缩短中断时间,但不能太短。 频繁的中断会降低效率。 3 .我们在这里测试了10项任务同时运行,如果每项任务的运行时间小于该任务设置的时间,将会达到预期的效果。 //时间片体系结构测试voidtask1(void ); voidtask2) void; voidtask3) void; voidtask4) void; voidtask5) void; voidtask6) void; voidtask7) void; voidtask8) void; void任务9 (void; voidtask0(void;/* * * * * * * * * * * * * * * * * * * * * * * * 1:运行状态标志位:0-不运行; 1-开车。 * 2:计数器timercountdown----*:计数器数值填充器,缺省初始值:TimerInitialValue任务执行间隔* 4:任务对应的函数指针* * * * * * uint8_t TimerInitialValue; void(*taskhook ) ) void; }TaskStruct;/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * define timertask 550 # define timertask 660 # define timertask 880 # define timertask 990 # define timertask 0100 statictaskstructaskmank timertask {InitStatus,TimerTask2,TimerTask2,Task2}、{InitStatus,TimerTask3,timertask3}、{InitStatus,timertask2} Task5}、{InitStatus,TimerTask6,TimerTask6,Task6}、{InitStatus,TimerTask7,TimerTask7,Task7}、{ init status } 请参阅。 请参阅。 请参阅。 ();/* * * * * * * * * * * * * * * * * * * * * * * * * * * 1: list task1*

2:ListTask2* ...* N:ListTasksMax:总的可供分配的定时任务数目**************************************************************************************/typedef enum _TaskList{ ListTask1, ListTask2, ListTask3, ListTask4, ListTask5, ListTask6, ListTask7, ListTask8, ListTask9, ListTask0, /* 这里添加需要的任务。。。。 */ ListTasksMax}TaskList;/*************************************************************************************** FunctionName : TaskMarks()* Description : 标志位处理函数* EntryParameter : None* ReturnValue : None这个函数是用来更新每个任务的计数器以及它们的运行标志位的,它是写在单片机的定时器中断服务函数中的**************************************************************************************/void TaskMarks(void){uint8_t i;for (i=0;i<ListTasksMax;i++)//逐个任务时间处理{if(TaskManage[i].TimerCountdown)//计数器不为0{TaskManage[i].TimerCountdown--; //计数器减去一个节拍if(TaskManage[i].TimerCountdown == 0)//计数器数值减完了{TaskManage[i].TimerCountdown = TaskManage[i].TimerInitialValue;//恢复计时器值,重新下一次TaskManage[i].RunningStatus = 1;//任务可以运行}}}}/*************************************************************************************** FunctionName : TaskMarks()* Description : 任务处理函数* EntryParameter : None* ReturnValue : None这个函数用来判断任务是否到了执行时间,它会逐个检查任务列表中的任务如果到了就执行,同时清空执行标志位,没到就不执行**************************************************************************************/void TaskProcess(void){uint8_t i;for (i=0;i<ListTasksMax;i++) // 逐个任务时间处理{if (TaskManage[i].RunningStatus) // 时间不为0{TaskManage[i].TaskHook(); // 运行任务TaskManage[i].RunningStatus = 0; // 标志清0}}}/*************************************************************************************** FunctionName : Task1()/Task2()/Task3()/Task4()...* Description : 任务函数* EntryParameter : None* ReturnValue : None**************************************************************************************/void Task1(void){dbg_printf("Task1rn");}void Task2(void){dbg_printf("Task2rn");}void Task3(void){dbg_printf("Task3rn");} void Task4(void){dbg_printf("Task4rn");} void Task5(void){dbg_printf("Task5rn");}void Task6(void){dbg_printf("Task6rn");}void Task7(void){dbg_printf("Task7rn");}void Task8(void){dbg_printf("Task8rn");}void Task9(void){dbg_printf("Task9rn");}void Task0(void){dbg_printf("Task0rn");}/*************************************************************************************** FunctionName : Timer1Callback()* Description : 定时中断服务函数,回调函数* EntryParameter : None* ReturnValue : None**************************************************************************************/static void Timer1Callback(void){TaskMarks();}/*************************************************************************************** FunctionName : main()* Description : 主函数* EntryParameter : None* ReturnValue : None**************************************************************************************/int main(void){All_Initialize();timer_1_enable(32768/10,Timer1Callback);//我这里用的是100ms中断一次来做实验while(1){TaskProcess();// 任务处理}}总结:整个程序的执行流程就是:中断函数不断刷新着每一个任务的状态,任务处理函数根据这些状态来判断哪些函数要被执行,如果要执行,就立马执行。添加任务就是在任务数组中添加一个结构体信息,编写一个任务函数,在任务列表中添加一个函数。基本思想:举个例子,有一个函数A,我们给它设置一个计数器B(程序多久执行一次)和一个状态标志位C(用来判断这个程序是否需要执行)还有一个计数填充值D,其中的B会被单片机自带的定时器中断服务函数不断地刷新(递减刷新),当B到0的时候C会被置位,同时B会被重新填满D值,当主程序运行到A的时候不会直接去运行它,而是先检查C,如果C没有被置位,说明还没有到A的执行时间,不执行A,如果C被置位了,就执行A,执行完后将C复位,让C再等上一段时间才再次被执行。

这个是记录自己学习的过程!
感谢您的支持!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。