| 
 
金牌会员  
 
	积分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);
 }
 }
 | 
 |