3062|7

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ucos任务调用有问题 [复制链接]

 我在写基于ucosII任务时,出现这样一个问题。程序如下。这样调用时为什么最终结果LED1,LED2,LED3一直亮任务没有实现抢占调用,但是若把任一个任务注释掉例如//OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);可以实现抢占调度,即LED2,LED3交替灯亮。我用的板子是周立功EARM2131。
请教高手指点。谢谢!

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

#define          LED1        (1 << 18)                   // P1.18控制LED1
#define          LED2        (1 << 19)                   // P1.19控制LED2
#define    LED3  (1 << 20)               // P1.20控制LED3  

#define        Task0StkLengh        64                                // 定义用户任务0的堆栈长度
#define        TaskLED1StkSize        128                                // 定义任务TaskLED1的堆栈长度
#define        TaskLED2StkSize        128                                // 定义任务TaskLED2的堆栈长度
#define        TaskLED3StkSize        128                                // 定义任务TaskLED3的堆栈长度

OS_STK        Task0Stk [Task0StkLengh];                // 定义用户任务0的堆栈
OS_STK        TaskLED1Stk [TaskLED1StkSize];        // 定义任务TaskLED1的堆栈
OS_STK        TaskLED2Stk [TaskLED2StkSize];        // 定义任务TaskLED2的堆栈
OS_STK        TaskLED3Stk [TaskLED2StkSize];        // 定义任务TaskLED3的堆栈

void  Task0(void *pdata);                                // Task0 任务0
void  TaskLED1(void *data);                                // 任务TaskLED1
void  TaskLED2(void *data);                                // 任务TaskLED2
void  TaskLED3(void *data);                                // 任务TaskLED3

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :c语言的主函数,由它启动多任务环境
*********************************************************************************************************
*/
int main (void)
{
        OSInit ();                                                                                                                                                                                                               
        OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 0);               
        OSStart ();
        return 0;                                                                                                                       
}

/*
********************************************************************************************************
**                                                                         Task0 任务0
**                                                         完成目标板初始化和创建TaskLED1/2任务
********************************************************************************************************
*/

void Task0        (void *pdata)
{
        pdata = pdata;
        TargetInit ();
        OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);               
         OSTaskCreate (TaskLED2,(void *)0, &TaskLED2Stk[TaskLED2StkSize - 1], 4);       
        OSTaskCreate (TaskLED3,(void *)0, &TaskLED3Stk[TaskLED3StkSize - 1], 6);       
       
        while (1)
        {
                OSTimeDly(200);
        }
}

/*
********************************************************************************************************
**                                                                         TaskLED1
**                                                                     LED1任务
********************************************************************************************************
*/
void  TaskLED1(void *pdata)
{
    pdata = pdata;                                           // 避免编译警告

        PINSEL2 = PINSEL2 & (~0x08);                                    // P1[25:16]选择GPIO
                               
    IO1DIR |= LED1;                                                    // 设置LED1控制口输出
    IO1SET  = LED1;
   
    for (;;)
    {
      
        IO1CLR = LED1;
        OSTimeDly(OS_TICKS_PER_SEC / 8);
        IO1SET = LED1;
        OSTimeDly(OS_TICKS_PER_SEC / 4);
    }
}

/*
********************************************************************************************************
**                                                                         TaskLED2
**                                                                     LED2任务
********************************************************************************************************
*/
void  TaskLED2(void *pdata)
{
    pdata = pdata;                                           // 避免编译警告

        PINSEL2 = PINSEL2 & (~0x08);                                    // P1[25:16]选择GPIO                       
    IO1DIR |= LED2;                                                    // 设置LED2控制口输出
    IO1SET  = LED2;
   
    for (;;)
    {
        IO1CLR = LED2;
        OSTimeDly(OS_TICKS_PER_SEC / 4);
        IO1SET = LED2;
        OSTimeDly(OS_TICKS_PER_SEC / 2);
    }
}

   
/*********************************************************************************************************
**                            TaskLED3
                                LED3任务
********************************************************************************************************/
void  TaskLED3(void *pdata)
{
    pdata = pdata;                                           // 避免编译警告

        PINSEL2 = PINSEL2 & (~0x08);                                    // P1[25:16]选择GPIO

                               
    IO1DIR |= LED3;                                                    // 设置LED1控制口输出
    IO1SET  = LED3;
   
    for (;;)
    {
        IO1CLR = LED3;
        OSTimeDly(OS_TICKS_PER_SEC / 2);
        IO1SET = LED3;
        OSTimeDly(OS_TICKS_PER_SEC / 1);
    }
}

最新回复

我改了下分配任务堆栈的大小就可以了啊。。。  详情 回复 发表于 2009-8-15 21:09
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
应该是系统定义里限制了任务创建的数量,增大这个常量的值试试
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
“这样调用时为什么最终结果LED1,LED2,LED3一直亮任务没有实现抢占调用”

可能是它根本就没有运行起来吧,这只是你初始化LED后的现象。

你的最大任务数设置过小,或者你优先级有问题
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
检查OS_CFG.H头文件中的宏定义#define OS_MAX_TASKS,看是否设置过小
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 
最大任务数和优先级都设置过了怎么还是不行呢,,,,
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
看一下空闲任务的优先级设置的是多少?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
是不是堆栈大小设置的不对啊?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
我改了下分配任务堆栈的大小就可以了啊。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表