[uCOS/uCGUI] ucosii小程序,为啥2个任务不来回切换呢????????

fbi987996   2012-4-27 17:00 楼主

 

#include <includes.h>
#define RCC_GPIO_LED                    RCC_APB2Periph_GPIOF    /*LED使用的GPIO时钟*/
#define LEDn                            4                       /*神舟III号LED数量*/
#define GPIO_LED                        GPIOF                   /*神舟III号LED灯使用的GPIO组*/
 #define  OS_PRIO_SELF              0xFFu  
#define DS1_PIN                         GPIO_Pin_6              /*DS1使用的GPIO管脚*/
#define DS2_PIN                         GPIO_Pin_7    /*DS2使用的GPIO管脚*/
#define DS3_PIN                         GPIO_Pin_8     /*DS3使用的GPIO管脚*/
#define DS4_PIN                         GPIO_Pin_9    /*DS4使用的GPIO管脚*/
//#define   KEY1 (1 << 20)           /* P0.20为KEY1 */
//#define   BEEP (1 << 7)            /* P0.07为蜂鸣器 */

#define TaskStkLengh 64   //Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK TaskStk0[TaskStkLengh];  //Define the Task0 stack 定义用户任务0的堆栈
OS_STK TaskStk1[TaskStkLengh];
OS_STK TaskStk2[TaskStkLengh];  //Define the Task1 stack 定义用户任务1的堆栈
//void Delay(vu32 nCount);
void  Task0(void *pdata);   //Task0 任务0
void  Task1(void *pdata);   //Task0 任务1
void  Task2(void *pdata);

void RCC_Configuration(void);
void NVIC_Configuration(void);
void Delay1(vu32 nCount);
void Turn_On_LED(u8 LED_NUM);
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
u8 count=0;

 

int main(void)
{
 OSInit ();
                         
 OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 2);  
 OSStart ();
 return 0;               
}

void Task0(void *pdata)
{  pdata = pdata;
//   BSP_Init();                                                 /* Initialize BSP functions                                 */
//   #if (OS_TASK_STAT_EN > 0)
//    OSStatInit();                                               /* Determine CPU capacity                                   */
//   #endif
 OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 5);
 OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 6);
  
  // GPIO_ResetBits(GPIO_LED,DS3_PIN|DS4_PIN); 
 //GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);/*关闭所有的LED指示灯*/
 // Turn_On_LED(count%4); //点亮一个LED灯  
 // count++;
     
     while(1)
     {
       OSTaskSuspend(0x2FFFFF);
     }
  Delay1(0x2FFFFF);
 Delay1(0x2FFFFF); 
   
//  OSTimeDlyHMSM(0,0,0,500);

}

void  Task1(void *pdata)
{
   pdata = pdata;
   RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); /*使能LED灯使用的GPIO时钟*/

   GPIO_InitStructure.GPIO_Pin = DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
   GPIO_Init(GPIO_LED, &GPIO_InitStructure); 
 while(1)
    {
     GPIO_ResetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);/*开启所有的LED指示灯*/
// GPIO_ResetBits(GPIO_LED,DS2_PIN|DS3_PIN);/*关闭所有的LED指示灯*/
//  Turn_On_LED(count%4); //点亮一个LED灯  
//  count++;
     
//  //GPIO_ResetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);
  Delay1(0x2FFFFF);
// OSTaskSuspend(OS_PRIO_SELF);
// Delay(0x200000);
 OSTimeDly(OS_TICKS_PER_SEC);
// 
    }
  // OSTimeDly(OS_PRIO_SELF);
}


void  Task2(void *pdata)
{
   pdata = pdata;

 // OSTaskResume() ;

 // GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN);/*关闭所有的LED指示灯*/
   while(1)
   {
     GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);/*关闭所有的LED指示灯*/
  Delay1(0x2FFFFF);
   GPIO_ResetBits(GPIO_LED,DS1_PIN|DS2_PIN);/*关闭所有的LED指示灯*/
   Delay1(0x2FFFFF);
   GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);/*关闭所有的LED指示灯*/
    Delay1(0x2FFFFF);
//  Turn_On_LED(count%4); //点亮一个LED灯  
//  count++;
//     
//  //GPIO_ResetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);
//  Delay1(0x2FFFFF);
// Delay(0x2FFFFF);
    OSTimeDly(OS_TICKS_PER_SEC);
   //  OSTaskResume(5);
  }
// 
}

[ 本帖最后由 fbi987996 于 2012-4-27 17:43 编辑 ]

回复评论 (7)

现在的现象就是 先进入任务1,全部点亮 然后进入任务2 全灭。。。然后就一直灭着了。。。。这是为啥。。
不是应该 任务1挂起 任务2执行 到任务1时间到 重新点亮。。这么循环吗??
点赞  2012-4-27 17:01
改变一哈延时时间试试
点赞  2012-5-2 00:00
我也碰到了同样的问题,请问怎么解决啊???
点赞  2012-7-25 14:39
这个书上有介绍, OSTimeDly(OS_TICKS_PER_SEC);
两个函数调用一样的时间,当任务一 处理完里面处理任务二,几乎没有延时,人眼分辨不出灯有没有闪耀。    ,此是本菜鸟分析
点赞  2012-7-26 10:34

回复 楼主 fbi987996 的帖子

心跳定时器,也就是定时中断,没有设置好吧
点赞  2012-7-30 16:40
我往atmega16移植也遇到这个问题 初步判断是心跳定时器没设置好 但改来改去也不行 该怎么设置啊 设置程序如下
void TimerInit( void )
{
        TCCR2 = 1<<3;                                                                                                /* 工作于CTC模式, 不在相应端口输出信号 */
        OCR2= 0x42;
        TCNT2 = 0;
        TIMSK |= 1<<7;                                                                                             
        TCCR2 |= 0x06;        //预分频256                                                                                   /* 开启时钟 */
}
点赞  2012-7-31 17:00

终于找到原因了

发现问题了  是中断向量名字的问题 由于使用的winavr gcc的版本不同 中断向量名字是不一样的 大家查下头文件就知道了  终于将ucosII移植到atmega16 并调试通过了 呵呵
点赞  2012-7-31 22:17
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复