多任务编程解析

上传人:我** 文档编号:118358970 上传时间:2019-12-14 格式:PPTX 页数:14 大小:145.33KB
返回 下载 相关 举报
多任务编程解析_第1页
第1页 / 共14页
多任务编程解析_第2页
第2页 / 共14页
多任务编程解析_第3页
第3页 / 共14页
多任务编程解析_第4页
第4页 / 共14页
多任务编程解析_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《多任务编程解析》由会员分享,可在线阅读,更多相关《多任务编程解析(14页珍藏版)》请在金锄头文库上搜索。

1、三种编程方式 While(1)大循环 定时器 中断编程 多任务编程 While(1)大循环 void main() 初始化(initialize bulabula.) while(1) 查询判断键值 数据处理 显示 定时器 中断编程 void main() 初始化(initialize bulabula.) while(1); 定时器中断 刷新显示,重复性事件处理 按键中断 判断键值,一次性处理 多任务编程 目的:通过某种方法,让处理器的多个任务,比如:按键扫描任 务、刷新显示任务、其他周期性处理任务。在宏观上看,是并行 运行,互不干扰。 void tsk1() led1=led1; tsk1

2、_time=10; void tsk2() led2=led2; tsk2_time=20; void tsk3() led3=led3; tsk3_time=100; void tsk_sw() if(tsk1_time=0) tsk1(); if(tsk2_time=0) tsk2(); if(tsk3_time=0) tsk3(); void main() timer_initilaze(); while(1) tsk_sw(); timer_interrupt () tsk1_time-; tsk2_time-; tsk3_time-; 周期为T的定时器初始化 10T执行一次 20T执

3、行一次 100T执行一次 void tsk1() led1=led1; tsk1_time=10; void tsk2() led2=led2; tsk2_time=20; void tsk3() led3=led3; tsk3_time=100; void tsk1() while(1) do sth; delay(10*T); void tsk2() while(1) do sth; delay(20*T); void tsk3() while(1) do sth; delay(100*T); void tsk2() switch(step2) case 0: step2=1; 步骤1 b

4、reak; case 1: step2=0; 步骤2 break; tsk2_time=10; void tsk1() switch(step1) case 0: step1=1; tsk1_time=20; 初始化 break; case 1: step1=1; tsk1_time=10; 循环刷新 break; Tsk1() 初始化 delay(20*T) while(1) 循环刷新 delay(10*T) Tsk2() while(1) 步骤1 delay(10*T) 步骤2 delay(10*T) Tsk2() while(1) step1 delay(n1*T) #define TS

5、K_MAX 10 /任务最大个数 typedef void (*FUNC)(int* step); /任务函数指针 typedef struct unsigned charFLAG; /任务存在标志位,1任务存在,0 FUNC func; intCNT; /节拍计数器 int step; /步骤计数器 TSK; /任务参数结构体 TSKtskTSK_MAX; unsigned char tsk_cnt;/任务计数器 void TSK_STEP_Init() /节拍时钟初始化 1ms为节拍 TA0CCTL0 = CCIE; / CCR0 interrupt enabled TA0CCR0 = 3

6、2; TA0CTL = TASSEL_ACLK + MC_UP + TACLR; / SMCLK, upmode, clear TAR void TSK_CLEAR() /任务清零 unsigned char i; for(i=0;iFLAG=0; tsk-func=0; tsk-CNT=0; tsk-step=0; void delay_step(int time) /节拍延时函数等价于将该任务的节拍计数器CNT置为N tsktsk_cnt.CNT=time; void TSK_SW() /从优先级最高的任务(第0个任务)到优先级最低的任务(第TSK_MAX-1个任务)依次扫描, /若该任务

7、存在(FLAG=1),同时该任务的节拍计数器CNT=0,调用该任务的回调函数。 for(tsk_cnt=0;tsk_cntTSK_MAX;tsk_cnt+) if(tsktsk_cnt.FLAG) if(tsktsk_cnt.CNT=0) tsktsk_cnt.func( #pragma vector=TIMER0_A0_VECTOR _interrupt void TSK_STEP(void) /节拍定时器 /将所有存在的任务的节拍计数器减1. unsigned char i; for(i=0;iTSK_MAX;i+) if(tski.FLAG) tski.CNT-; if(tski.CNT

8、=0) void main(void) TSK_Init(); register_TSK(led_tsk,1); register_TSK(key4x4_tsk,3); register_TSK(lcd_tsk,7); _EINT(); while(1) TSK_SW(); void KEY4x4_ISR() uint keyvalue=IORD(KEY_BASE,0); switch(keyvalue) case 0 x11: do sth; break; case 0 x12: do sth; break; . default:; void key4x4_tsk(int *step) if

9、(P3IFG KEY4x4_ISR(); delay_step(50); void Interface_Reflesh(int *step) switch(*step) case 0: 刷新第一排; (*step)+; break; case 1: 刷新第二排; (*step)+; break; case 2: 刷新第三排; (*step)+; break; case 3: 刷新第四排; (*step)=0; break; void lcd_tsk(int* step) Interface_Reflesh(step); delay_step(100); 按键采用定时 查询标志位的 方法获得键值 ,不需要采用 中断。 刷新整个屏幕 用时过长,超 过一个时钟节 拍,因此将整 屏分成多块分 步显示 注意事项: 该多任务编程并不是实时处理的,实时性很低。 注意任务的每个step耗时不要超过节拍周期; 若某个step耗时超过节拍周期,那么它出现的频率应该尽量低。 可以建立一个优先级最低的空闲任务,用于测量cpu的利用率。 进阶: 现有的操作系统就是基于多任务编程的原理设计的。建议阅读了解 ucosII操作系统源码,系统理解任务类型、任务调度、任务间信息传递 和任务互锁等知识。 该书的电子版 群共享提供下载。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号