基于HAL库的简单任务调度

您所在的位置:网站首页 stm32多任务 基于HAL库的简单任务调度

基于HAL库的简单任务调度

2024-07-16 08:02:30| 来源: 网络整理| 查看: 265

在 STM32开 发初期,由于单片机只能单线程工作,所以大多数都是单纯的在 while 循环中跑程序。这种方式在一些简单的,对时钟要求不高的系统中还好,对于多任务的,时间要求比较高的任务就显得效率低下,不方便管理和调度了。

比如以一个系统中的两个任务,任务1是 ADC 采集,任务2是 LED 闪烁控制。ADC采集需要不断的执行,而 LED 闪烁控制只需要 1S 切换一次。如果使用简单的 while 循环,频繁的调用任务2,不只占用了任务1执行的时间。而且任务2,也不需要这样频繁的调用。为了解决这个问题,这个时候就要使用一种调度策略了。

以 STM32L151CBU6 为例,其AHB时钟频率为 32 MHz,TIM2~TIM5 的时钟频率在 32MHz。因为 PSC 寄存器和 ARR 寄存器都是 16 位的,所以值最大可以为 65535 。开启定时器中断,以 10ms 为单位计数,设置PSC寄存器值为 3200 - 1,ARR寄存器值为 100 - 1。

定时器计时间算法公式为:Tout = (ARR+1)(PSC+1) / Tclk。Tclk是时钟频率。

生成工程文件,建立一个任务 struct。

typedef struct {         void (*fTask)(void); //任务指针         uint64_t uNextTick; //任务下一次执行的时间         uint64_t uLenTick; //任务调度周期 }sTask;

按照这个结构,定义一个任务的结构体,把将要进行的任务和调度的时间罗列出来,建立任务列表。

sTask mTaskTab[] ={ //任务列表         {Task1, 0, 10}, //每隔100ms执行一次         {Task2, 0, 20}, //每隔200ms执行一次         {Task3, 0, 50} //每隔500ms执行一次 };

然后在主循环中一直轮询这个数组,把当前时间和下次任务执行的时间进行比较,如果到了执行时间就执行这个任务,同时设置下一次执行的时间。

#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) //获取数组长度 uint64_t GetTimingTick(void) { return g_TimingTick; } void SystemTaskScheduling(void) //进行任务调度 {         for(uint8_t i = 0; i < ARRAYSIZE(mTaskTab); i ++)          {                 if(mTaskTab[i].uNextTick


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