OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4366|回复: 2

还是UCOS任务数量的问题

[复制链接]

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
发表于 2016-5-11 17:09:56 | 显示全部楼层 |阅读模式
上午发过帖子,原子的网络实验2 LWIP带UCOS操作系统移植只能创建6个任务,多于6个的后面不运行,继续测试发现例程网络实验7 NETCONN_UDP实验中只能运行5个任务。因为在函数 udp_demo_init()中创建了一个OSTaskCreate(udp_thread,(void*)0,(OS_STK*)&UDP_TASK_STK[UDP_STK_SIZE-1],UDP_PRIO)UDP线程,所以后面能创建的任务比实验2少了一个,下午继续测试例程实验56 UCOSII实验1-1-任务调度发现只能创建9个任务。实在不明白,UCOSII的任务数量不是最多可有63个吗?为什么只能创建9个?任务最低优先级定义的是63.
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"
#include "lcd.h"


//ALIENTEK 探索者STM32F407开发板 实验56
//UCOSII实验1-任务调度 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK




/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO                              30 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE                                  64
//任务堆栈       
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);       
                          
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO                               6
//设置任务堆栈大小
#define LED0_STK_SIZE                                      64
//任务堆栈       
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);




//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO                               7
//设置任务堆栈大小
#define LED1_STK_SIZE                                          64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);


//在LCD上显示地址信息任务1
//任务优先级
#define DISPLAY1_TASK_PRIO        9
//任务堆栈大小
#define DISPLAY1_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY1_TASK_STK[DISPLAY1_STK_SIZE];
//任务函数
void display1_task(void *pdata);




//在LCD上显示地址信息任务2
//任务优先级
#define DISPLAY2_TASK_PRIO        10
//任务堆栈大小
#define DISPLAY2_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY2_TASK_STK[DISPLAY2_STK_SIZE];
//任务函数
void display2_task(void *pdata);




//在LCD上显示地址信息任务3
//任务优先级
#define DISPLAY3_TASK_PRIO        11
//任务堆栈大小
#define DISPLAY3_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY3_TASK_STK[DISPLAY3_STK_SIZE];
//任务函数
void display3_task(void *pdata);




//在LCD上显示地址信息任务4
//任务优先级
#define DISPLAY4_TASK_PRIO        12
//任务堆栈大小
#define DISPLAY4_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY4_TASK_STK[DISPLAY4_STK_SIZE];
//任务函数
void display4_task(void *pdata);




//在LCD上显示地址信息任务5
//任务优先级
#define DISPLAY5_TASK_PRIO        13
//任务堆栈大小
#define DISPLAY5_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY5_TASK_STK[DISPLAY5_STK_SIZE];
//任务函数
void display5_task(void *pdata);


//在LCD上显示地址信息任务6
//任务优先级
#define DISPLAY6_TASK_PRIO        14
//任务堆栈大小
#define DISPLAY6_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY6_TASK_STK[DISPLAY6_STK_SIZE];
//任务函数
void display6_task(void *pdata);


//在LCD上显示地址信息任务7
//任务优先级
#define DISPLAY7_TASK_PRIO        15
//任务堆栈大小
#define DISPLAY7_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY7_TASK_STK[DISPLAY7_STK_SIZE];
//任务函数
void display7_task(void *pdata);


//在LCD上显示地址信息任务8
//任务优先级
#define DISPLAY8_TASK_PRIO        16
//任务堆栈大小
#define DISPLAY8_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY8_TASK_STK[DISPLAY8_STK_SIZE];
//任务函数
void display8_task(void *pdata);


//在LCD上显示地址信息任务9
//任务优先级
#define DISPLAY9_TASK_PRIO        17
//任务堆栈大小
#define DISPLAY9_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY9_TASK_STK[DISPLAY9_STK_SIZE];
//任务函数
void display9_task(void *pdata);


//在LCD上显示地址信息任务10
//任务优先级
#define DISPLAY10_TASK_PRIO        18
//任务堆栈大小
#define DISPLAY10_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY10_TASK_STK[DISPLAY10_STK_SIZE];
//任务函数
void display10_task(void *pdata);


