6、uCOS-Ⅱ 任务的创建、删除、挂起、恢复

1、无条件挂起一个任务:OSTaskSuspend(任务优先级)

 当前任务挂起后,只有其他任务才能唤醒被挂起的任务。任务挂起后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。唤醒挂起任务需要调用函数OSTaskResume(任务优先级)。

 

2. 删除一个uc/os中的任务:OSTaskDelReq(任务优先级)

    在uc/os中删除一个任务,一般情况下是自己删除自己。如果任务A直接调用OSTaskDel (INT8U prio)函数来直接删除任务B,任务B占用的资源会得不到释放,系统到最后会没有内存可用。所以当任务A想要删除任务B的时候,会先调用OSTaskDelReq (INT8U prio)函数来请求任务B删除自己,比如B的优先级是10,即调用OSTaskDelReq (10)。

    任务B会通过OSTaskDelReq (INT8U prio)函数来查询是否有其他任务请求删除自己。若有,则释放自己占用的资源、内存,调用OSTaskDel (OS_PRIO_SELF)来删除自己。

 

3、代码例程:

  1 /*****************************************************************************************************************************
  2 *
  3 *  文件名称:main.c
  4 *  文件功能:主函数
  5 *  文件说明:无
  6 *
  7 *****************************************************************************************************************************/
  8 /**********************************************************
  9 *
 10 *  头文件声明
 11 *  
 12 **********************************************************/
 13 
 14 #include "pbdata.h"
 15 
 16 
 17 
 18 
 19 
 20 
 21 /**********************************************************
 22 *
 23 *  调用函数声明
 24 *  
 25 **********************************************************/
 26 void RCC_Configuration(void);//时钟配置函数
 27 
 28 void  start_task(void *pdata);//开始任务函数
 29 
 30 
 31 
 32 
 33 
 34 /**********************************************************
 35 *
 36 *  主函数
 37 *  
 38 **********************************************************/
 39 int main(void)
 40 {
 41     Delay_Init();//延时函数初始化
 42     
 43     RCC_Configuration();//时钟配置
 44     
 45     LED_GPIO();//LED的GPIO引脚配置
 46     
 47     KEY_GPIO();//KEY的GPIO引脚配置
 48     
 49     
 50 /*操作系统的处理*/
 51     OSInit();//初始化UCOS操作系统
 52     OSTaskCreate(
 53               start_task,  //指向任务代码的指针
 54               (void *)0,    //任务开始执行时,传递给任务参数的指针
 55               (OS_STK *) & START_TASK_STK[START_STK_SIZE-1],//分配给任务堆栈的栈顶指针
 56               START_TASK_PRIO//分配给任务的优先级
 57              );
 58     OSStart();//启动OS操作系统
 59     
 60     
 61     
 62     
 63 }
 64 
 65 
 66 
 67 /**********************************************************
 68 *
 69 *  函数名称:RCC_Configuration(void)
 70 *  函数功能:时钟配置
 71 *  输入参数:无
 72 *  输出参数:无
 73 *  函数说明:无
 74 *  
 75 **********************************************************/
 76 void  RCC_Configuration(void)
 77 {
 78     SystemInit();//系统初始化
 79     
 80     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//LED1对应GPIO时钟使能
 81     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//LED2、LED3对应GPIO时钟使能
 82     
 83     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//按键对应GPIO时钟使能
 84 }
 85 
 86 
 87 
 88 
 89 
 90 
 91 /**********************************************************
 92 *
 93 *  函数名称:start_task(void *pdata)
 94 *  函数功能:开始任务
 95 *  输入参数:*pdata
 96 *  输出参数:无
 97 *  函数说明:无
 98 *  
 99 **********************************************************/
