FreeRTOS-02任务挂起和恢复

根据正点原子FreeRTOS视频整理

单片机:STM32F207VC

FreeRTOS源码版本:v10.0.1

任务挂起和恢复API函数:

 

工程列表:

 

1. main.c

  1 /**/
  2 #include "main.h"
  3 #include "gpio.h"
  4 #include "delay.h"
  5 #include "sys.h"
  6 
  7 #include "stm32f2xx_gpio.h"
  8 
  9 #include "FreeRTOS.h"
 10 #include "task.h"
 11 
 12 #define START_TASK_PRIO         1     /*任务优先级*/
 13 #define START_STK_SIZE          128   /*任务堆栈大小*/
 14 TaskHandle_t StartTask_Handle;        /*任务句柄*/
 15 void StartTask(void *pvParameters);   /*任务函数*/
 16 
 17 #define LED1_TASK_PRIO         2
 18 #define LED1_STK_SIZE          50
 19 TaskHandle_t LED1Task_Handle;
 20 void LED1Task(void *pvParameters);
 21 
 22 #define LED2_TASK_PRIO         3
 23 #define LED2_STK_SIZE          50
 24 TaskHandle_t LED2Task_Handle;
 25 void LED2Task(void *pvParameters);
 26 
 27 
 28 uint8_t Counter = 0;
 29 
 30 
 31 
 32 /***** 声明 *****/
 33 static void SystemInitial(void);
 34 
 35 
 36 void StartTask(void *pvParameters)
 37 {
 38   taskENTER_CRITICAL();           /*进入临界区*/
 39   
 40   xTaskCreate((TaskFunction_t )LED1Task,            /*任务函数*/
 41                             (const char *   )"LED1Task",            /*任务名称*/
 42                             (uint16_t       )LED1_STK_SIZE,       /*任务堆栈大小*/
 43                             (void *         )NULL,                /*传递给任务函数的参数*/
 44                             (UBaseType_t    )LED1_TASK_PRIO,      /*任务优先级*/
 45                             (TaskHandle_t   )&LED1Task_Handle);   /*任务句柄*/             
 46               
 47   xTaskCreate((TaskFunction_t )LED2Task,
 48                             (const char *   )"LED2Task",        
 49                             (uint16_t       )LED2_STK_SIZE,
 50                             (void *         )NULL,
 51                             (UBaseType_t    )LED2_TASK_PRIO,
 52                             (TaskHandle_t   )&LED2Task_Handle);
 53 
 54   vTaskDelete(StartTask_Handle);    /*删除开始任务*/
 55   taskEXIT_CRITICAL();              /*推出临界区*/
 56 } 
 57 
 58 
 59 void LED1Task(void *pvParameters)
 60 {
 61   while (1)
 62   {
 63     GPIOE->ODR ^= LED_ALARM;
 64     vTaskDelay(200);
 65 //    DelayNms(2);
 66   }
 67 } 
 68 
 69 void LED2Task(void *pvParameters)
 70 {
 71   while (1)
 72   {
 73     GPIOE->ODR ^= LED_RUN;
 74     vTaskDelay(500);
 75     
 76     Counter++;
 77     if (20 == Counter)
 78     {
 79       vTaskSuspend(LED1Task_Handle);
 80     }
 81     else if (50 == Counter)
 82     {
 83       vTaskResume(LED1Task_Handle);
 84       Counter = 0;
 85     }
 86     else
 87       ;
 88   }
 89 } 
 90 
 91 
 92 static void SystemInitial(void)
 93 {
 94   DelayInitial();
 95   GPIO_Initial();
 96 }
 97 
 98 int main(void)
 99 {
100   SystemInitial();
101  
102   
103   /*创建开始任务*/
104   xTaskCreate((TaskFunction_t )StartTask,           /*任务函数*/
105                             (const char *   )"StartTask",            /*任务名称*/
106                             (uint16_t       )START_STK_SIZE,      /*任务堆栈大小*/
107                             (void *         )NULL,                /*传递给任务函数的参数*/
108                             (UBaseType_t    )START_TASK_PRIO,     /*任务优先级*/
109                             (TaskHandle_t   )&StartTask_Handle);  /*任务句柄*/             
110               
111   /*开启任务调度*/
112   vTaskStartScheduler();
113 }
114 
115 /***************************END OF FILE***************************/
View Code

2. main.h

 1 /**/
 2 #ifndef __MAIN_H__
 3 #define __MAIN_H__
 4 
 5 
 6 
 7 
 8 #endif    /*__MAIN_H__*/
 9 
10 /***************************END OF FILE***************************/
View Code

3. sys.c

 1 /**/
 2 #include "sys.h"
 3 #include "stdio.h"
 4 
 5 #pragma import(__use_no_semihosting)             
 6 //标准库需要的支持函数                 
 7 struct __FILE 
 8 { 
 9     int handle; 
10 
11 }; 
12 
13 FILE __stdout;       
14 //定义_sys_exit()以避免使用半主机模式    
15 void _sys_exit(int x) 
16 { 
17     x = x; 
18 } 
19 //重定义fputc函数 
20 int fputc(int ch, FILE *f)
21 {      
22     // while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
23    // USART1->DR = (u8) ch;      
24     return ch;
25 }
26 
27 
28 /***************************END OF FILE***************************/
View Code

