历史上的今天
返回首页

历史上的今天

今天是:2025年04月19日(星期六)

2020年04月19日 | STM32简单任务调度的总结

2020-04-19 来源:eefocus

概述

STM32的开发目前大多数还开处于“裸奔”的阶段,处于开发成本的考虑,可能还未嵌入任何的RTOS系统,由于没有操作系统的支持,因而不能方便的对多任务进行调度和管理。而有的任务不紧急,不需要过多的时间去循环执行,因此需要一个简单的任务调度来解决这个问题。


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;


2)任务列表


static sTask mTaskTab[] =   

{  

     {Task_SysTick,    0, 0}  ,

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

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

}; 


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);  

}


4)获取启动后时间


u64 GetTimingTick()

{

   return  TimingTick;

}


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


在这里插入void Task_SysTick()

{

   u32 temp = TIM_GetCounter(TIM2);

   if(temp > 10000)

   {

      TIM_SetCounter(TIM2,0);

      TimingTickHold = TimingTickHold + temp;

      temp = 0;

   }

   TimingTick = temp + TimingTickHold;

 }


运行实例

#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();

          }

       }

}

推荐阅读

史海拾趣

Gowanda Electronics公司的发展小趣事

对于连续可调直流稳压电源电路,网友可能会有多个方面的问题,以下是一些常见问题及其解答:

一、技术原理与性能参数

  1. 问:连续可调直流稳压电源电路的工作原理是什么?
    : 连续可调直流稳压电源电路的工作原理主要是通过扩展开关电源的电压和电流容量,采用高频调制技术,将输入的交流电转换为直流电,并通过调节电路使输出电压稳定在一个可调范围内。其内部包含整流、滤波、稳压等多个环节,以提供稳定且可调的直流电压输出。

  2. 问:如何选择合适的连续可调直流稳压电源?
    : 选择连续可调直流稳压电源时,需要考虑的主要因素包括所需电压范围、电流容量、稳压精度、纹波噪声、保护功能等。同时,也需要根据应用场景考虑电源的体积、重量、散热性能等因素。

二、使用与维护

  1. 问:在使用过程中,输出电压不稳定怎么办?
    : 如果输出电压不稳定,可以首先检查电源输入电压是否稳定,使用稳压电源或变压器等辅助设备来保持输入电压的稳定。其次,检查输出端电压设置是否正确,确保输出电压值在设定范围内。最后,检查电源输出端负载是否符合规定,避免负载过重或过轻导致输出电压波动。

  2. 问:如何对连续可调直流稳压电源进行日常维护?
    : 日常维护主要包括检查电源输入输出线路的连接是否牢固,清洁电源外壳和散热风扇上的灰尘,以及定期检查电源的工作状态和性能指标。如果发现异常或故障,应及时进行处理或更换损坏的部件。

三、故障排查与解决

  1. 问:电源无法输出电压或电流怎么办?
    : 如果电源无法输出电压或电流,可以首先检查电源输入电压是否正常,电源本身是否损坏。其次,检查电源输出端连接是否正确,是否存在开路或短路的情况。最后,检查电源是否过载或短路,确保电源在正常工作范围内。

  2. 问:电源输出电压波动大怎么办?
    : 输出电压波动大可能是由于电源输入电压不稳定、输出端负载不匹配或存在电磁干扰等原因造成的。解决方法包括稳定输入电压、匹配适当的负载、检查并消除电磁干扰源等。

四、扩展与升级

  1. 问:如何扩展连续可调直流稳压电源的电压和电流范围?
    : 扩展电压和电流范围通常需要根据具体的电源设计来进行。一般来说,可以通过更换更高功率的整流管、滤波电容和稳压元件等方式来提升电源的电压和电流容量。同时,也可以通过增加并联或串联电路的方式来实现电压和电流的分档调节。

  2. 问:如何进行电路的升级和改造?
    : 电路的升级和改造需要根据实际需求和技术能力来进行。在升级过程中,需要注意保持原有电路的稳定性和可靠性,避免引入新的故障点。同时,也需要关注新技术的发展和应用,以便在升级过程中采用更先进、更高效的电路设计方案。

以上是针对连续可调直流稳压电源电路的一些常见问题及其解答。希望这些信息能够对网友有所帮助。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable非常重视客户服务工作。他们建立了完善的客户服务体系,为客户提供从产品咨询、选型、定制到售后服务的全方位支持。同时,Federal Custom Cable还积极与合作伙伴建立长期稳定的合作关系,共同推动电缆行业的发展。这种以客户需求为导向、以合作伙伴关系为基础的经营模式,为Federal Custom Cable的持续发展提供了有力保障。

European Crystal Org公司的发展小趣事

随着公司的发展,ECO逐渐在晶体技术领域取得了突破。研发团队成功开发出一种新型的高精度晶体振荡器,具有更高的稳定性和更低的功耗。这一创新产品迅速在市场上获得了广泛认可,ECO的订单量激增。同时,公司还加大了对研发的投入,不断推出新产品,满足了客户日益增长的需求。

FLIR公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

法思特(FAST)公司的发展小趣事
随着使用环境和需求的变化,可能需要对控制电路进行调整和优化,以适应新的使用条件。
BOSER公司的发展小趣事

随着科技的不断发展,BOSER公司意识到只有不断创新才能在激烈的竞争中立于不败之地。因此,公司投入大量研发资源,致力于开发具有自主知识产权的新技术。经过不懈努力,BOSER成功推出了一系列创新产品,引领了电子行业的技术发展潮流。

问答坊 | AI 解惑

今年的大学生电子竞赛题目,大学生做的出来???

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 我看了半天,要我在3天3夜做出来,不可想象。 我都3年研发经验了,而且参加过05年的电子竞赛,是天津市2等奖。 可是,看到现在的题目,我怀疑是大学生能做出来的吗??? 如果真能大学生自己做出 ...…

查看全部问答>

TL431电路的应用专题

蒙soso厚爱,在此向电路新手介绍一个tl431芯片的应用。这颗芯片本身是一个并联基准芯片,由于检测端的存在,可以衍生出很多应用。   tl431应用 [ 本帖最后由 张杰克 于 2010-6-25 18:17 编辑 ]…

查看全部问答>

讨论 WINCE5 2440 中堆和栈的分配问题

在一个线程中定义一个数组, 大小为320*240*8 定义1:U8 cData[320*240*8];   这个应该存在系统的stack里面,结果data abort失败了,提示就是stack的问题,于是重新 定义2:U8 *cData = new U8[320*240*8]  ,这个没有问题 ...…

查看全部问答>

WINCE下自带的数据库问题?

怎么在CE下数据库的.DB文件中加入数据? …

查看全部问答>

F2812断货原因

请问F2812为什么出现断货,什么时候恢复正常…

查看全部问答>

C中嵌入asm(\"SETC INTM\")编译通不过?

C中嵌入asm(\\"SETC INTM\\"编译通不过,嵌入其它语句也一样,但是asm(\\"NOP\\"没问题,请问这是怎么回事? …

查看全部问答>

Unix环境高级编程 习题

附录A   函数原型 497附录B   其他源代码 512附录C   习题答案 518…

查看全部问答>

置换 K60 塔式开发板

如题,手头上多了一套板子,139美金的那种,未拆封过,或许可以换TI的LM4F板子,可以加钱换。不过得提下,TI的M4板子似乎有点贵的,呃,相对塔式板似乎不值那么多。换等值的东西也行,暂时没想到可以换什么…

查看全部问答>