100 void  start_task(void *pdata)
101 {
102    OS_CPU_SR  cpu_sr=0;
103     
104    pdata=pdata;//防止编译器报错
105     
106    OSStatInit();//初始化统计任务
107     
108    OS_ENTER_CRITICAL();//进入临界区,中断无法打断
109     
110 /*创建任务*/ 
111    /*LED1任务*/    
112    OSTaskCreate(
113               led1_task,  //指向任务代码的指针
114               (void *)0,    //任务开始执行时,传递给任务参数的指针
115               (OS_STK *) & LED1_TASK_STK[LED1_STK_SIZE-1],//分配给任务堆栈的栈顶指针
116               LED1_TASK_PRIO//分配给任务的优先级
117              );
118      /*LED2任务*/    
119    OSTaskCreate(
120               led2_task,  //指向任务代码的指针
121               (void *)0,    //任务开始执行时,传递给任务参数的指针
122               (OS_STK *) & LED2_TASK_STK[LED2_STK_SIZE-1],//分配给任务堆栈的栈顶指针
123               LED2_TASK_PRIO//分配给任务的优先级
124              );
125     /*LED3任务*/    
126    OSTaskCreate(
127               led3_task,  //指向任务代码的指针
128               (void *)0,    //任务开始执行时,传递给任务参数的指针
129               (OS_STK *) & LED3_TASK_STK[LED3_STK_SIZE-1],//分配给任务堆栈的栈顶指针
130               LED3_TASK_PRIO//分配给任务的优先级
131              );
132     /*key任务*/    
133    OSTaskCreate(
134               key_task,  //指向任务代码的指针
135               (void *)0,    //任务开始执行时,传递给任务参数的指针
136               (OS_STK *) & KEY_TASK_STK[KEY_STK_SIZE-1],//分配给任务堆栈的栈顶指针
137               KEY_TASK_PRIO//分配给任务的优先级
138              );
139 
140    OSTaskSuspend(START_TASK_PRIO);//挂起开始任务
141     
142    OS_EXIT_CRITICAL();//退出临界区,可以被中断打断
143 
144 }
View Code
  1 /*****************************************************************************************************************************
  2 *
  3 *  文件名称:pbdata.c
  4 *  文件功能:自定义函数
  5 *  文件说明:无
  6 *
  7 *****************************************************************************************************************************/
  8 
  9 
 10 
 11 #include "pbdata.h"
 12 
 13 u8 dt=0;
 14 static u8  fac_us=0;//us延时倍乘数
 15 static u16 fac_ms=0;//ms延时倍乘数
 16 
 17 
 18 
 19 
 20 
 21 /**********************************************************
 22 *
 23 *  函数名称:Delay_Init(void)    
 24 *  函数功能:初始化延时函数
 25 *  输入参数:无
 26 *  输出参数:无
 27 *  函数说明:当使用ucos的时候,此函数会初始化ucos的时钟节拍
 28 *            SYSTICK的时钟固定为HCLK时钟的1/8
 29 *            SYSCLK:系统时钟
 30 *  
 31 **********************************************************/
 32 void Delay_Init(void)     
 33 {
 34     u32 reload;
 35     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    //选择外部时钟,HCLK/8
 36     fac_us=SystemCoreClock/8000000;    //为系统时钟的1/8
 37      
 38     reload=SystemCoreClock/8000000;    //每秒钟的计数次数,单位为K   
 39     reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出事件,reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
 40                                 
 41     fac_ms=1000/OS_TICKS_PER_SEC;// 代表ucos可以延时的最少单位
 42     SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;       //开启SYSTICK中断
 43     SysTick->LOAD=reload;     //每1/OS_TICKS_PER_SEC秒中断一次
 44     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;       //开启SYSTICK    
 45 }                                    
 46 
 47 
 48 
 49 
 50 
 51 /**********************************************************
 52 *
 53 *  函数名称:delay_us(u32 nus)
 54 *  函数功能:延时微秒子程序
 55 *  输入参数:nus,  延时微秒数
 56 *  输出参数:无
 57 *  函数说明:无
 58 *            
 59 **********************************************************/
 60 void delay_us(u32 nus)
 61 {        
 62     u32 ticks;
 63     u32 told,tnow,tcnt=0;
 64     u32 reload=SysTick->LOAD;    //LOAD的值      
 65     ticks=nus*fac_us;             //需要的节拍数         
 66     tcnt=0;
 67     told=SysTick->VAL;            //刚进入时的计数器值
 68     while(1)
 69     {
 70         tnow=SysTick->VAL;    
 71         if(tnow!=told)
 72         {        
 73             if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了
 74             else tcnt+=reload-tnow+told;        
 75             told=tnow;
 76             if(tcnt>=ticks)break;//时间超过/等于要延时的事件,则退出
 77         }  
 78     };                                         
 79 }
 80 
 81 
 82 
 83 
 84 
 85 
 86 /**********************************************************
 87 *
 88 *  函数名称:delay_ms(u16 nms)
 89 *  函数功能:延时毫秒子程序
 90 *  输入参数:nms,  延时微秒数
 91 *  输出参数:无
 92 *  函数说明:无
 93 *            
 94 **********************************************************/
 95 void delay_ms(u16 nms)
 96 {    
 97     if(OSRunning==TRUE)//如果os已经在跑了   
 98     {          
 99         if(nms>=fac_ms)//延时的事件大于ucos的最少时间周期
100         {
101                OSTimeDly(nms/fac_ms);//ucos延时
102         }
103         nms%=fac_ms;                //ucos已经无法提供这么小的延时了,采用普通方式延时    
104     }
105     delay_us((u32)(nms*1000));    //普通方式延时,此时ucos无法启动调度
106 }
107 
108 
109 
110 
111 /**********************************************************
112 *
113 *  函数名称:delay(u32 nCount)
114 *  函数功能:普通不精确延时
115 *  输入参数:nCount,  延时时间长短
116 *  输出参数:无
117 *  函数说明:无
118 *            
119 **********************************************************/
120 void delay(u32 nCount)
121 {
122     for(;nCount!=0;nCount--);
123 }
View Code
 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:pbdata.h
 4 *  文件功能:自定义函数的头文件声明
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8 
 9 
