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 }

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 }

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

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 }

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 }

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

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 }

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
4、工程下载:
http://download.csdn.net/detail/a1181803348/8829295