STM32_简单多任务调度_第1页
STM32_简单多任务调度_第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32简单多任务调度STM32的开发目前大多数还开处于“裸奔”的阶段,处于开发成本的考虑,可能还未嵌入任何的RTOS系统,由于没有操作系统的支持,因而不能方便的对多任务进行调度和管理,在main函数中你可能会写成如下方式:main(void)2.3.while(1)4.5.Task1();/调用任务16.Task2();/调用任务27.8.但简单这样写的话会存在一个问题,假如任务1是一个很紧急的任务,如AD采样任务,需要不断的去执行,而任务2是一个不太紧急的任务,只要保证一段时间执行一次就行(如控制LED灯闪烁,只需要每1s钟闪烁一次),这样的话一

2、是频繁的调用任务2占用了任务1执行的时间,二是任务2根本不需要这样频繁的执行,白白耗费了CPU的处理。因此可以考虑实现一个调度策略来解决这个问题。对于每个任务,我们可以定义这样一个结构:cppviewplaincopy1. typedefstruct2. void(*fTask)(void);3. int64uuNextTick;4. int32uuLenTick;5. sTask;其中fTask为任务指针,指向具体的任务,uNextTick为该任务下一次执行的时间,uLenTick为任务的调度周期或叫调度频率,即每隔多长时间执行一次。按照这个结构,可以预先定义一个结构体数组,然后将要调用的任

3、务和任务的调度时间按照如下方式罗列出来:cppviewplaincopy1. /任务列表2. staticsTaskmTaskTab=3. 4.Task_SysTick,0,05.,Task1,0,10/10ms执行一次6.,Task2,0,200/200ms执行一次7.;其中第一个任务Task_SysTick为计算系统时间的任务,用以获取上电后运行的时间(Task_SysTick任务相关代码附在文章后面)。这里默认任务下一次执行的时间为0在main函数中,不断的轮询这个数组,然后将当前任务的下一次调用时间和当前时间比较,如果发现轮到该任务执行,就执行该任务,执行完成后,将该任务的下一次执行时

4、间设为当前时间加任务的调度时间,然后按照此方法去执行下一个需要执行的任务,代码如下:cppviewplaincopy1. while(1)2. 3. /任务循环4. for(i=0;i<ARRAYSIZE(mTaskTab);i+)5. 6. if(mTaskTabi.uNextTick<=GetTimingTick()7. 8. mTaskTabi.uNextTick+=mTaskTabi.uLenTick;9. mTaskTabi.fTask();10. 11. 12. 这样,就可以对多个任务做一个简单的调度,以后添加任务时只需要在mTaskTab表中添加即可,需要强调的是,由

5、于执行每个任务也需要耗费时间,就会导致一个任务的实际调度周期可能会比设定的调度周期要长,这样会存在时间不准的情况,当然这仅仅是适合于对轮询周期不是很严格的任务,如果想要任务在严格的时间周期内执行或者需要更精确的时间处理,则必须采用定时器的方式了。附:完整的main文件代码:cppviewplaincopy1. #ifndefARRAYSIZE2. #defineARRAYSIZE(a)(sizeof(a)/sizeof(a)0)3. #endif4.4. /任务结构5. typedefstruct6. void(*fTask)(void);7. u64uNextTick;8. u32uLenT

6、ick;9. sTask;11.12.13. /任务列表14. staticsTaskmTaskTab=15. 16.Task_SysTick,0,017.,Task1,0,1018.,Task2,0,200/10ms执行一次/200ms执行一次19.20./在这之前添加任务21.;22.23.24.*FunctionName:main25.*Description:Mainprogram.26.*Input:None27.*Output:None28.*Return:None29.*30. intmain(void)31. 32. inti=0;33. /硬件初始化34. HW_init()

7、;35. /初始化系统Tick任务36. dev_SysTick_init(void);37. /.38. while(1)39. 40. /任务循环41.42.for(i=0;i<ARRAYSIZE(mTaskTab);i+)43.if(mTaskTabi.uNextTick<=GetTimingTick()44.45.mTaskTabi.uNextTick+=mTaskTabi.uLenTick;46.mTaskTabi.fTask();47.48.49.Task_SysTick任务相关代码:cppviewplaincopy1. volatileint64ug_TimingTi

8、ck=0;2. volatileint64ug_TimingTickOld=0;3.3. /=4. /【函数名称】voiddev_SysTick_init(void)5. /【参数】7. /【功8. /【返9. /【创能】值】者】初始化None2010-07-27firehood6./=voiddev_SysTick_init(void)TIM_TimeBaseInitTypeD

9、efTIM_TimeBaseStructure;/*Timebaseconfiguration*/TIM_TimeBaseStrueture.TIM_Period=65535;TIM_TimeBaseStrueture.TIM_Prescaler=36000-1;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStrueture.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStrueture);TIM_SetCounter(TIM2

10、,0);/*TIMenablecounter*/TIM_Cmd(TIM2,ENABLE);/【函数名称】voidGetTimingTick(void)【参数】【功能】获取MCU启动后的运行时间【返回值】MCU启动后的运行时间,单位ms【创建者】2010-07-27firehood/int64uGetTimingTick(void)returng_TimingTick;/【函数名称】voidTask_SysTick(void)【参数】【功能】Tick任务,从TIM2获取系统时间【返回值】None【创建者】2010-07-27firehood/voidTask_SysTick(void)int16utemp=TIM_GetCounter(TIM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论