主题 : 为什么用ucos-II操作系统无法OSTimeDly 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 4140
精华: 0
发帖: 38
金钱: 250 两
威望: 146 点
贡献值: 0 点
综合积分: 76 分
注册时间: 2009-02-28
最后登录: 2013-01-02
楼主  发表于: 2009-05-18 21:43

 为什么用ucos-II操作系统无法OSTimeDly

管理提醒: 本帖被 qq2440 从 Linux技术交流专区 移动到本区(2009-12-27)
为什么用ucos-II操作系统无法OSTimeDly,我的程序是用ucos建立两个任务,一个做初始化优先级高,另一个做Led闪烁,led闪烁程序用OSTimeDly(1)做延时,可以闪烁一次,之后就停止了(死机)。这是为什么?请高手指点。附件里有我的程序。
附件: ucos.rar (186 K) 下载次数:60
级别: 新手上路
UID: 32259
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2010-11-12
最后登录: 2011-05-01
1楼  发表于: 2010-11-12 18:36

 回 6楼(shemily) 的帖子

我的也是这个问题,希望高手出现
级别: 新手上路
UID: 32259
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2010-11-12
最后登录: 2011-05-01
2楼  发表于: 2010-11-30 18:27
void Main(void)                            
{
    Target_Init();
……

void Target_Init(void)
{……
    Isr_Init();
    Port_Init();
    VIRQ_Relate_Task_Init();
    Timer1INT_Init();
}
/*
*************************************************************************************************************
- 函数名称 : VIRQ_Relate_task_Init(void)
- 函数说明 : 和任务调度相关的向量中断的初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void VIRQ_Relate_Task_Init(void)
{
    pISR_TIMER1 = (INT32U)UCOS_IRQHandler;                              // 在OS_CPU_A.S中定义,在OS_CPU.H中声明
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1INT_Init(void)
- 函数说明 : 定时器中断初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/    
void Timer1INT_Init(void)                                     //定时器接口使能
{
     if ((rINTPND & BIT_TIMER1))
    {
        rSRCPND |= BIT_TIMER1;
    }
    rINTMSK  &= ~(BIT_TIMER1);  //开中断;    
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1_Tick_ISR(void)
- 函数说明 : 系统时钟节拍中断服务子程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Timer1_Tick_ISR(void)
{
    
    OSTimeTick();
    ClearPending(BIT_TIMER1);
                                                                             //清除节拍中断
}
/*
*************************************************************************************************************
- 函数名称 : C_IRQHandler(void)
- 函数说明 : 切进UCOS中的处理IRQ的被调程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void  C_IRQHandler(void)
{
    INT32U reg;
    
    reg = rINTPND;
    
    switch (reg)
    {            
        case BIT_TIMER1:
        Timer1_Tick_ISR();                // 脉跳时钟节拍中断服务子程序
    break;
        default :
       break;
    }
}
总的来说,在板子初始化的时候,要为ucos的OSTimeDly,OSTimeHSMS等延时函数,关联到硬件设备的定时器上,上面是代码是:用TIMER1实现UCOS的延时,或者说时钟节拍。对TIMER1的中断向量的初始化,中断服务程序的指定。中断服务程序Timer1_Tick_ISR()里一定要调用OSTimeTick(),这样就把UCOS的时钟节拍与硬件关联起来了。