找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 955|回复: 0
收起左侧

MSP430G2553时间片轮询代码结构

[复制链接]
ID:1038349 发表于 2023-4-5 11:08 | 显示全部楼层 |阅读模式
#include <msp430g2553.h>

#include <TimeSlice.h>
#include "gpio.h"
#include "uart.h"

int main(void)
{
    // 停用看门狗定时器
    WDTCTL = WDTPW + WDTHOLD;

    /* User code init begin */
    gpio_init();//GPIO初始化
    uart_init();//串口初始化
    /* User code init end */

    // 初始化系统时钟和定时器
    initClock();
    initTimer();
    // 启用全局中断
    __enable_interrupt();
    while(1)
    {
        // 在主循环中执行其他任务
        // ...
        TaskProcess();  //时间片任务处理函数

    }
}
// Timer_A中断服务程序
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A_ISR(void)
{
    // 在中断服务程序中执行需要定时的任务
    // ...
    TaskRemarks();  //时间片任务标志处理函数
}


  1. /*
  2. * TimeSlice.h
  3. *
  4. *  Created on: 2023年3月31日
  5. *      Author: Long
  6. *      如何使用:
  7. *          1、将对应的.c和.h两个文件导入到代码工程里面
  8. *          2、在main函数的while(1)里面调用TaskProcess(),调用时记得添加 -- #include "TimeSlice.h"
  9. *          3、在系统时钟或者定时器里面调用TaskRemarks(),调用时记得添加 -- #include "TimeSlice.h"
  10. *          4、在TimeSlice.c里面的task1()、task2()、task3()填写任务代码,可以根据实际需要自己添加新的任务函数
  11. */

  12. #ifndef TIMESLICE_TIMESLICE_H_
  13. #define TIMESLICE_TIMESLICE_H_

  14. /* Private includes ----------------------------------------------------------*/
  15. /* USER CODE BEGIN Includes */
  16. #include <msp430g2553.h>
  17. /* USER CODE END Includes */

  18. typedef unsigned char uint8;

  19. void Task1();// 任务1
  20. void Task2();// 任务2
  21. void Task3();// 任务3
  22. void TaskRemarks(void);//任务标志处理
  23. void TaskProcess(void);//任务处理

  24. #define TASKS_MAX 3

  25. //----任务结构----
  26. typedef struct _TASK_COMPONENTS
  27. {
  28.     uint8 Run;                 // 程序运行标记:0-不运行,1运行
  29.     uint8 Timer;              // 计时器
  30.     uint8 ItvTime;              // 任务运行间隔时间
  31.     void (*TaskHook)(void);    // 要运行的任务函数
  32. } TASK_COMPONENTS;       // 任务定义

  33. ////----任务清单----
  34. //typedef enum _TASK_LIST
  35. //{
  36. //    TASK1,            //任务1
  37. //    TASK2,            //任务2
  38. //    TASK3,            //任务3
  39. //     // 这里添加你的任务。。。。
  40. //     TASKS_MAX                                           // 总的可供分配的定时任务数目
  41. //} TASK_LIST;


  42. /* Private user code ---------------------------------------------------------*/
  43. /* USER CODE BEGIN 0 */

  44. /* USER CODE END 0 */

  45. #endif /* TIMESLICE_TIMESLICE_H_ */
复制代码

  1. #include <TimeSlice.h>


  2. /**************************************************************************************
  3. * Variable definition
  4. * 在定义变量时,我们已经初始化了值,这些值的初始化,非常重要,跟具体的执行时间优先级等都有关系,这个需要自己掌握。
  5. * 时间片的大小需要自己注意
  6. **************************************************************************************/
  7. TASK_COMPONENTS TaskComps[TASKS_MAX] =
  8. {
  9.     {0, 60, 100, Task1},            // 任务1
  10.     {0, 20, 100, Task2},            // 任务2
  11.     {0, 30, 100, Task3},            // 任务3

  12.      // 这里添加你的任务。。。。
  13. };

  14. ///**************************************************************************************
  15. //* FunctionName : TimerInterrupt()
  16. //* Description : 定时中断服务函数
  17. //* EntryParameter : None
  18. //* ReturnValue : None
  19. //* 将定时中断服务函数放在定时器中断里面
  20. //**************************************************************************************/
  21. //void TimerInterrupt(void)
  22. //{
  23. //    TaskRemarks( );
  24. //}

  25. /**************************************************************************************
  26. * FunctionName   : TaskRemarks()
  27. * Description    : 任务标志处理
  28. * EntryParameter : None
  29. * ReturnValue    : None
  30. * 任务运行标志出来,此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数,这里独立出来,并于移植和理解。
  31. **************************************************************************************/
  32. void TaskRemarks(void)
  33. {
  34.    uint8 i;

  35.    for (i=0; i<TASKS_MAX; i++)          // 逐个任务时间处理
  36.    {
  37.         if (TaskComps[i].Timer)          // 时间不为0
  38.        {
  39.            TaskComps[i].Timer--;         // 减去一个节拍
  40.            if (TaskComps[i].Timer == 0)       // 时间减完了
  41.            {
  42.                 TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢复计时器值,从新下一次
  43.                 TaskComps[i].Run = 1;           // 任务可以运行
  44.            }
  45.        }
  46.   }
  47. }

  48. /**************************************************************************************
  49. * FunctionName   : TaskProcess()
  50. * Description    : 任务处理
  51. * EntryParameter : None
  52. * ReturnValue    : None
  53. * 此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,
  54. * 应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。
  55. **************************************************************************************/
  56. void TaskProcess(void)
  57. {
  58.     uint8 i;

  59.     for (i=0; i<TASKS_MAX; i++)                 // 逐个任务时间处理
  60.     {
  61.          if (TaskComps[i].Run)                  // 时间不为0
  62.         {
  63.              TaskComps[i].TaskHook();       // 运行任务
  64.              TaskComps[i].Run = 0;          // 标志清0
  65.         }
  66.     }
  67. }



  68. /* Private user code ---------------------------------------------------------*/
  69. /* USER CODE BEGIN 0 */

  70. /* USER CODE END 0 */

  71. void Task1()// 任务1
  72. {
  73.     led1_toggle();
  74. }
  75. void Task2()// 任务2
  76. {
  77.     led2_toggle();
  78. }

  79. void Task3()// 任务3
  80. {

  81. }

复制代码

代码: G2_Basic.zip (96.57 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表