10 #ifndef _pbdata_H
11 #define _pbdata_H
12 
13 
14 
15 
16 
17 
18 /**********************************************************
19 *
20 *  需要引入的头文件
21 *  
22 **********************************************************/
23 #include "stm32f10x.h"
24 #include "includes.h"
25 #include "misc.h"
26 
27 #include "led.h"//LED相关头文件
28 #include "key.h"//key相关头文件
29 
30 
31 /**********************************************************
32 *
33 *  任务相关设置
34 *  
35 **********************************************************/
36 /*开始任务*/
37     #define  START_TASK_PRIO   9  //设置任务优先级
38     #define  START_STK_SIZE    64  //空间大小=64*4(字节)
39     static OS_STK  START_TASK_STK[START_STK_SIZE];//创建任务堆栈空间
40 
41 /*LED1任务*/
42     #define  LED1_TASK_PRIO   6  //设置任务优先级
43     #define  LED1_STK_SIZE    64  //空间大小=64*4(字节)
44     static OS_STK   LED1_TASK_STK[LED1_STK_SIZE];//创建任务堆栈空间
45 
46 /*LED2任务*/
47     #define  LED2_TASK_PRIO   7  //设置任务优先级
48     #define  LED2_STK_SIZE    64  //空间大小=64*4(字节)
49     static OS_STK   LED2_TASK_STK[LED2_STK_SIZE];//创建任务堆栈空间
50 
51 
52 /*LED3任务*/
53     #define  LED3_TASK_PRIO   8  //设置任务优先级
54     #define  LED3_STK_SIZE    64  //空间大小=64*4(字节)
55     static OS_STK   LED3_TASK_STK[LED3_STK_SIZE];//创建任务堆栈空间
56 
57 
58 /*key任务*/
59     #define  KEY_TASK_PRIO   5  //设置任务优先级
60     #define  KEY_STK_SIZE    64  //空间大小=64*4(字节)
61     static OS_STK   KEY_TASK_STK[KEY_STK_SIZE];//创建任务堆栈空间
62 
63 
64 
65 
66 /**********************************************************
67 *
68 *  子函数程序声明
69 *  
70 **********************************************************/
71 void delay(u32 nCount);//普通不精确延时
72 void Delay_Init(void);//延时函数初始化
73 void delay_us(u32 nus);//微秒延时
74 void delay_ms(u16 nms);//毫秒延时
75 
76 
77 
78 
79 #endif
View Code
  1 /*****************************************************************************************************************************
  2 *
  3 *  文件名称:stm32f10x_it.c
  4 *  文件功能:中断处理函数
  5 *  文件说明:无
  6 *
  7 *****************************************************************************************************************************/
  8 #include "stm32f10x_it.h"
  9 #include "pbdata.h"     
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 /**********************************************************
 20 *
 21 *  函数名称:NMI_Handler(void)
 22 *  函数功能:NMI中断处理函数
 23 *  输入参数:无
 24 *  输出参数:无
 25 *  函数说明:无
 26 *  
 27 **********************************************************/
 28 void NMI_Handler(void)
 29 {
 30 }
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 /**********************************************************
 39 *
 40 *  函数名称:USART1_IRQHandler(void)
 41 *  函数功能:USART1中断处理函数
 42 *  输入参数:无
 43 *  输出参数:无
 44 *  函数说明:无
 45 *  
 46 **********************************************************/
 47 void USART1_IRQHandler(void)
 48 {
 49    while(1);
 50 }
 51 
 52 
 53 
 54 
 55 /**********************************************************
 56 *
 57 *  函数名称:HardFault_Handler(void)
 58 *  函数功能:UHardFault中断处理函数
 59 *  输入参数:无
 60 *  输出参数:无
 61 *  函数说明:无
 62 *  
 63 **********************************************************/
 64 void HardFault_Handler(void)
 65 {
 66   /* Go to infinite loop when Hard Fault exception occurs */
 67   while (1)
 68   {
 69   }
 70 }
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 /**********************************************************
 79 *
 80 *  函数名称:MemManage_Handler(void)
 81 *  函数功能:MemManage中断处理函数
 82 *  输入参数:无
 83 *  输出参数:无
 84 *  函数说明:This function handles Memory Manage exception.
 85 *  
 86 **********************************************************/
 87 void MemManage_Handler(void)
 88 {
 89   /* Go to infinite loop when Memory Manage exception occurs */
 90   while (1)
 91   {
 92   }
 93 }
 94 
 95 
 96 
 97 
 98 
 99 
