OpenEdv-开源电子网

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

原子的网络实验2 LWIP带UCOS操作系统移植为什么只能运行5个任务?

[复制链接]

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
发表于 2016-5-11 09:29:50 | 显示全部楼层 |阅读模式
请问原子的网络实验2 LWIP带UCOS操作系统移植为什么只能运行5个任务?只能运行在START任务中最前面创建的5个任务,后面的都不运行,即使将后面不运行的任务优先级改变为最高也不行。还请原子解答。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-11 10:11:29 | 显示全部楼层
代码问题,测试6个任务都没有问题。
回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-5-11 10:27:52 | 显示全部楼层
zuozhongkai 发表于 2016-5-11 10:11
代码问题,测试6个任务都没有问题。

有时候是能运行6个。在原程序基础上只改了主程序,最后创建的任务不运行,,搞几天都搞不定有劳版主帮忙看看是怎么回事,多谢了!#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lwip_comm.h"
#include "LAN8720.h"
#include "usmart.h"
#include "timer.h"
#include "lcd.h"
#include "sram.h"
#include "malloc.h"
#include "lwip_comm.h"
#include "includes.h"
#include "lwipopts.h"

//ALIENTEK 探索者STM32F407开发板
//LWIP LWIP+UCOS操作系统移植实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司


//在LCD上显示地址信息任务
//任务优先级
#define DISPLAY_TASK_PRIO        8
//任务堆栈大小
#define DISPLAY_STK_SIZE        128
//任务堆栈
OS_STK        DISPLAY_TASK_STK[DISPLAY_STK_SIZE];
//任务函数
void display_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);


//LED任务
//任务优先级
#define LED_TASK_PRIO                14
//任务堆栈大小
#define LED_STK_SIZE                64
//任务堆栈
OS_STK        LED_TASK_STK[LED_STK_SIZE];
//任务函数
void led_task(void *pdata);  


//START任务
//任务优先级
#define START_TASK_PRIO                15
//任务堆栈大小
#define START_STK_SIZE                128
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);

