网站大量收购独家精品文档,联系QQ:2885784924

STM32 简单多任务调度.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
STM32 简单多任务调度 ? STM32的开发目前大多数还开处于“裸奔”的阶段,处于开发成本的考虑,可能还未嵌入任何的RTOS系统,由于没有操作系统的支持,因而不能方便的对多任务进行调度和管理,在main函数中你可能会写成如下方式: [cpp]?view plaincopy int?main(void)?? {?? ????while?(1)?? ????{?? ????????Task1();?//?调用任务1?? ????????Task2();?//?调用任务2?? ????}?? }?? ?????? 但简单这样写的话会存在一个问题,假如任务1是一个很紧急的任务,如AD采样任务,需要不断的去执行,而任务2是一个不太紧急的任务,只要保证一段时间执行一次就行(如控制LED灯闪烁,只需要每1s钟闪烁一次),这样的话一是频繁的调用任务2占用了任务1执行的时间,二是任务2根本不需要这样频繁的执行,白白耗费了CPU的处理。因此可以考虑实现一个调度策略来解决这个问题。对于每个任务,我们可以定义这样一个结构: [cpp]?view plaincopy typedef?struct{?? ??????void?(*fTask)(void);?? ??????int64u?uNextTick;?? ??????int32u?uLenTick;?? }sTask;?? ??????? 其中fTask为任务指针,指向具体的任务,uNextTick为该任务下一次执行的时间,uLenTick为任务的调度周期或叫调度频率,即每隔多长时间执行一次。 ??????? 按照这个结构,可以预先定义一个结构体数组,然后将要调用的任务和任务的调度时间按照如下方式罗列出来: [cpp]?view plaincopy //?任务列表?? static?sTask?mTaskTab[]?=??? {?? ?????{Task_SysTick,????0,?0}?? ????,{Task1,???????????0,?10}????//?10ms执行一次?? ????,{Task2,???????????0,?200}???//?200ms执行一次????? };?? ????????其中第一个任务Task_SysTick为计算系统时间的任务,用以获取上电后运行的时间(Task_SysTick任务相关代码附在文章后面)。这里默认任务下一次执行的时间为0,在main函数中,不断的轮询这个数组,然后将当前任务的下一次调用时间和当前时间比较,如果发现轮到该任务执行,就执行该任务,执行完成后,将该任务的下一次执行时间设为当前时间加任务的调度时间,然后按照此方法去执行下一个需要执行的任务,代码如下: [cpp]?view plaincopy while?(1)?? {?? ????//?任务循环?? ????for?(i?=?0;?i??ARRAYSIZE(mTaskTab);?i++)?? ????{?? ????????if?(mTaskTab[i].uNextTick?=?GetTimingTick())?? ????????{?? ????????????mTaskTab[i].uNextTick?+=?mTaskTab[i].uLenTick;?? ????????????mTaskTab[i].fTask();?????? ????????}?? ????}?? }??? ??????? 这样,就可以对多个任务做一个简单的调度,以后添加任务时只需要在mTaskTab表中添加即可,需要强调的是,由于执行每个任务也需要耗费时间,就会导致一个任务的实际调度周期可能会比设定的调度周期要长,这样会存在时间不准的情况,当然这仅仅是适合于对轮询周期不是很严格的任务,如果想要任务在严格的时间周期内执行或者需要更精确的时间处理,则必须采用定时器的方式了。 附: ??????? 完整的main文件代码: [cpp]?view plaincopy #ifndef?ARRAYSIZE?? #define?ARRAYSIZE(a)?(sizeof(a)?/?sizeof((a)[0]))?? #endif?? ?? //?任务结构?? typedef?struct{?? ??????void?(*fTask)(void);?? ??????u64?uNextTick;?? ??????u32?uLenTick;?? }sTask;?? ?? ?? //?任务列表?? static?sTask?mTaskTab[]?=??? {?? ?????{Task_SysTick,????0,?0}??

文档评论(0)

yyanrlund + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档