100 /**********************************************************
101 *
102 *  函数名称:BusFault_Handler(void)
103 *  函数功能:BusFault中断处理函数
104 *  输入参数:无
105 *  输出参数:无
106 *  函数说明:This function handles Bus Fault exception.
107 *  
108 **********************************************************/
109 void BusFault_Handler(void)
110 {
111   /* Go to infinite loop when Bus Fault exception occurs */
112   while (1)
113   {
114   }
115 }
116 
117 
118 
119 
120 
121 /**********************************************************
122 *
123 *  函数名称:UsageFault_Handler(void)
124 *  函数功能:UsageFault中断处理函数
125 *  输入参数:无
126 *  输出参数:无
127 *  函数说明:This function handles Usage Fault exception.
128 *  
129 **********************************************************/
130 void UsageFault_Handler(void)
131 {
132   /* Go to infinite loop when Usage Fault exception occurs */
133   while (1)
134   {
135   }
136 }
137 
138 
139 
140 
141 
142 /**********************************************************
143 *
144 *  函数名称:SVC_Handler(void)
145 *  函数功能:SVC中断处理函数
146 *  输入参数:无
147 *  输出参数:无
148 *  函数说明:This function handles SVCall exception.
149 *  
150 **********************************************************/
151 void SVC_Handler(void)
152 {
153 }
154 
155 
156 
157 
158 /**********************************************************
159 *
160 *  函数名称:DebugMon_Handler(void)
161 *  函数功能:DebugMon中断处理函数
162 *  输入参数:无
163 *  输出参数:无
164 *  函数说明:This function handles Debug Monitor exception.
165 *  
166 **********************************************************/
167 void DebugMon_Handler(void)
168 {
169 }
170 
171 
172 
173 
174 
175 
176 
177 /**********************************************************
178 *
179 *  函数名称:SysTick_Handler(void)
180 *  函数功能:SysTick中断处理函数
181 *  输入参数:无
182 *  输出参数:无
183 *  函数说明:This function handles SysTick Handler.
184 *  
185 **********************************************************/
186 void SysTick_Handler(void)
187 {
188     OSIntEnter();    //进入中断
189     OSTimeTick(); //调用ucos的时钟服务程序          
190     OSIntExit();  //触发任务切换软中断
191 }
192 
193 
194 
195 
196 
197 
198 /**********************************************************
199 *
200 *  函数名称:EXTI9_5_IRQHandler(void)
201 *  函数功能:EXTI9_5中断处理函数
202 *  输入参数:无
203 *  输出参数:无
204 *  函数说明:无
205 *  
206 **********************************************************/
207 void EXTI9_5_IRQHandler(void)
208 {
209       
210 }
211 
212 
213 
214 
215 
216 
217 /**********************************************************
218 *
219 *  函数名称:EXTI1_IRQHandler(void)
220 *  函数功能:EXTI1中断处理函数
221 *  输入参数:无
222 *  输出参数:无
223 *  函数说明:无
224 *  
225 **********************************************************/
226 void EXTI1_IRQHandler(void)
227 {
228     
229 }
230 
231 
232 
233 
234 
235 
236 
237 /**********************************************************
238 *
239 *  函数名称:EXTI2_IRQHandler(void)
240 *  函数功能:EXTI2_中断处理函数
241 *  输入参数:无
242 *  输出参数:无
243 *  函数说明:无
244 *  
245 **********************************************************/
246 void EXTI2_IRQHandler(void)
247 {
248     
249 }
250 
251 
252 
253 
254 
255 
256 
257 
258 /**********************************************************
259 *
260 *  函数名称:EXTI3_IRQHandler(void)
261 *  函数功能:EXTI3_中断处理函数
262 *  输入参数:无
263 *  输出参数:无
264 *  函数说明:无
265 *  
266 **********************************************************/
267 void EXTI3_IRQHandler(void)
268 {
269    
270 }
View Code
  1 /*****************************************************************************************************************************
  2 *
  3 *  文件名称:led.c
  4 *  文件功能:led相关函数
  5 *  文件说明:无
  6 *
  7 *****************************************************************************************************************************/
  8 
  9 
 10 
 11 
 12 #include "pbdata.h"
 13 
 14 
 15 
 16 /**********************************************************
 17 *
 18 *  函数名称:LED_GPIO(void)
 19 *  函数功能:LED的GPIO配置
 20 *  输入参数:无
 21 *  输出参数:无
 22 *  函数说明:无
 23 *  
 24 **********************************************************/
 25 
 26 void LED_GPIO(void)//GPIO初始化函数
 27 {
 28     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 
 29     
 30 /*LED1配置*/
 31     /*结构体变量赋值*/
 32     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
 33     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
 34     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
 35 /*对应的GPIO初始化*/
 36 GPIO_Init(GPIOB,&GPIO_InitStructure);
 37     
 38 /*LED2、LED3配置*/
 39     /*结构体变量赋值*/
 40     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_6;////LED2、LED3引脚配置
 41   /*对应的GPIO初始化*/
 42     GPIO_Init(GPIOD,&GPIO_InitStructure);
 43 
 44 
 45 }
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 /**********************************************************
 54 *
 55 *  函数名称:led1_task(void *pdata)
 56 *  函数功能:led1任务处理函数
 57 *  输入参数:*pdata
 58 *  输出参数:无
 59 *  函数说明:无
 60 *  
 61 **********************************************************/
 62 
 63 void  led1_task(void *pdata)
 64 {
 65    pdata=pdata;//防止编译器报错
 66 
 67    while(1)
 68    {
 69 
 70     GPIO_SetBits(GPIOB,GPIO_Pin_5);//指定端口设置为高电平
 71     
 72     delay_ms(1000);//1s,delay,公共函数库中自己定义
 73  
 74     GPIO_ResetBits(GPIOB,GPIO_Pin_5);//指定端口设置低电平
 75 
 76     delay_ms(1000);//1s,delay,公共函数库中自己定义
 77     }
 78     
 79 }
 80 
 81 
 82 
 83 
 84 
 85 /**********************************************************
 86 *
 87 *  函数名称:led2_task(void *pdata)
 88 *  函数功能:led2任务处理函数
 89 *  输入参数:*pdata
 90 *  输出参数:无
 91 *  函数说明:无
 92 *  
 93 **********************************************************/
 94 
 95 void  led2_task(void *pdata)
 96 {
 97    pdata=pdata;//防止编译器报错
 98 
 99    while(1)
100    {
101         if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ)//判断是否有删除请求
102     {
103       OSTaskDel(OS_PRIO_SELF);//删除自身任务
104     }  
105          
106     GPIO_SetBits(GPIOD,GPIO_Pin_6);//指定端口设置为高电平
107     
108     delay_ms(1000);//1s,delay,公共函数库中自己定义
109  
110     GPIO_ResetBits(GPIOD,GPIO_Pin_6);//指定端口设置低电平
111 
112     delay_ms(1000);//1s,delay,公共函数库中自己定义
113     }
114     
115 }
116 
117 
118 
119 
120 /**********************************************************
121 *
122 *  函数名称:led3_task(void *pdata)
123 *  函数功能:led3任务处理函数
124 *  输入参数:*pdata
125 *  输出参数:无
126 *  函数说明:无
127 *  
128 **********************************************************/
129 
130 void  led3_task(void *pdata)
131 {
132    pdata=pdata;//防止编译器报错
133 
134    while(1)
135    {
136     GPIO_SetBits(GPIOD,GPIO_Pin_3);//指定端口设置为高电平
137     
138     delay_ms(1000);//1s,delay,公共函数库中自己定义
139  
140     GPIO_ResetBits(GPIOD,GPIO_Pin_3);//指定端口设置低电平
141 
142     delay_ms(1000);//1s,delay,公共函数库中自己定义
143     }
144     
145 }
View Code
 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:led.h
 4 *  文件功能:led相关函数的头文件
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8 
 9 