4. sys.h

 1 /**/
 2 #ifndef __SYS_H__
 3 #define __SYS_H__
 4 
 5 /*0不支持OS,1支持OS*/
 6 #define SYSTEM_SUPPORT_OS        1        /*定义系统文件夹是否支持OS*/
 7 
 8 #endif    /*__SYS_H__*/
 9 
10 /***************************END OF FILE***************************/
View Code

5. delay.c

 1 /**/
 2 #include "delay.h"
 3 #include "sys.h"
 4 /*如果需要使用OS,则包括下面的头文件即可*/
 5 #if SYSTEM_SUPPORT_OS
 6 #include "FreeRTOS.h"                      
 7 #include "task.h" 
 8 #endif
 9 
10 __IO uint32_t TimingDelay;
11 
12 /***** 声明 *****/
13 extern void xPortSysTickHandler(void);
14 
15 /*systick中断服务函数,使用FreeRTOS时用到*/
16 void SysTick_Handler(void)
17 {    
18     TimingDelayDecrement();
19     
20     if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)   /*系统已运行*/
21     {
22       xPortSysTickHandler();    
23     }
24 }
25 
26 void DelayInitial(void)
27 {
28   /*
29      * SystemCoreClock / 1000      1ms中断一次
30      * SystemCoreClock / 100000    10us中断一次
31      * SystemCoreClock / 1000000   1us中断一次
32      */
33   if (SysTick_Config(SystemCoreClock / 1000))
34   {
35     while (1);
36   }
37   /*关闭systick timer定时器*/
38   /*    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;*/
39 
40   /*使能滴答定时器*/
41   SysTick->CTRL |=   SysTick_CTRL_ENABLE_Msk;  
42 }
43 
44 /*
45  * 本函数在中断函数中调用,滴答定时器中断一次调用一次。
46  */
47 void TimingDelayDecrement(void)
48 {
49     if (TimingDelay != 0x00)
50     {
51         TimingDelay--;
52     }
53 }
54 
55 /*
56  * TimingDelay值在TimingDelayDecrement函数中递减
57  */
58 void DelayNms(uint32_t nTimes)
59 {
60     TimingDelay = nTimes;
61     
62     while (TimingDelay!=0);   //等待计数停止
63 }
64 
65 /***************************END OF FILE***************************/
View Code

6. delay.h

 1 /**/
 2 #ifndef __DELAY_H__
 3 #define __DELAY_H__
 4 
 5 #include "stm32f2xx.h"
 6 
 7 #include <stdint.h>
 8 
 9 extern void DelayInitial(void);
10 extern void TimingDelayDecrement(void);
11 extern void DelayNms(uint32_t nTimes);
12 
13 #endif    /*__DELAY_H__*/
14 /***************************END OF FILE***************************/
View Code

7. gpio.c

 1 /**/
 2 #include "gpio.h"
 3 
 4 /***** 声明 *****/
 5 static void GPIO_LED_Configuration(void);
 6 
 7 
 8 void GPIO_Initial(void)
 9 {
10   GPIO_LED_Configuration();
11 }
12 
13 
14 static void GPIO_LED_Configuration(void)
15 {
16   GPIO_InitTypeDef    GPIO_InitStructure;
17   
18   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
19   
20   GPIO_InitStructure.GPIO_Pin     = LED_POWER | LED_RUN | LED_ALARM;
21   GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_OUT;
22   GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_100MHz;
23   GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;
24   GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;
25   GPIO_Init(GPIOE, &GPIO_InitStructure);  
26   
27   LED_Power_On();
28   LED_Run_Off();
29   LED_Alarm_Off();
30 }
31 
32 /***************************END OF FILE***************************/
View Code

8. gpio.h

 1 /**/
 2 #ifndef __GPIO_H__
 3 #define __GPIO_H__
 4 
 5 #include "stm32f2xx_gpio.h"
 6 
 7 #define LED_POWER         GPIO_Pin_2    /*PE2*/
 8 #define LED_RUN           GPIO_Pin_3    /*PE3*/
 9 #define LED_ALARM         GPIO_Pin_4    /*PE4*/
10 
11 #define LED_Power_On()    GPIO_ResetBits(GPIOE, LED_POWER)
12 #define LED_Power_Off()   GPIO_SetBits(GPIOE, LED_POWER)
13 #define LED_Run_On()      GPIO_ResetBits(GPIOE, LED_RUN)
14 #define LED_Run_Off()     GPIO_SetBits(GPIOE, LED_RUN)
15 #define LED_Alarm_On()    GPIO_ResetBits(GPIOE, LED_ALARM)
16 #define LED_Alarm_Off()   GPIO_SetBits(GPIOE, LED_ALARM)
17 
18 
19 extern void GPIO_Initial(void);
20 
21 #endif  /*__GPIO_H__*/
22 /***************************END OF FILE***************************/
View Code

9. 说明:

1 xTaskResumeFromISR()的功能跟vTaskResume()函数一样,只是在中断函数中调用。

 

posted @ 2018-06-29 15:37  seifguo  阅读(794)  评论(0编辑  收藏  举报