//在LCD上显示地址信息
//mode:1 显示DHCP获取到的地址
//          其他 显示静态地址
void show_address(u8 mode)
{
        u8 buf[30];
        if(mode==2)
        {
                sprintf((char*)buf,"DHCP IP :%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);                                                //打印动态IP地址
                LCD_ShowString(30,130,210,16,16,buf);
                sprintf((char*)buf,"DHCP GW :%d.%d.%d.%d",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);        //打印网关地址
                LCD_ShowString(30,150,210,16,16,buf);
                sprintf((char*)buf,"NET MASK:%d.%d.%d.%d",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);        //打印子网掩码地址
                LCD_ShowString(30,170,210,16,16,buf);
        }
        else
        {
                sprintf((char*)buf,"Static IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);                                                //打印动态IP地址
                LCD_ShowString(30,130,210,16,16,buf);
                sprintf((char*)buf,"Static GW:%d.%d.%d.%d",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);        //打印网关地址
                LCD_ShowString(30,150,210,16,16,buf);
                sprintf((char*)buf,"NET MASK :%d.%d.%d.%d",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);        //打印子网掩码地址
                LCD_ShowString(30,170,210,16,16,buf);
        }       
}

int main(void)
{
        delay_init(168);               //延时初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //中断分组配置
        uart_init(115200);            //串口波特率设置
        usmart_dev.init(84);         //初始化USMART
        LED_Init();                          //LED初始化
        KEY_Init();                          //按键初始化
        LCD_Init();                          //LCD初始化
       
        FSMC_SRAM_Init();                //SRAM初始化
       
        mymem_init(SRAMIN);          //初始化内部内存池
        mymem_init(SRAMEX);          //初始化外部内存池
        mymem_init(SRAMCCM);         //初始化CCM内存池
       
        POINT_COLOR = RED;                 //红色字体
        LCD_ShowString(30,30,200,20,16,"Explorer STM32F4");
        LCD_ShowString(30,50,200,20,16,"LWIP+UCOS Test");
        LCD_ShowString(30,70,200,20,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,90,200,20,16,"2014/9/1");

        OSInit();                                         //UCOS初始化
        while(lwip_comm_init())         //lwip初始化
        {
                LCD_ShowString(30,110,200,20,16,"Lwip Init failed!");         //lwip初始化失败
                delay_ms(500);
                LCD_Fill(30,110,230,150,WHITE);
                delay_ms(500);
        }
        LCD_ShowString(30,110,200,20,16,"Lwip Init Success!");                 //lwip初始化成功
        OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);
        OSStart(); //开启UCOS
}

//start任务
void start_task(void *pdata)
{
        OS_CPU_SR cpu_sr;
        pdata = pdata ;
       
        OSStatInit();                          //初始化统计任务
        OS_ENTER_CRITICAL();          //关中断
#if LWIP_DHCP
        lwip_comm_dhcp_creat(); //创建DHCP任务
#endif
       
        OSTaskCreate(display_task,(void*)0,(OS_STK*)&DISPLAY_TASK_STK[DISPLAY_STK_SIZE-1],DISPLAY_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(led_task,(void*)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);//创建LED任务
        OSTaskCreate(display5_task,(void*)0,(OS_STK*)&DISPLAY5_TASK_STK[DISPLAY5_STK_SIZE-1],DISPLAY5_TASK_PRIO); //显示任务5
        OSTaskSuspend(OS_PRIO_SELF); //挂起start_task任务
        OS_EXIT_CRITICAL();                  //开中断
}

//显示地址等信息
void display_task(void *pdata)
{
        while(1)
        {
#if LWIP_DHCP                                                                        //当开启DHCP的时候
                if(lwipdev.dhcpstatus != 0)                         //开启DHCP
                {
                        show_address(lwipdev.dhcpstatus );        //显示地址信息
                        OSTaskSuspend(OS_PRIO_SELF);                 //显示完地址信息后挂起自身任务
                }
#else
                show_address(0);                                                 //显示静态地址
                OSTaskSuspend(OS_PRIO_SELF);                         //显示完地址信息后挂起自身任务
#endif //LWIP_DHCP
                OSTimeDlyHMSM(0,0,0,500);
        }
}

//led任务
void led_task(void *pdata)
{
        while(1)
        {
                LED0 = !LED0;
                OSTimeDlyHMSM(0,0,0,500);  //延时500ms
        }
}


//显示信息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);
        }
}











回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-5-11 10:29:43 | 显示全部楼层
这个不运行显示任务5,如果与LED任务创建位置换一下则LED任务不运行。
回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-5-11 10:32:12 | 显示全部楼层
本帖最后由 lrser 于 2016-5-11 10:35 编辑

在例程网络实验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少了一个?
回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-5-11 10:53:14 | 显示全部楼层
能创建的任务数量不是由最低优先级决定的吗?我看到定义的是63啊。
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-5-15
在线时间
36 小时
发表于 2016-5-15 14:36:41 | 显示全部楼层
楼主解决了吗?我也遇到一样的问题,系统只能跑6个任务,再多就不行了,修改优先级也没用
回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-5-16 17:42:28 | 显示全部楼层
qwdx2011 发表于 2016-5-15 14:36
楼主解决了吗?我也遇到一样的问题,系统只能跑6个任务,再多就不行了,修改优先级也没用

在OS_CFG.H文件中:
#define OS_LOWEST_PRIO           63u  系统最低优先级,不可高于254
#define OS_MAX_EVENTS            10u  系统最大事件数
#define OS_MAX_FLAGS              5u  系统最大的信号量集数
#define OS_MAX_MEM_PART           5u  内存块数目
#define OS_MAX_QS                 5u  Max. number of queue control blocks in your application
#define OS_MAX_TASKS             60u  同时运行的任务数量,必须>=2
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 21:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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