10 #ifndef _LED_H
11 #define _LED_H
12 
13 #include "pbdata.h"
14 
15 
16 void LED_GPIO(void);//LED的GIPO引脚配置
17 
18 void  led1_task(void *pdata);//LED1任务
19 void  led2_task(void *pdata);//LED2任务
20 void  led3_task(void *pdata);//LED3任务
21 
22 
23 
24 #endif
View Code
 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:key.c
 4 *  文件功能:按键处理函数头文件
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8 
 9 #include "pbdata.h"
10 
11 
12 
13 
14 
15 /**********************************************************
16 *
17 *  函数名称:KEY_GPIO(void)
18 *  函数功能:KEY的GPIO配置
19 *  输入参数:无
20 *  输出参数:无
21 *  函数说明:无
22 *  
23 **********************************************************/
24 void KEY_GPIO(void)//GPIO初始化函数
25 {
26     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 
27     
28 /*key配置*/
29     /*结构体变量赋值*/
30     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;////引脚配置
31     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
32     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
33 /*对应的GPIO初始化*/
34 GPIO_Init(GPIOC,&GPIO_InitStructure);
35     
36 }
37 
38 
39 
40 /**********************************************************
41 *
42 *  函数名称:key_task(void *pdata)
43 *  函数功能:key任务处理函数
44 *  输入参数:*pdata
45 *  输出参数:无
46 *  函数说明: 不断查询4个按键,当查询到某个按键时,
47 *  
48 **********************************************************/
49 
50 void  key_task(void *pdata)
51 {
52    pdata=pdata;//防止编译器报错
53 
54    while(1)
55    {
56 /*k1按下*/
57         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET)//如果按键K1按下
58         {
59             OSTaskSuspend(LED1_TASK_PRIO);//挂起LED1任务,LED1停止闪烁
60         }
61     
62 /*k2按下*/
63         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==Bit_RESET)//如果按键K2按下
64         {
65     OSTaskResume(LED1_TASK_PRIO);//恢复LED1任务,LED1恢复闪烁
66         }
67 
68 /*k3按下*/
69         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==Bit_RESET)//如果按键K3按下
70         {
71     OSTaskDelReq(LED2_TASK_PRIO);//发出删除LED2任务请求,任务睡眠,无法恢复(需要现在LED2任务中加入判断删除)
72         }
73     
74         
75 /*k4按下*/
76         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==Bit_RESET)//如果按键K4按下
77         {
78         /*创建LED2任务*/    
79         OSTaskCreate(
80                                     led2_task,  //指向任务代码的指针
81                                     (void *)0,    //任务开始执行时,传递给任务参数的指针
82                                     (OS_STK *) & LED2_TASK_STK[LED2_STK_SIZE-1],//分配给任务堆栈的栈顶指针
83                                     LED2_TASK_PRIO//分配给任务的优先级
84                                 );
85         }
86         
87         delay_ms(10);
88     
89     }
90 }
View Code
 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:key.h
 4 *  文件功能:按键处理函数头文件
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8 
 9 
10 #ifndef  _KEY_H
11 #define  _KEY_H
12 
13 #include "pbdata.h"
14 
15 
16 
17 void KEY_GPIO(void);//key的GPIO初始化
18 
19 void  key_task(void *pdata);//key的任务处理函数
20 
21 
22 #endif
View Code

 

4、工程下载:

 http://download.csdn.net/detail/a1181803348/8829295

posted @ 2015-06-22 22:28  如风轻逸  阅读(775)  评论(0编辑  收藏  举报