基于时间触发的裸机任务调度

 /**/
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,防止任务重叠。

原文地址:https://www.cnblogs.com/mickey-double/p/14647717.html