找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 1574|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MSP430G2553時(shí)間片輪詢代碼結(jié)構(gòu)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1038349 發(fā)表于 2023-4-5 11:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <msp430g2553.h>

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

int main(void)
{
    // 停用看門狗定時(shí)器
    WDTCTL = WDTPW + WDTHOLD;

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

    // 初始化系統(tǒng)時(shí)鐘和定時(shí)器
    initClock();
    initTimer();
    // 啟用全局中斷
    __enable_interrupt();
    while(1)
    {
        // 在主循環(huán)中執(zhí)行其他任務(wù)
        // ...
        TaskProcess();  //時(shí)間片任務(wù)處理函數(shù)

    }
}
// Timer_A中斷服務(wù)程序
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A_ISR(void)
{
    // 在中斷服務(wù)程序中執(zhí)行需要定時(shí)的任務(wù)
    // ...
    TaskRemarks();  //時(shí)間片任務(wù)標(biāo)志處理函數(shù)
}


  1. /*
  2. * TimeSlice.h
  3. *
  4. *  Created on: 2023年3月31日
  5. *      Author: Long
  6. *      如何使用:
  7. *          1、將對(duì)應(yīng)的.c和.h兩個(gè)文件導(dǎo)入到代碼工程里面
  8. *          2、在main函數(shù)的while(1)里面調(diào)用TaskProcess(),調(diào)用時(shí)記得添加 -- #include "TimeSlice.h"
  9. *          3、在系統(tǒng)時(shí)鐘或者定時(shí)器里面調(diào)用TaskRemarks(),調(diào)用時(shí)記得添加 -- #include "TimeSlice.h"
  10. *          4、在TimeSlice.c里面的task1()、task2()、task3()填寫任務(wù)代碼,可以根據(jù)實(shí)際需要自己添加新的任務(wù)函數(shù)
  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();// 任務(wù)1
  20. void Task2();// 任務(wù)2
  21. void Task3();// 任務(wù)3
  22. void TaskRemarks(void);//任務(wù)標(biāo)志處理
  23. void TaskProcess(void);//任務(wù)處理

  24. #define TASKS_MAX 3

  25. //----任務(wù)結(jié)構(gòu)----
  26. typedef struct _TASK_COMPONENTS
  27. {
  28.     uint8 Run;                 // 程序運(yùn)行標(biāo)記:0-不運(yùn)行,1運(yùn)行
  29.     uint8 Timer;              // 計(jì)時(shí)器
  30.     uint8 ItvTime;              // 任務(wù)運(yùn)行間隔時(shí)間
  31.     void (*TaskHook)(void);    // 要運(yùn)行的任務(wù)函數(shù)
  32. } TASK_COMPONENTS;       // 任務(wù)定義

  33. ////----任務(wù)清單----
  34. //typedef enum _TASK_LIST
  35. //{
  36. //    TASK1,            //任務(wù)1
  37. //    TASK2,            //任務(wù)2
  38. //    TASK3,            //任務(wù)3
  39. //     // 這里添加你的任務(wù)。。。。
  40. //     TASKS_MAX                                           // 總的可供分配的定時(shí)任務(wù)數(shù)目
  41. //} TASK_LIST;


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

  44. /* USER CODE END 0 */

  45. #endif /* TIMESLICE_TIMESLICE_H_ */
復(fù)制代碼

  1. #include <TimeSlice.h>


  2. /**************************************************************************************
  3. * Variable definition
  4. * 在定義變量時(shí),我們已經(jīng)初始化了值,這些值的初始化,非常重要,跟具體的執(zhí)行時(shí)間優(yōu)先級(jí)等都有關(guān)系,這個(gè)需要自己掌握。
  5. * 時(shí)間片的大小需要自己注意
  6. **************************************************************************************/
  7. TASK_COMPONENTS TaskComps[TASKS_MAX] =
  8. {
  9.     {0, 60, 100, Task1},            // 任務(wù)1
  10.     {0, 20, 100, Task2},            // 任務(wù)2
  11.     {0, 30, 100, Task3},            // 任務(wù)3

  12.      // 這里添加你的任務(wù)。。。。
  13. };

  14. ///**************************************************************************************
  15. //* FunctionName : TimerInterrupt()
  16. //* Description : 定時(shí)中斷服務(wù)函數(shù)
  17. //* EntryParameter : None
  18. //* ReturnValue : None
  19. //* 將定時(shí)中斷服務(wù)函數(shù)放在定時(shí)器中斷里面
  20. //**************************************************************************************/
  21. //void TimerInterrupt(void)
  22. //{
  23. //    TaskRemarks( );
  24. //}

  25. /**************************************************************************************
  26. * FunctionName   : TaskRemarks()
  27. * Description    : 任務(wù)標(biāo)志處理
  28. * EntryParameter : None
  29. * ReturnValue    : None
  30. * 任務(wù)運(yùn)行標(biāo)志出來(lái),此函數(shù)就相當(dāng)于中斷服務(wù)函數(shù),需要在定時(shí)器的中斷服務(wù)函數(shù)中調(diào)用此函數(shù),這里獨(dú)立出來(lái),并于移植和理解。
  31. **************************************************************************************/
  32. void TaskRemarks(void)
  33. {
  34.    uint8 i;

  35.    for (i=0; i<TASKS_MAX; i++)          // 逐個(gè)任務(wù)時(shí)間處理
  36.    {
  37.         if (TaskComps[i].Timer)          // 時(shí)間不為0
  38.        {
  39.            TaskComps[i].Timer--;         // 減去一個(gè)節(jié)拍
  40.            if (TaskComps[i].Timer == 0)       // 時(shí)間減完了
  41.            {
  42.                 TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢復(fù)計(jì)時(shí)器值,從新下一次
  43.                 TaskComps[i].Run = 1;           // 任務(wù)可以運(yùn)行
  44.            }
  45.        }
  46.   }
  47. }

  48. /**************************************************************************************
  49. * FunctionName   : TaskProcess()
  50. * Description    : 任務(wù)處理
  51. * EntryParameter : None
  52. * ReturnValue    : None
  53. * 此函數(shù)就是判斷什么時(shí)候該執(zhí)行那一個(gè)任務(wù)了,實(shí)現(xiàn)任務(wù)的管理操作,
  54. * 應(yīng)用者只需要在main()函數(shù)中調(diào)用此函數(shù)就可以了,并不需要去分別調(diào)用和處理任務(wù)函數(shù)。
  55. **************************************************************************************/
  56. void TaskProcess(void)
  57. {
  58.     uint8 i;

  59.     for (i=0; i<TASKS_MAX; i++)                 // 逐個(gè)任務(wù)時(shí)間處理
  60.     {
  61.          if (TaskComps[i].Run)                  // 時(shí)間不為0
  62.         {
  63.              TaskComps[i].TaskHook();       // 運(yùn)行任務(wù)
  64.              TaskComps[i].Run = 0;          // 標(biāo)志清0
  65.         }
  66.     }
  67. }



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

  70. /* USER CODE END 0 */

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

  79. void Task3()// 任務(wù)3
  80. {

  81. }

復(fù)制代碼

代碼: G2_Basic.zip (96.57 KB, 下載次數(shù): 8)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表