380091044 发表于 2024-4-15 17:05:29

通过定时器周期性调度任务综合例程中的一些疑问?

本帖最后由 380091044 于 2024-4-15 17:07 编辑



typedef struct
{
        u8 Run;//任务状态:Run/Stop
        u16 TIMCount;//定时计数器
        u16 TRITime;//重载计数器
        void (*TaskHook) (void);//任务函数
} TASK_COMPONENTS;



static TASK_COMPONENTS Task_Comps[]=
{
            //状态 计数 周期任务函数名
                {0, 1,   1,   Sample_Display},/* 任务1:task 1 Period:1ms */
                {0, 10,10,Sample_MatrixKey},/*任务2: task 2 Period:10ms */
                {0, 10,10,Sample_adcKey},/* 任务3:task 3 Period:10ms */
                {0, 300, 300, Sample_NTC},/* 任务4:task 4 Period:300ms */
                {0, 500, 500, Sample_RTC},/*任务5:task 5 Period:500ms */
                /* Add new task here */
};//这里任务状态,都是0是停止状态是吗?

void Task_Marks_Handler_Callback(void)
{
      u8 i;
      for(i=0; i<Tasks_Max; i++)
      {
                if(Task_Comps.TIMCount)/* If the time is not 0 */
                {
                        Task_Comps.TIMCount--;/* Time counter decrement */
                        if(Task_Comps.TIMCount == 0)/* If time arrives */任务时间倒计时到0了,
                        {
                              /*Resume the timer value and try again*/
                              Task_Comps.TIMCount = Task_Comps.TRITime;//重载计数值
                              Task_Comps.Run = 1;/* The task can be run */开始任务运行是吗?感觉有点晕这点?                        }
                }
      }
}



void Task_Pro_Handler_Callback(void)
{
      u8 i;
      for(i=0; i<Tasks_Max; i++)
      {
                if(Task_Comps.Run)/* If task can be run */程序运行就清零,说不通?
                {
                        Task_Comps.Run = 0;/* Flag clear 0 */   //这里任务状态是0不是停止吗?下面一条,说是运行任务,是0运行,1停止吗?
                        Task_Comps.TaskHook();/* Run task */任务运行??
                }
      }
}

_奶咖君_ 发表于 2024-4-15 20:43:47

读一读代码么呗
了解一下 函数指针的知识

run 是个变量 在这里做任务函数的运行标志,
主函数中轮询所有任务的运行标志,,如果标志为1 则执行任务函数 ,然后清除掉运行标志,,

找本C语言的书看看?

乘风飞扬 发表于 2024-4-16 09:28:45

Task_Comps.Run 是当前任务是否可以执行的状态标志。
Task_Comps.Run = 1 表示当前任务执行时间已到,接下来可以运行该任务。
Task_Comps.Run = 0 表示当前任务执行时间还没到,需要继续等待。

380091044 发表于 2024-4-16 10:53:03

乘风飞扬 发表于 2024-4-16 09:28
Task_Comps.Run 是当前任务是否可以执行的状态标志。
Task_Comps.Run = 1 表示当前任务执行时间已到,接下 ...

老师:如下图:增加任务,初始状态都是0,都是等待状态,第一个任务是怎么运行起来的?刚开始所有计数都是满的,没有是0的,

乘风飞扬 发表于 2024-4-16 11:35:32

380091044 发表于 2024-4-16 10:53
老师:如下图:增加任务,初始状态都是0,都是等待状态,第一个任务是怎么运行起来的?刚开始所有计数都 ...

每个任务都是通过定时器计时判断是否到执行时间。
第一个任务执行周期最短,1ms执行一次,那么定时器计时1ms时间就会在中断里将这个任务状态置1,主循环里面判断任务状态为1后就会执行这个任务。

380091044 发表于 2024-4-17 08:45:47

乘风飞扬 发表于 2024-4-16 11:35
每个任务都是通过定时器计时判断是否到执行时间。
第一个任务执行周期最短,1ms执行一次,那么定时器计时 ...

老师:我想问一个问题,就是一个任务,我是给1ms还是10ms运行时间,这个是依据什么设定的?

380091044 发表于 2024-4-17 09:02:13

乘风飞扬 发表于 2024-4-16 11:35
每个任务都是通过定时器计时判断是否到执行时间。
第一个任务执行周期最短,1ms执行一次,那么定时器计时 ...

老师:咱们这个分时复用框架,怎么没有当前程序运行一次后,现有状态的保存,到下次开始运行时,接着运行衔接呢?

乘风飞扬 发表于 2024-4-17 09:07:53

380091044 发表于 2024-4-17 08:45
老师:我想问一个问题,就是一个任务,我是给1ms还是10ms运行时间,这个是依据什么设定的? ...

根据每个任务所处理的事情需要响应的速度决定。
例如数码管刷新1ms刷新一次比较合适,速度慢的话就会出现闪烁。
按键扫描10ms检测一次,连续5,6检测到有效电平就认为按键正常按下,可以起到防抖作用。按键以正常速度按下一般会产生100ms左右的有效电平,扫描间隔时间太快的话浪费CPU资源,扫描间隔时间太慢的话影响响应速度。

380091044 发表于 2024-4-17 09:21:20

乘风飞扬 发表于 2024-4-17 09:07
根据每个任务所处理的事情需要响应的速度决定。
例如数码管刷新1ms刷新一次比较合适,速度慢的话就会出现 ...

1、那就是说运行一次,就是把这个事情处理完毕,中间不需要衔接?再进行下个事件,不是一件事,处理一部分,下次再处理一部分;
2、这个事件运行的时间,没有经验就要尝试找到合适的值,

AI-32位8051 发表于 2024-4-17 09:24:16

全国大学生智能汽车竞赛 STC-逐飞 联合技术分享 直播通知,第十九届
一,直播技术专家:
STC USB 专家陈峰, 逐飞技术专家徐康, 刘鑫
二,直播时间:
2024年4月17日, 周三下午 14:00 ~ 16:00
2024年4月19日, 周五下午 14:00 ~ 16:00
三,直播平台:腾讯会议
腾讯会议号:748-9686-5212 (安装腾讯会议软件后,输入该会议号)
四,直播内容安排:
2024年4月17日, 周三下午 14:00 ~ 16:00
《镜头组STC赛道,本科专科均可参加》+《气垫组/专科》技术分享
STC 专家 陈峰:
1,基于STC32系列的仿真、任务调度介绍=======4月17日下午14:00 ~ 16:00有时间可来腾讯会议室,陈工会重点对任务调度做介绍分享
2,介绍PWM、比较器、CAN的视频资源
逐飞 技术专家 徐康、刘鑫:
1,基于STC32的无感无刷电机驱动开源项目技术分享
2,基于STC32G的负压CCD小车、气垫船制作分享
2024年4月19日, 周五下午 14:00 ~ 16:00
《电磁组 STC 赛道 技术分享》
STC 专家 陈峰:
STC32G系列 PWM、比较器、CAN 的 应用例程介绍
逐飞 技术专家 徐康、刘鑫:
基于STC32G的电磁小车制作分享

页: [1] 2
查看完整版本: 通过定时器周期性调度任务综合例程中的一些疑问?