0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32任务调度和管理

汽车玩家 来源:CSDN 作者:CSDN 2021-07-23 09:22 次阅读

STM32F103ZE的AHB时钟为72MHz,通过HSE的8M倍频到72M,然后APB1预分频系数为2,所以TIM2-7时钟为2*36M。由于定时器是16位,PSC寄存器最大为65536,不支持71999,所以只能以0.1ms计数。

整个系统在获取时间的累增时,定义64位变量,即可运行很久的时间,不用担心溢出或者死机。定义64位变量有2个方法,一就是用long long 直接定义,通过sizeof测试为8个字节;二就是利用”stdint.h”,typedef uint64_t u64。

一般情况下,定时器计时结果算法公式为:Tout = (ARR+1)(PSC+1)/Tclk。Tclk即为时钟频率。

准备工作

  • 1)建立一个struct

typedef struct{

void (*fTask)(void);

u32 uNextTick;

u32 uLenTick;

}sTask;

1

2

3

4

5

  • 2)任务列表

static sTask mTaskTab[] =

{

{Task_SysTick, 0, 0} ,

{Task1, 0, 100} , // 10ms执行一次

{Task2, 0, 200} // 200ms执行一次

};

1

2

3

4

5

6

  • 3)初始化定时器

void TaskTimer_Init()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = 65535;

TIM_TimeBaseStructure.TIM_Prescaler = 7199;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_SetCounter(TIM2, 0);

/* TIM enable counter */

TIM_Cmd(TIM2, ENABLE);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

  • 4)获取启动后时间

u64 GetTimingTick()

{

return TimingTick;

}

1

2

3

4

  • 5)任务执行期间获取系统时间

在这里插入void Task_SysTick()

{

u32 temp = TIM_GetCounter(TIM2);

if(temp > 10000)

{

TIM_SetCounter(TIM2,0);

TimingTickHold = TimingTickHold + temp;

temp = 0;

}

TimingTick = temp + TimingTickHold;

}

1

2

3

4

5

6

7

8

9

10

11

运行实例

#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0]))

static sTask mTaskTab[] =

{

{Task_SysTick, 0, 0},

{DATA_HANDLE, 0, 500},//50ms

{Key_Scan, 0, 500}

};

while(1)

{

for(int i = 0;i < ARRAYSIZE(mTaskTab);i++ )

{

if(mTaskTab[i].uNextTick <= GetTimingTick() )

{

mTaskTab[i].uNextTick += mTaskTab[i].uLenTick;

mTaskTab[i].fTask();

}

}

}

文章整合自:CSDN

编辑:ymf

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112040
  • 时钟频率
    +关注

    关注

    0

    文章

    48

    浏览量

    20189
  • HSE
    HSE
    +关注

    关注

    0

    文章

    16

    浏览量

    9347
收藏 人收藏

    评论

    相关推荐

    智慧园区安全调度管理都有哪些

    园区当中极为重要的一点,安全调度也格外的受大家重视。 今天,古河云科技小编就来给大家说一说智慧园区安全调度管理都有哪些: 指挥调度平台涵盖了设备告警、快速定位、人员
    的头像 发表于 04-28 15:13 11次阅读
    智慧园区安全<b class='flag-5'>调度</b><b class='flag-5'>管理</b>都有哪些

    STM32F103VE运行的STM32CubeMX生成的freertos工程,FreeRTOS堆栈设置导致任务不执行切换怎么解决?

    TASK1任务堆栈更改为128的话,就不执行任务切换,只有TASK1的任务在运行 代码如下 #define START_TASK_PRIO 1 #define START_STK_SIZE128
    发表于 04-26 07:51

    STM32F103 FreeRTOS任务调度异常的原因?

    ) { vTaskDelay(500); //延时函数(任务调度) printf(\"Task1rn\");//串口打印 } } void Task2_Task(void
    发表于 04-16 06:24

    FreeRTOS任务调度器的三种调度算法讲解(下)

    配置如下时,调度算法就会变成不带时间片的抢占式调度
    的头像 发表于 03-21 13:46 609次阅读
    FreeRTOS<b class='flag-5'>任务</b><b class='flag-5'>调度</b>器的三种<b class='flag-5'>调度</b>算法讲解(下)

    FreeRTOS调度器中的三种调度算法实践(上)

    在优先级高于运行态任务任务进入就绪态时,调度器立即让这个高优先级的任务“抢占”运行态任务。被抢占意味着
    发表于 03-21 13:45 99次阅读
    FreeRTOS<b class='flag-5'>调度</b>器中的三种<b class='flag-5'>调度</b>算法实践(上)

    鸿蒙开发【分布式任务调度】解析

    1.FA 迁移可以打通设备间的壁垒,有助于不同能力的设备进行互助。前文以一个简单的例子介绍如何通过分布式任务调度提供的能力,实现 FA 跨设备的迁移(包括 FA 启动及状态数据的同步)。 2.FA
    的头像 发表于 01-29 18:03 360次阅读

    鸿蒙OS 分布式任务调度

    鸿蒙OS 分布式任务调度概述 在 HarmonyO S中,分布式任务调度平台对搭载 HarmonyOS 的多设备构筑的“超级虚拟终端”提供统一的组件
    的头像 发表于 01-29 16:50 241次阅读

    鸿蒙原生应用/元服务开发-延迟任务说明(一)

    添加到执行队列,系统会根据内存、功耗、设备温度、用户使用习惯等统一调度拉起应用。 二、运行原理 图1 延迟任务实现原理 应用调用延迟任务接口添加、删除、查询延迟任务,延迟
    发表于 01-16 14:57

    FreeRTOS中的任务管理

    任务是 FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,优先级高的任务
    的头像 发表于 11-27 17:03 405次阅读

    基于FreeRTOS的STM32F103系统—内存管理任务调度

    虽然现在的单片机系统,CPU的资源并不是那么紧缺了,也有丰富的内存空间,但是我们还是要积极地实现内存管理,这可以帮我们减少内存资源的占用,优化程序,提高效率。
    的头像 发表于 11-13 11:08 717次阅读
    基于FreeRTOS的<b class='flag-5'>STM32</b>F103系统—内存<b class='flag-5'>管理</b>及<b class='flag-5'>任务</b><b class='flag-5'>调度</b>

    野火stm32+UCOS+LED1(单任务)

    电子发烧友网站提供《野火stm32+UCOS+LED1(单任务).rar》资料免费下载
    发表于 11-03 11:34 7次下载
    野火<b class='flag-5'>stm32</b>+UCOS+LED1(单<b class='flag-5'>任务</b>)

    Crontab:简单实用的Python 周期任务调度工具

    ,Crontab 的 管理就会特别不方便 。 还有一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。 在你想要使用一个轻量级
    的头像 发表于 11-01 09:40 374次阅读

    Schedule:简单实用的 Python 周期任务调度工具

    。 ** ** 2.当需要执行的定时任务有上百个的时候,Crontab的 管理就会特别不方便 。 ** 另外一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery
    的头像 发表于 10-30 11:18 295次阅读

    嵌入式系统中时间片的任务调度方式的优点是什么?

    嵌入式系统中时间片的任务调度方式的优点是什么
    发表于 10-20 06:48

    RTOS应用中的调度策略

    在RTOS中,协同调度是基于优先级的非抢占调度方法。任务按优先级排序,并且是事件驱动类型的,一旦正在运行的任务完成,或者任务主动调用OS服务
    的头像 发表于 05-29 09:19 389次阅读
    RTOS应用中的<b class='flag-5'>调度</b>策略