打印
[ZLG-ARM]

用周工2131工程模板+ucosii 有个问题请大家帮忙啊

[复制链接]
1450|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlrt|  楼主 | 2007-11-19 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用周工2131工程模板+ucosii 有个问题请大家帮忙啊

 我是初学者,想试验一下使用信号量功能 程序如下:

#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh    64            //Define the Task0 stack length 定义用户任务0的堆栈长度
 
OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 OS_STK  Taskdisp_1 [TaskStkLengh];
OS_STK  Taskdisp_2 [TaskStkLengh];
uint8 i;
uint8 a1[5];
uint8 b1[5];

void __irq irq_rtc(void)
{
  ILR = 0x03;                   // 清除中断标志 
  VICVectAddr = 0x00;

    
  write_rtc();
 

}


void init_ic(void)
 {
    CCR=0x02;//reset RTC
    ILR=0x03;//clear interrupt flag
    CIIR=0x01;//second increament interrupt
    AMR=0xff;//alarm not interrupt
    PREINT=365;//PREINT = int (pclk / 32768) - 1;
    PREFRAC=6912;//PREFRAC = pclk - ((PREINT +1) x 32768);
    
    VICIntSelect =0x00000000;
    
    VICVectCntl10=0x20|13;
    VICVectAddr10=(uint32)irq_rtc;
    VICIntEnable=(1<<13);
 
    CCR=0x01;//enable RTC
   
 }



void     Task0(void *pdata);            //声明Task0 任务0
void    Task1(void *pdata);         //声明Task0 任务1
void    Task2(void *pdata);
OS_EVENT *DispSem;

        int main (void)
{
    OSInit ();    
    DispSem=OSSemCreate(1);                                                                                                    
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);        
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

        void Task0    (void *pdata)
{   
    pdata = pdata;
    //TargetInit ();
    PINSEL0=0;
         PINSEL1=0;
    PINSEL2=0;      
     IO0DIR=0x01e81c70;
     IO1DIR=0xf3ff0000;//P1.31,P1.30,P1.29 P1.28are output
    
    
    init_ic();
    init_lcd();
    read_date();
    
 
   
    OSTaskCreate(Task1,(void *)0,&Taskdisp_1[TaskStkLengh-1],3);
    OSTaskCreate(Task2,(void *)0,&Taskdisp_2[TaskStkLengh-1],4);
    while (1)
    {
  
    
      OSTimeDly(10);
        
  
   
   
    }
}
   
   /*********************************************************************************************************
**                           Task1
********************************************************************************************************/
void Task1 (void *pdata)

  uint8 err;
  pdata = pdata;

  
   while(1)
  {
  OSSemPend(DispSem,0,& err);
   turn_on_lcd();            //液晶循环显示图片1
   delay(2000000);
   disp_1();
   delay(2000000);
   disp_void(0,0,6,192);
   OSTimeDly(10);
  err=OSSemPost(DispSem);
   }
}

  /*********************************************************************************************************
**                           Task2
********************************************************************************************************/
void Task2 (void *pdata)
{ uint8 err;
  pdata=pdata;
  
   while(1)
  {
  OSSemPend(DispSem,0,& err);
   delay(2000000);
   disp_2();             //液晶循环显示图片2
   delay(2000000);
   disp_void(0,0,6,192);
   delay(2000000); 
   //OSTimeDly(10);
   err=OSSemPost(DispSem); 
   }

}


   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
 结果是:只显示了图片1 而且只显示1次 ,也就是任务2 根本没有被执行
    。。。。郁闷好久,请大家帮忙看看阿 
           。。。。。不胜感激!!!

相关帖子

沙发
lyl831015| | 2007-11-19 19:33 | 只看该作者

任务1堆栈

我也是菜鸟,还没有看出问题,但是你任务1的堆栈都没有定义!

使用特权

评论回复
板凳
lyl831015| | 2007-11-20 08:44 | 只看该作者

信号量

任务1最后添加一个延时.否则低优先级任务(任务2)得不到响应.

使用特权

评论回复
地板
wlrt|  楼主 | 2007-11-20 09:17 | 只看该作者

您好,我加了延时,任务2是进去了,但还有问题。。。

您好,谢谢您的回复,任务1堆栈是我书写的有误,已经定义过了,现在我在2个任务中都加了延时:


#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh    128            //Define the Task0 stack length 定义用户任务0的堆栈长度
 
OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 OS_STK  Taskdisp_1 [TaskStkLengh];
OS_STK  Taskdisp_2 [TaskStkLengh];
uint8 i;
uint8 a1[5];
uint8 b1[5];
uint32 year,month,day,week,hour,minute,second;
uint8 flag=0;

void __irq irq_rtc(void)
{
  ILR = 0x03;                   // 清除中断标志 
  VICVectAddr = 0x00;

    
  write_rtc();


}


void init_ic(void)
 {
    CCR=0x02;//reset RTC
    ILR=0x03;//clear interrupt flag
    CIIR=0x01;//second increament interrupt
    AMR=0xff;//alarm not interrupt
    PREINT=365;//PREINT = int (pclk / 32768) - 1;
    PREFRAC=6912;//PREFRAC = pclk - ((PREINT +1) x 32768);
    
    VICIntSelect =0x00000000;
    
    VICVectCntl10=0x20|13;
    VICVectAddr10=(uint32)irq_rtc;
    VICIntEnable=(1<<13);
     CCR=0x01;//enable RTC
   
 }



void  Task0(void *pdata);            //声明Task0 
void    Task1(void *pdata);         //声明Task0 任务1
void    Task2(void *pdata);
OS_EVENT *DispSem;

        int main (void)
{
    OSInit ();    
    DispSem=OSSemCreate(1);                                                                                                    
   OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);        
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

        void Task0    (void *pdata)
{   
    pdata = pdata;
    
    PINSEL0=0;
         PINSEL1=0;
    PINSEL2=0;       
     IO0DIR=0x01e81c70;
     IO1DIR=0xf3ff0000;//P1.31,P1.30,P1.29 P1.28are output
    

    init_ic();
    init_lcd();
    read_date();
    
 
   
    OSTaskCreate(Task1,(void *)0,&Taskdisp_1[TaskStkLengh-1],3);
    OSTaskCreate(Task2,(void *)0,&Taskdisp_2[TaskStkLengh-1],4);
    while (1)
    {
  
    
      OSTimeDly(10);
        
  
   
   
    }
}
   
   /*********************************************************************************************************
**                           Task1
********************************************************************************************************/
void Task1 (void *pdata)

  uint8 err;
  pdata = pdata;

  
   while(1)
  {
  OSSemPend(DispSem,0,& err);
   turn_on_lcd();
   delay(2000000);
   disp_1();
   delay(2000000);
   disp_void(0,0,6,192);
  
  err=OSSemPost(DispSem);
  
   OSTimeDly(10);
   }
}

  /*********************************************************************************************************
**                           Task2
********************************************************************************************************/
void Task2 (void *pdata)
{ uint8 err;
  pdata=pdata;
  
   while(1)
  {
  OSSemPend(DispSem,0,& err);
   delay(2000000);
   disp_2();
   delay(2000000);
   disp_void(0,0,6,192);
   delay(2000000); 
  
   err=OSSemPost(DispSem); 
   OSTimeDly(10);
   }

}


   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
现在问题是,2个任务中的循环只执行一次 ,也就是按顺序显示了任务1和任务2的图片,但只显示了一次,没有再继续循环显示。是不是任务2执行完后没有再调用任务1了?这问题出在哪呢?期待回复,谢谢了

使用特权

评论回复
5
wlrt|  楼主 | 2007-11-20 16:41 | 只看该作者

请大家帮忙看看啊

请大家帮忙看看啊  是不是工程模板里 还有哪里要配置呢?? 郁闷好久了...

使用特权

评论回复
6
lyl831015| | 2007-11-20 19:47 | 只看该作者

我发现的问题

1、不应操作 PINSEL2,修改了调试模式;
2、中断的使用不当,建议使用受操作系统管理的ISR;使用句柄;

使用特权

评论回复
7
yongtree| | 2007-11-20 22:18 | 只看该作者

两个都在PEND,饿死了!

使用特权

评论回复
8
yongtree| | 2007-11-20 22:24 | 只看该作者

看错了,按照说的情况,好像是没有系统时钟,应该是一直

使用特权

评论回复
9
wlrt|  楼主 | 2007-11-21 11:10 | 只看该作者

谢谢你们, 问题解决了。。。

谢谢你们, 问题解决了。。。
   是系统时钟的问题 ,我把模板中的time0()给屏蔽了。。。无法产生正确的时钟节拍了。。。哈哈。。。
再次谢谢你们

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

1

粉丝