完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大工程,一步步实现吧。
|
|
|
|
|
|
|
|
你先去学习网络的知识吧。
|
|
|
|
恩恩,谢谢指点,关键是时间有点紧迫,我的基础也不好,都不知道现在该怎么办
|
|
|
|
麻烦问问,需要用UCOS的操作系统吗?
|
|
|
|
可以用,可以不用
|
|
|
|
原子个,我把摄像头和网络通信两个实验整合了一下,可是出现了这类错误:
..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching dcmi.o(.data). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching raw.o(.data). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.bss). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f40_41xxx.o(STACK). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching usmart_config.o(.data). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.bss). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching tcp_server_demo.o(.bss). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching etharp.o(.bss). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching libspace.o(.bss). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching test.o(.data). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching lwip_comm.o(.bss). ..OBJTEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching dhcp.o(.bss). ..OBJTEST.axf: Error: L6407E: Sections of aggregate size 0x1b328 bytes could not fit into .ANY selector(s). 我把代码发出来,你帮帮看看吧,原子哥 #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 "adc.h" #include "rtc.h" #include "sram.h" #include "malloc.h" #include "beep.h" #include "lwip_comm.h" #include "tcp_client_demo.h" #include "tcp_server_demo.h" #include "udp_demo.h" #include "httpd.h" #include "led.h" #include "key.h" #include "usart2.h" #include "ov2640.h" #include "dcmi.h" /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// u8 ov2640_mode=0;//????:0,RGB565??;1,JPEG?? #define jpeg_buf_size 31*1024 //??JPEG????jpeg_buf???(*4??) __align(4) u32 jpeg_buf[jpeg_buf_size];//JPEG????buf volatile u32 jpeg_data_len=0; //buf??JPEG?????? volatile u8 jpeg_data_ok=0;//JPEG???????? //0,???????; //1,??????,??????; //2,?????????,????????? //JPEG?????? const u16 jpeg_img_size_tbl[][2]= { 160,120,//QQVGA 176,144,//QCIF 320,240,//QVGA 400,240,//WQVGA 352,288,//CIF 640,480,//VGA 800,600,//SVGA 1024,768,//XGA 1280,800,//WXGA 1280,960,//XVGA 1440,900,//WXGA+ 1280,1024,//SXGA 1600,1200,//UXGA }; const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"}; const u8*JPEG_SIZE_TBL[13]={"QQVGA","QCIF","QVGA","WQVGA","CIF","VGA","SVGA","XGA","WXGA","XVGA","WXGA+","SXGA","UXGA"}; void jpeg_data_process(void) { if(ov2640_mode)//???JPEG???,??????. { if(jpeg_data_ok==0)//jpeg???????? { DMA2_Stream1->CR&=~(1<<0);//?????? while(DMA2_Stream1->CR&0X01);//??DMA2_Stream1??? jpeg_data_len=jpeg_buf_size-DMA2_Stream1->NDTR;//??????????? jpeg_data_ok=1; //??JPEG???????,???????? } if(jpeg_data_ok==2)//????jpeg???????? { DMA2_Stream1->NDTR=jpeg_buf_size;//?????jpeg_buf_size*4?? DMA2_Stream1->CR|=1<<0;//???? jpeg_data_ok=0;//??????? } } } //JPEG?? //JPEG??,????2?????. void jpeg_init(void) { u8 size=2;//???QVGA 320*240?? OV2640_JPEG_Mode();//JPEG?? DCMI_Init();//DCMI?? DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,2,1);//DCMI DMA?? OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//?????? DCMI_Start(); //???? } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //加载UI //mode: //bit0:0,不加载;1,加载前半部分UI //bit1:0,不加载;1,加载后半部分UI void lwip_test_ui(u8 mode) { u8 speed; u8 buf[30]; POINT_COLOR=RED; if(mode&1<<0) { LCD_Fill(30,30,lcddev.width,110,WHITE);//清除显示 LCD_ShowString(30,30,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,50,200,16,16,"Ethernet lwIP Test"); LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,90,200,16,16,"2014/8/15"); } if(mode&1<<1) { LCD_Fill(30,110,lcddev.width,lcddev.height,WHITE);//清除显示 LCD_ShowString(30,110,200,16,16,"lwIP Init Successed"); if(lwipdev.dhcpstatus==2)sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);//打印动态IP地址 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); speed=LAN8720_Get_Speed();//得到网速 if(speed&1<<1)LCD_ShowString(30,150,200,16,16,"Ethernet Speed:100M"); else LCD_ShowString(30,150,200,16,16,"Ethernet Speed:10M"); LCD_ShowString(30,170,200,16,16,"KEY0:TCP Server Test"); LCD_ShowString(30,190,200,16,16,"KEY1:TCP Client Test"); LCD_ShowString(30,210,200,16,16,"KEY2:UDP Test"); } } int main(void) { //u8 t; //u8 key; Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz delay_init(168);//延时初始化 uart_init(84,115200);//初始化串口波特率为115200 //这个仅仅用来在后面进行数据对比时用到,没有实际意义 usart2_init(42,115200);//初始化串口2波特率为115200 usmart_dev.init(84);//初始化USMART LED_Init(); //LED初始化 KEY_Init(); //按键初始化 //LCD_Init(); //LCD初始化 //BEEP_Init();//蜂鸣器初始化 //RTC_Init(); //RTC初始化 //Adc_Init(); //ADC初始化 //这里频率不一样,不知道有没有问题???????? TIM3_Int_Init(100-1,8400-1);//10khz的频率,计数100为10ms usmart_dev.init(84);//初始化USMART my_mem_init(SRAMIN);//初始化内部内存池 my_mem_init(SRAMCCM);//初始化CCM内存池 /////////////////////////////////////////////////////////// while(OV2640_Init())//初始化OV2640 { LED0=!LED0; } //////////////////////////////////////////////////////// //lwip_test_ui(1);//加载前半部分UI //先初始化lwIP(包括LAN8720初始化),此时必须插上网线,否则初始化会失败!! //LCD_ShowString(30,110,200,16,16,"lwIP Initing..."); while(lwip_comm_init()!=0);//lwip初始化 while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP获取成功/超时溢出 { lwip_periodic_handle();//这里在获取IP地址 } //lwip_test_ui(2);//加载后半部分UI //httpd_init();//HTTP初始化(默认开启websever) jpeg_init();//现在这个函数仅仅是用来初始化摄像头 //到这里摄像头已经开始传输数据了 while(1) { tcp_server_test(); //lwip_test_ui(3);//重新加载UI lwip_periodic_handle(); } } |
|
|
|
内存不够了,减少内存占用率。
|
|
|
|
哪些占用的多,而且也可以不用的呢?昨天我问你们技术员,他说要加SRAM。我这个程序不用SRAM,只用芯片内存能满足吗?
|
|
|
|
请问下,你的不扩展内存能处理的过来吗?我现在要扩展内存了
|
|
|
|
回复【11楼】wn1900:
-------------------------------- 不行,要用外部SRAM才行,内部SRAM只有128K,移植一个协议栈进去就够呛了。但是我现在重新写的程序还没跑通。 |
|
|
|
那就要改代码,大叔组改小。
|
|
|
|
回复【13楼】发烧友:
-------------------------------- 我现在又改了一次,在板子跑步起来。麻烦帮我看看。 #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 "adc.h" #include "rtc.h" #include "sram.h" #include "malloc.h" #include "beep.h" #include "lwip_comm.h" #include "tcp_client_demo.h" #include "tcp_server_demo.h" #include "udp_demo.h" #include "httpd.h" #include "led.h" #include "key.h" #include "usart2.h" #include "ov2640.h" #include "dcmi.h" /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// u8 ov2640_mode=0;//????:0,RGB565??;1,JPEG?? #define jpeg_buf_size 31*1024 //??JPEG????jpeg_buf???(*4??) //__align(4) u32 jpeg_buf[jpeg_buf_size];//JPEG????buf u32 *jpeg_buf; volatile u32 jpeg_data_len=0; //buf??JPEG?????? volatile u8 jpeg_data_ok=0;//JPEG???????? //0,???????; //1,??????,??????; //2,?????????,????????? //JPEG?????? const u16 jpeg_img_size_tbl[][2]= { 160,120,//QQVGA 176,144,//QCIF 320,240,//QVGA 400,240,//WQVGA 352,288,//CIF 640,480,//VGA 800,600,//SVGA 1024,768,//XGA 1280,800,//WXGA 1280,960,//XVGA 1440,900,//WXGA+ 1280,1024,//SXGA 1600,1200,//UXGA }; const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"};//7??? const u8*JPEG_SIZE_TBL[13]={"QQVGA","QCIF","QVGA","WQVGA","CIF","VGA","SVGA","XGA","WXGA","XVGA","WXGA+","SXGA","UXGA"};//JPEG?? 13??? //处理JPEG数据 //当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集. void jpeg_data_process(void) { if(ov2640_mode)//只有在JPEG格式下,才需要做处理 { if(jpeg_data_ok==0)//jpeg数据还未采集完? { DMA2_Stream1->CR&=~(1<<0);//停止当前传输 while(DMA2_Stream1->CR&0X01);//等待DMA2_Stream1可配置 jpeg_data_len=jpeg_buf_size-DMA2_Stream1->NDTR;//得到此次数据传输的长度 jpeg_data_ok=1; //标记JPEG数据采集完按成,等待其他函数处理 } if(jpeg_data_ok==2)//上一次的jpeg数据已经被处理 { DMA2_Stream1->NDTR=jpeg_buf_size;//传输长度为jpeg_buf_size*4字节 DMA2_Stream1->CR|=1<<0;//重新传输 jpeg_data_ok=0;//?标记数据未采集 } } } //JPEG?? //JPEG??,????2?????. void jpeg_init(void) { u8 size=2;//???QVGA 320*240?? OV2640_JPEG_Mode();//JPEG?? DCMI_Init();//DCMI?? DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,2,1);//DCMI DMA?? OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//?????? DCMI_Start(); //???? } //加载UI //mode: //bit0:0,不加载;1,加载前半部分UI //bit1:0,不加载;1,加载后半部分UI void lwip_test_ui(u8 mode) { u8 speed; u8 buf[30]; POINT_COLOR=RED; if(mode&1<<0) { LCD_Fill(30,30,lcddev.width,110,WHITE);//清除显示 LCD_ShowString(30,30,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,50,200,16,16,"Ethernet lwIP Test"); LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,90,200,16,16,"2014/8/15"); } if(mode&1<<1) { LCD_Fill(30,110,lcddev.width,lcddev.height,WHITE);//清除显示 LCD_ShowString(30,110,200,16,16,"lwIP Init Successed"); if(lwipdev.dhcpstatus==2)sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);//打印动态IP地址 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); speed=LAN8720_Get_Speed();//得到网速 if(speed&1<<1)LCD_ShowString(30,150,200,16,16,"Ethernet Speed:100M"); else LCD_ShowString(30,150,200,16,16,"Ethernet Speed:10M"); LCD_ShowString(30,170,200,16,16,"KEY0:TCP Server Test"); LCD_ShowString(30,190,200,16,16,"KEY1:TCP Client Test"); LCD_ShowString(30,210,200,16,16,"KEY2:UDP Test"); } } int main(void) { //u8 t; //u8 key; Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz delay_init(168);//延时初始化 uart_init(84,115200);//初始化串口波特率为115200 usart2_init(42,115200);//初始化串口2波特率为115200 usmart_dev.init(84);//初始化USMART LED_Init(); //LED初始化 KEY_Init(); //按键初始化 LCD_Init(); //LCD初始化 //BEEP_Init();//蜂鸣器初始化 //RTC_Init(); //RTC初始化 //Adc_Init(); //ADC初始化 TIM3_Int_Init(100-1,8400-1);//10khz的频率,计数100为10ms FSMC_SRAM_Init();//初始化外部SRAM. my_mem_init(SRAMIN);//初始化内部内存池 my_mem_init(SRAMEX);//初始化外部内存池 my_mem_init(SRAMCCM);//初始化CCM内存池 jpeg_buf=mymalloc(SRAMEX,jpeg_buf_size);//图片存取分配内存 while(OV2640_Init())//初始化OV2640 { LED0=!LED0; } //POINT_COLOR=RED; //红色字体 //lwip_test_ui(1);//加载前半部分UI //先初始化lwIP(包括LAN8720初始化),此时必须插上网线,否则初始化会失败!! //LCD_ShowString(30,110,200,16,16,"lwIP Initing..."); while(lwip_comm_init()!=0);//lwip初始化 //等待DHCP获取 while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP获取成功/超时溢出 { lwip_periodic_handle();//这里在获取IP地址 } jpeg_init();//现在这个函数仅仅是用来初始化摄像头 while(1) { tcp_server_test(); lwip_periodic_handle(); } } 编译都是对的 |
|
|
|
这个是服务器测试的程序
void tcp_server_test(void) { err_t err; struct tcp_pcb *tcppcbnew; //定义一个TCP服务器控制块 struct tcp_pcb *tcppcbconn; //定义一个TCP服务器控制块 u8 *tbuf; // u8 key; u8 res=0; u8 t=0; u8 connflag=0;//连接标记 tbuf=mymalloc(SRAMEX,200);//申请内存 tcppcbnew=tcp_new();//创建一个新的pcb if(tcppcbnew)//创建成功 { err=tcp_bind(tcppcbnew,IP_ADDR_ANY,TCP_SERVER_PORT);//将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址 if(err==ERR_OK)//绑定完成 { tcppcbconn=tcp_listen(tcppcbnew); //设置tcppcb进入监听状态 tcp_accept(tcppcbconn,tcp_server_accept); //初始化LWIP的tcp_accept的回调函数 }else res=1; }else res=1; //POINT_COLOR=BLUE;//蓝色字体 while(res==0)//创建成功 { if(jpeg_data_ok==1)//已经采集完一帧图像了 { tcp_server_flag|=1<<7;//标记要发送数据 jpeg_data_ok=2;//标记jpeg数据处理完了,可以让DMA去采集下一帧了. } if(tcp_server_flag&1<<6)//是否收到数据? { tcp_server_flag&=~(1<<6);//标记数据已经被处理了. } if(tcp_server_flag&1<<5)//是否连接上? { if(connflag==0) connflag=1;//标记连接了 }else if(connflag) { connflag=0;//标记连接断开了 } lwip_periodic_handle(); delay_ms(2); t++; if(t==200) { t=0; LED0=!LED0; } } tcp_server_connection_close(tcppcbnew,0);//关闭TCP Server连接 tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接 tcp_server_remove_timewait(); memset(tcppcbnew,0,sizeof(struct tcp_pcb)); memset(tcppcbconn,0,sizeof(struct tcp_pcb)); myfree(SRAMEX,tbuf); } |
|
|
|
得仿真查看。
|
|
|
|
怎么仿真呢?我问周围的人,他们都不知道
|
|
|
|
看来我要出个视频。。。
|
|
|
|
对啊,麻烦问一下。mem_malloc申请的内存是哪一部分内存,我想把这个内存改大点,可是找不到。
|
|
|
|
看内存管理实验,学习下先。
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2557 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2344 浏览 5 评论
3176 浏览 3 评论
2820 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2774 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
632浏览 1评论
878浏览 0评论
993浏览 0评论
643浏览 0评论
470浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 06:03 , Processed in 2.954145 second(s), Total 117, Slave 100 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号