zoukankan      html  css  js  c++  java
  • 基于时间触发的裸机任务调度

     /**/
    1
    #define TASK_NUM (3) 2 3 typedef struct _TASK_COMPONETS_ 4 { 5 uint8_t Run; //运行状态 6 uint16_t Timer; //任务启动延时,设置此值防止任务重叠 7 uint16_t lvtTime; //任务运行周期间隔 8 void (*TaskHook)(void); //任务函数指针 9 10 }TASK_COMPONENTS; 11 12 13 typedef enum _TASK_LIST_ 14 { 15 TASK_1, 16 TASK_2, 17 TASK_3, 18 TASK_MAX 19 }TASK_LIST; 20 21 TASK_COMPONENTS TaskComps[TASK_NUM] = 22 { 23 {0, 1, 35, Task1}, 24 {0, 3, 40, Task2}, 25 {0, 5, 45, Task3}, 26 }; 27 28 void TaskRemaks(void) 29 { 30 uint8_t i; 31 for(i = 0; i < TASK_MAX; i++) 32 { 33 if(TaskComps[i].Timer) 34 { 35 TaskComps[i].Timer--; 36 if(TaskComps[i].Timer == 0) 37 { 38 TaskComps[i].Timer = TaskComps[i].lvtTime; 39 TaskComps[i].Run = 1; 40 } 41 } 42 } 43 44 } 45 46 void TaskProcess(void) 47 { 48 uint8_t i; 49 for(i = 0; i < TASK_MAX; i++) 50 { 51 if(TaskComps[i].Run) 52 { 53 TaskComps[i].TaskHook(); 54 TaskComps[i].Run = 0; 55 } 56 } 57 } 58 59 void Task1 (void) 60 { 61 printf("[%ldms]T1 ",HAL_GetTick()); 62 } 63 64 void Task2 (void) 65 { 66 printf("[%ldms]T2 ",HAL_GetTick()); 67 } 68 69 void Task3 (void) 70 { 71 printf("[%ldms]T3 ",HAL_GetTick()); 72 }

    1ms定时器中断:

     1 void MX_TIM1_Init(void)
     2 {
     3   TIM_ClockConfigTypeDef sClockSourceConfig;
     4   TIM_MasterConfigTypeDef sMasterConfig;
     5 
     6   htim1.Instance = TIM1;
     7   htim1.Init.Prescaler = 71;
     8   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
     9   htim1.Init.Period = 999;
    10   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    11   htim1.Init.RepetitionCounter = 0;
    12   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    13   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
    14   {
    15     _Error_Handler(__FILE__, __LINE__);
    16   }
    17 
    18   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    19   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
    20   {
    21     _Error_Handler(__FILE__, __LINE__);
    22   }
    23 
    24   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    25   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    26   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
    27   {
    28     _Error_Handler(__FILE__, __LINE__);
    29   }
    30 
    31 }
    32 
    33 
    34 void TIM1_UP_IRQHandler(void)
    35 {
    36   /* USER CODE BEGIN TIM1_UP_IRQn 0 */
    37 
    38   /* USER CODE END TIM1_UP_IRQn 0 */
    39   HAL_TIM_IRQHandler(&htim1);
    40   /* USER CODE BEGIN TIM1_UP_IRQn 1 */
    41 
    42   /* USER CODE END TIM1_UP_IRQn 1 */
    43 }
    44 
    45 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    46 {
    47     if(htim->Instance == TIM1)
    48     {
    49         TaskRemaks();
    50     }
    51 }
     1 int main(void)
     2 {
     3   /* USER CODE BEGIN 1 */
     4 
     5   /* USER CODE END 1 */
     6 
     7   /* MCU Configuration----------------------------------------------------------*/
     8 
     9   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    10   HAL_Init();
    11 
    12   /* USER CODE BEGIN Init */
    13 
    14   /* USER CODE END Init */
    15 
    16   /* Configure the system clock */
    17   SystemClock_Config();
    18 
    19   /* USER CODE BEGIN SysInit */
    20 
    21   /* USER CODE END SysInit *
    22 
    23   /* Initialize all configured peripherals */
    24   MX_GPIO_Init();
    25   MX_USART1_UART_Init();
    26   MX_TIM1_Init();
    27   /* USER CODE BEGIN 2 */
    28   HAL_TIM_Base_Start_IT(&htim1);
    29 
    30   /* Infinite loop */
    31   /* USER CODE BEGIN WHILE */
    32   while (1)
    33   {
    34 
    35   /* USER CODE END WHILE */
    36 
    37   /* USER CODE BEGIN 3 */
    38      TaskProcess();
    39   }
    40   /* USER CODE END 3 */
    41 
    42 }
    43   /* USER CODE END 2 */

    测试如下图:TASK1 间隔 35ms执行一次, TASK 2间隔40ms,TASK 3间隔45。

    一开始启动TASK1,   2ms后启动TASK2,   4ms后启动TASK3,防止任务重叠。

  • 相关阅读:
    调试SQL Server的存储过程及用户定义函数
    寻找 vb.net 事务处理高级编程 的代码!!
    解析Java类和对象的初始化过程
    SQL 安装进程被挂起!
    教你成为一个受欢迎的人
    final class作用
    微软反跨站脚本库
    pdf解析
    ce'shi测试微博
    淘宝架构变化
  • 原文地址:https://www.cnblogs.com/mickey-double/p/14647717.html
Copyright © 2011-2022 走看看