初级会员
- 积分
- 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);
}
}
|
|