完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问原子的网络实验2 LWIP带UCOS操作系统移植为什么只能运行5个任务?只能运行在START任务中最前面创建的5个任务,后面的都不运行,即使将后面不运行的任务优先级改变为最高也不行。还请原子解答。
|
|
相关推荐
7个回答
|
|
代码问题,测试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); } } |
|
|
|
这个不运行显示任务5,如果与LED任务创建位置换一下则LED任务不运行。
|
|
|
|
在例程网络实验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少了一个?
|
|
|
|
能创建的任务数量不是由最低优先级决定的吗?我看到定义的是63啊。
|
|
|
|
楼主解决了吗?我也遇到一样的问题,系统只能跑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 |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2464 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2240 浏览 5 评论
3016 浏览 3 评论
2693 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2669 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
447浏览 1评论
715浏览 0评论
797浏览 0评论
496浏览 0评论
304浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-12 00:51 , Processed in 1.217032 second(s), Total 90, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191