int main(void)
{

        delay_init(168);                  //初始化延时函数
        LED_Init();                        //初始化LED端口
        LCD_Init();                          //LCD初始化
        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;
          OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)   
        OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);                                                  
        OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);


        OSTaskCreate(display1_task,(void*)0,(OS_STK*)&DISPLAY1_TASK_STK[DISPLAY1_STK_SIZE-1],DISPLAY1_TASK_PRIO); //显示任务1
        OSTaskCreate(display2_task,(void*)0,(OS_STK*)&DISPLAY2_TASK_STK[DISPLAY2_STK_SIZE-1],DISPLAY2_TASK_PRIO); //显示任务2
        OSTaskCreate(display3_task,(void*)0,(OS_STK*)&DISPLAY3_TASK_STK[DISPLAY3_STK_SIZE-1],DISPLAY3_TASK_PRIO); //显示任务3
        OSTaskCreate(display4_task,(void*)0,(OS_STK*)&DISPLAY4_TASK_STK[DISPLAY4_STK_SIZE-1],DISPLAY4_TASK_PRIO); //显示任务4
        OSTaskCreate(display5_task,(void*)0,(OS_STK*)&DISPLAY5_TASK_STK[DISPLAY5_STK_SIZE-1],DISPLAY5_TASK_PRIO); //显示任务5
        OSTaskCreate(display6_task,(void*)0,(OS_STK*)&DISPLAY6_TASK_STK[DISPLAY6_STK_SIZE-1],DISPLAY6_TASK_PRIO); //显示任务6
        OSTaskCreate(display7_task,(void*)0,(OS_STK*)&DISPLAY7_TASK_STK[DISPLAY7_STK_SIZE-1],DISPLAY7_TASK_PRIO); //显示任务7
        OSTaskCreate(display8_task,(void*)0,(OS_STK*)&DISPLAY8_TASK_STK[DISPLAY8_STK_SIZE-1],DISPLAY8_TASK_PRIO); //显示任务8
        OSTaskCreate(display9_task,(void*)0,(OS_STK*)&DISPLAY9_TASK_STK[DISPLAY9_STK_SIZE-1],DISPLAY9_TASK_PRIO); //显示任务9
        OSTaskCreate(display10_task,(void*)0,(OS_STK*)&DISPLAY10_TASK_STK[DISPLAY10_STK_SIZE-1],DISPLAY10_TASK_PRIO); //显示任务10
               
        OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
        OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
}


//LED0任务
void led0_task(void *pdata)
{                
        while(1)
        {
                LED0=0;
                delay_ms(80);
                LED0=1;
                delay_ms(920);
        };
}


//LED1任务
void led1_task(void *pdata)
{          
        while(1)
        {
                LED1=0;
                delay_ms(300);
                LED1=1;
                delay_ms(300);
        };
}


//显示信息1
void display1_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,190,200,20,16,"1");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息2
void display2_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,210,200,20,16,"2");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息3
void display3_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,230,200,20,16,"3");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息4
void display4_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,250,200,20,16,"4");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息5
void display5_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,270,200,20,16,"5");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息6
void display6_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,290,200,20,16,"6");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息7
void display7_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,310,200,20,16,"7");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息8
void display8_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,330,200,20,16,"8");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息9
void display9_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,350,200,20,16,"9");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}


//显示信息10
void display10_task(void *pdata)
{
        while(1)
        {
                LCD_ShowString(30,370,200,20,16,"10");                
                OSTimeDlyHMSM(0,0,0,500);
        }
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-11 17:25:37 | 显示全部楼层
实验56里面UCOSII的任务数被限定在了10个!文件os_cfg.h文件中的宏OS_MAX_TASKS确定任务数量!
7`[D@6U_9IFWFHO4S0NK5FQ.png
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-5-11 17:33:12 | 显示全部楼层
非常感谢!困扰几天的问题终于解决了!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 05:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表