| 
 
初级会员 
 
	积分142金钱142 注册时间2016-9-11在线时间22 小时 | 
 
 
 楼主|
发表于 2016-11-28 14:39:08
|
显示全部楼层 
| 但是实验例程里也有个类似的,也是三个任务,当它的任务堆栈大小就是64,可以运行,为啥呢?
 #include "led.h"
 #include "beep.h"
 #include "delay.h"
 #include "key.h"
 #include "sys.h"
 #include "usart.h"
 #include "includes.h"
 
 #define START_TASK_PRIO                              10
 #define START_STK_SIZE                                  64
 OS_STK START_TASK_STK[START_STK_SIZE];
 void start_task(void *pdata);
 
 
 
 #define LED_TASK_PRIO                               7
 #define LED_STK_SIZE                                      64
 OS_STK LED_TASK_STK[LED_STK_SIZE];
 void led_task(void *pdata);
 
 
 #define BEEP_TASK_PRIO                               5
 #define BEEP_STK_SIZE                                          64
 OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
 void beep_task(void *pdata);
 
 
 #define KEY_TASK_PRIO                               3
 #define KEY_STK_SIZE                                          64
 OS_STK KEY_TASK_STK[KEY_STK_SIZE];
 void key_task(void *pdata);
 
 int main(void)
 {
 
 
 delay_init();                     //延时函数初始化
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
 uart_init(9600);
 LED_Init();                                  //初始化与LED连接的硬件接口
 BEEP_Init();                        //蜂鸣器初始化
 KEY_Init();                                //按键初始化
 OSInit();                                   //初始化UCOSII
 OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
 OSStart();
 }
 
 //开始任务
 void start_task(void *pdata)
 {
 OS_CPU_SR cpu_sr=0;
 pdata = pdata;
 OSStatInit();                                        //初始化统计任务.这里会延时1秒钟左右
 OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)
 OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);
 OSTaskCreate(beep_task,(void *)0,(OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-1],BEEP_TASK_PRIO);
 OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
 OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
 OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
 }
 //LED任务
 void led_task(void *pdata)
 {
 while(1)
 {
 LED0=!LED0;
 LED1=!LED1;
 delay_ms(500);
 }
 }
 
 //蜂鸣器任务
 void beep_task(void *pdata)
 {
 while(1)
 {
 if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ) //判断是否有删除请求
 {
 OSTaskDel(OS_PRIO_SELF);                                                   //删除任务本身TaskLed
 }
 BEEP=1;
 delay_ms(60);
 BEEP=0;
 delay_ms(940);
 }
 }
 
 //按键扫描任务
 void key_task(void *pdata)
 {
 u8 key;
 while(1)
 {
 key=KEY_Scan(0);
 if(key==KEY0_PRES)
 {
 OSTaskSuspend(LED_TASK_PRIO);//挂起LED任务,LED停止闪烁
 }
 else if (key==KEY2_PRES)
 {
 OSTaskResume(LED_TASK_PRIO);        //恢复LED任务,LED恢复闪烁
 }
 else if (key==WKUP_PRES)
 {
 OSTaskDelReq(BEEP_TASK_PRIO);        //发送删除BEEP任务请求,任务睡眠,无法恢复
 }
 else if(key==KEY1_PRES)
 {
 OSTaskCreate(beep_task,(void *)0,(OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-1],BEEP_TASK_PRIO);//重新创建任务beep
 }
 delay_ms(10);
 }
 }
 
 
 
 | 
 |