金牌会员
- 积分
- 1544
- 金钱
- 1544
- 注册时间
- 2012-4-9
- 在线时间
- 80 小时
|
楼主 |
发表于 2014-6-19 20:21:02
|
显示全部楼层
主函数代码如下,是在F429的板子上做的,关于delay延时部分也是参照原子的代码去修改的,之前做两个灯同时闪的实验,也就是对应原子的UCOSII的第一个实验,能正常运行,但是做UCOSII的第二个实验时就不行了
问题1:红灯可以闪,但是按键按下之后绿灯不翻转,求解!
问题2:在UCOSII中,中断是否交给UCOSII的底层代码去处理,我只用分配每个任务的优先级就行了,这么理解对吗?
#include <stm32f4xx.h>
#include "delay.h"
#include "exti.h"
#include "key.h"
#include "led.h"
#include "includes.h"
//////////////////////////////////////////////////////////////
/******* UCOSII任务设置 *******/
/*
os_cfg.h中OS_TICKS_PER_SEC设置为200,即时间节拍为5ms,
OS_MAX_TASKS设置为10,即总共最多10个任务
*/
/* START任务 */
#define START_TASK_PRIO 10 //设置任务优先级为最低
#define START_STK_SIZE 64 //设置任务堆栈大小
OS_STK START_TASK_STK[START_STK_SIZE];//任务堆栈
void START_Task(void *pdata); //任务函数
/* REDLED任务 */
#define RLED_TASK_PRIO 7 //设置任务优先级
#define RLED_STK_SIZE 64 //设置任务堆栈大小
OS_STK RLED_TASK_STK[RLED_STK_SIZE]; //任务堆栈
void RLED_Task(void *pdata); //任务函数
/* 主任务 */
#define MAIN_TASK_PRIO 4 //设置任务优先级
#define MAIN_STK_SIZE 128 //设置任务堆栈大小
OS_STK MAIN_TASK_STK[MAIN_STK_SIZE]; //任务堆栈
void MAIN_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); //任务函数
//////////////////////////////////////////////////////////////
/* 全局变量设置 */
OS_EVENT * msg_key; //按键邮箱事件块指针
int main(void)
{
F4_Clock_Init();
Delay_Init(150); //延时初始化
LED_Init(); //LED端口初始化
KEY_Init(); //按键初始化
OSInit();
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;
msg_key = OSMboxCreate((void *)0);//创建消息邮箱
//OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
OS_ENTER_CRITICAL();//进入临界区,系统不响应任何中断
OSTaskCreate(RLED_Task,(void *)0,(OS_STK *)&RLED_TASK_STK[RLED_STK_SIZE-1],RLED_TASK_PRIO);
//OSTaskCreate(GLED_Task,(void *)0,(OS_STK *)&GLED_TASK_STK[GLED_STK_SIZE-1],GLED_TASK_PRIO);
OSTaskCreate(MAIN_Task,(void *)0,(OS_STK *)&MAIN_TASK_STK[MAIN_STK_SIZE]-1,MAIN_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(); //退出临界区,系统正常相应中断
}
//REDLED任务
void RLED_Task(void *pdata)
{
while(1)
{
LED_On(REDLED);
Delay_ms(80);
LED_Off(REDLED);
Delay_ms(920);
}
}
//主任务
void MAIN_Task(void *pdata)
{
u32 key = 0;
u8 err;
while(1)
{
key = (u32)OSMboxPend(msg_key,10,&err);//获取(请求)消息
switch(key)
{
case 1:
LED_Toggle(GREENLED);
break;
default:
break;
}
Delay_ms(10);
}
}
//按键扫描任务
void KEY_Task(void *pdata)
{
u8 key;
while(1)
{
key = KEY_Scan(0);
if(key)
{
OSMboxPost(msg_key,(void*)key);//发送消息
}
Delay_ms(10);
}
} |
|