stm32 简单多任务调度

stm32 简单多任务调度

ID:1210049

大小:58.50 KB

页数:5页

时间:2017-11-08

stm32 简单多任务调度_第1页
stm32 简单多任务调度_第2页
stm32 简单多任务调度_第3页
stm32 简单多任务调度_第4页
stm32 简单多任务调度_第5页
资源描述:

《stm32 简单多任务调度》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、STM32简单多任务调度 STM32的开发目前大多数还开处于“裸奔”的阶段,处于开发成本的考虑,可能还未嵌入任何的RTOS系统,由于没有操作系统的支持,因而不能方便的对多任务进行调度和管理,在main函数中你可能会写成如下方式:[cpp] viewplaincopy1.int main(void)  2.{  3.    while (1)  4.    {  5.        Task1(); // 调用任务1  6.        Task2(); // 调用任务2  7.    }  8.}    

2、    但简单这样写的话会存在一个问题,假如任务1是一个很紧急的任务,如AD采样任务,需要不断的去执行,而任务2是一个不太紧急的任务,只要保证一段时间执行一次就行(如控制LED灯闪烁,只需要每1s钟闪烁一次),这样的话一是频繁的调用任务2占用了任务1执行的时间,二是任务2根本不需要这样频繁的执行,白白耗费了CPU的处理。因此可以考虑实现一个调度策略来解决这个问题。对于每个任务,我们可以定义这样一个结构:[cpp] viewplaincopy1.typedef struct{  2.      void (*

3、fTask)(void);  3.      int64u uNextTick;  4.      int32u uLenTick;  5.}sTask;         其中fTask为任务指针,指向具体的任务,uNextTick为该任务下一次执行的时间,uLenTick为任务的调度周期或叫调度频率,即每隔多长时间执行一次。       按照这个结构,可以预先定义一个结构体数组,然后将要调用的任务和任务的调度时间按照如下方式罗列出来:[cpp] viewplaincopy1.// 任务列表  2.stat

4、ic sTask mTaskTab[] =   3.{  4.     {Task_SysTick,    0, 0}  5.    ,{Task1,           0, 10}    // 10ms执行一次  6.    ,{Task2,           0, 200}   // 200ms执行一次     7.};          其中第一个任务Task_SysTick为计算系统时间的任务,用以获取上电后运行的时间(Task_SysTick任务相关代码附在文章后面)。这里默认任务下一次执行的

5、时间为0,在main函数中,不断的轮询这个数组,然后将当前任务的下一次调用时间和当前时间比较,如果发现轮到该任务执行,就执行该任务,执行完成后,将该任务的下一次执行时间设为当前时间加任务的调度时间,然后按照此方法去执行下一个需要执行的任务,代码如下:[cpp] viewplaincopy1.while (1)  2.{  3.    // 任务循环  4.    for (i = 0; i < ARRAYSIZE(mTaskTab); i++)  5.    {  6.        if (mTaskTa

6、b[i].uNextTick <= GetTimingTick())  7.        {  8.            mTaskTab[i].uNextTick += mTaskTab[i].uLenTick;  9.            mTaskTab[i].fTask();      10.        }  11.    }  12.}          这样,就可以对多个任务做一个简单的调度,以后添加任务时只需要在mTaskTab表中添加即可,需要强调的是,由于执行每个任务也需要耗费时

7、间,就会导致一个任务的实际调度周期可能会比设定的调度周期要长,这样会存在时间不准的情况,当然这仅仅是适合于对轮询周期不是很严格的任务,如果想要任务在严格的时间周期内执行或者需要更精确的时间处理,则必须采用定时器的方式了。附:       完整的main文件代码:[cpp] viewplaincopy1.#ifndef ARRAYSIZE  2.#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))  3.#endif  4.  5.// 任务结构  6.typed

8、ef struct{  7.      void (*fTask)(void);  8.      u64 uNextTick;  9.      u32 uLenTick;  10.}sTask;  11.  12.  13.// 任务列表  14.static sTask mTaskTab[] =   15.{  16.     {Task_SysTick,    0, 0}  17.    ,{Task1,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。