OpenEdv-开源电子网

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

stm32上移植LWIP编译问题,把两个函数在不同文件下编译,整个工程编译后的大小相差差不多60kB!!!

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2012-9-15
在线时间
0 小时
发表于 2013-3-31 17:27:21 | 显示全部楼层 |阅读模式

把两个函数在不同文件下编译,整个工程编译后的大小相差差不多60kB!!!

1.把task_red_led()函数和task_green_led()放在app.c文件中的时候,工程编译结果为

,code + RO+RW=73kb

2.task_red_led()函数和task_green_led()放在main.c文件中的时候,工程编译结果为:

 ,     code + RO+RW=13kb

 

另外,还有一种情况:
当把app.c中红色部分的代码注释掉的时候,编译结果又不一样了。请看下面,

3.把task_red_led()函数和task_green_led()放在app.c文件中的时候,工程编译结果为:

4.把task_red_led()函数和task_green_led()放在main.c文件中的时候,工程编译结果为:


在以上2,3,4的情况下,程序能够运行(板子上的红灯和绿灯闪烁),在1的情况下,则不能运行(灯不闪烁)。

有个疑问就是:
在1情况下,怎么会多出60kb左右的代码?
板子上的芯片为STM32F103RBT6,闪存有128kB,不应该是存储空间不够吧。
还请坛子里的朋友帮帮忙,看看这到底怎么回事啊?这问题真的很是莫名其妙!


main.c文件内容如下
#include "includes.h"
#include "netbuf.h"
#include "tcpip.h"
#include "init.h"
/******************?è????????????********************/
#define STARTUP_TASK_PRIO    4

/******************?è?????ó??(??????OS_STK)**********************/
#define STARTUP_TASK_STK_SIZE 40
#define RED_LED_TASK_STK_SIZE 40
#define GREEN_LED_TASK_STK_SIZE 40
#define LWIP_ENTRY_TASK_STK_SIZE 80

static OS_STK startup_stk[STARTUP_TASK_STK_SIZE];
static OS_STK red_led_stk[RED_LED_TASK_STK_SIZE];
static OS_STK green_led_stk[GREEN_LED_TASK_STK_SIZE];
static OS_STK lwip_entry_stk[LWIP_ENTRY_TASK_STK_SIZE];

void task_red_led(void *p_arg)
{
 (void)p_arg;
 
 while (1)
 {
 GPIO_ResetBits(GPIOA,GPIO_Pin_8);
 OSTimeDlyHMSM(0, 0,0,600);
 GPIO_SetBits(GPIOA,GPIO_Pin_8);
 OSTimeDlyHMSM(0, 0,0,600);
 }      
}
void task_green_led(void *p_arg)
{
 (void)p_arg;
 
 while (1)
 {
 GPIO_ResetBits(GPIOD,GPIO_Pin_2);
 OSTimeDlyHMSM(0, 0,1,000);
 GPIO_SetBits(GPIOD,GPIO_Pin_2);
 OSTimeDlyHMSM(0, 0,1,000);
 }
}
void Task_Start(void *arg)
{
// OSTaskCreate(LwIPEntry,(void *)NULL,&lwip_entry_stk[LWIP_ENTRY_TASK_STK_SIZE - 1],STARTUP_TASK_PRIO + 1);
 OSTaskCreate(task_green_led ,(void *)NULL,&green_led_stk[GREEN_LED_TASK_STK_SIZE - 1],STARTUP_TASK_PRIO + 2);  
 OSTaskCreate(task_red_led ,(void *)NULL,&red_led_stk[RED_LED_TASK_STK_SIZE - 1],STARTUP_TASK_PRIO + 3);  
 OSTaskDel(OS_PRIO_SELF);
}

int main(void)

 BSP_Init();   
 OSInit();
 OSTaskCreate(Task_Start,
    (void *)0,
    &startup_stk[STARTUP_TASK_STK_SIZE - 1],
    STARTUP_TASK_PRIO); 
       
    OSStart();  
    return 0;

}

 

app.c文件内容如下:
#include "includes.h"
#include "netbuf.h"
#include "tcpip.h"
#include "init.h"

#if 1
void SetLwIP(void)
{
 extern err_t ethernetif_init(struct netif *netif);
 struct ip_addr  IpAddr,  NetMask,  Gateway;
 static struct netif  EMACNetif;
 netif_init();
 
 IP4_ADDR(&IpAddr, 192, 168, 1, 16);
   
 IP4_ADDR(&NetMask, 192, 168, 1, 1);
 IP4_ADDR(&Gateway, 255, 255, 255, 0);
 
 netif_add(&EMACNetif, &IpAddr, &NetMask, &Gateway, NULL, ethernetif_init, tcpip_input);
 
 netif_set_default(&EMACNetif);
 netif_set_up(&EMACNetif); 
}

void LwIPEntry(void * pvArg)
{
 struct netconn  *Conn, *NewConn;
 struct netbuf *Netbuf;
  lwip_init();
 tcpip_init(NULL , NULL);
 SetLwIP();
  
 Conn = netconn_new(NETCONN_TCP);
 netconn_bind( Conn, NULL, 80);
 netconn_listen( Conn);
   
 while(TRUE)
 {
    netconn_accept( Conn,&NewConn);
  
  if( NewConn != NULL)
  {   
   netconn_recv( NewConn,&Netbuf);
   if( Netbuf != NULL)
   {
    netconn_write( NewConn, "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n", 44, NETCONN_COPY);
    netconn_write( NewConn, "<body><h1>????LWIP TCP??????</h1></body>", 40, NETCONN_COPY);
    
    netbuf_delete( Netbuf); 
   }
   
   netconn_close( NewConn);
   while(netconn_delete( NewConn) != ERR_OK)
   OSTimeDlyHMSM(0, 0, 1, 0);
      
  }    
 } 
}
#endif

MyLib-uCOS-II -LWIP - 0.1.1 - 副本.zip

9.13 MB, 下载次数: 71

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-3-31 21:34:31 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2012-9-15
在线时间
0 小时
 楼主| 发表于 2013-4-1 08:44:06 | 显示全部楼层
回复【2楼】正点原子:

没有被调用到了吧!

---------------------------------
task_red_led()和task_green_led()这两个函数在app.h文件中有申明,在main.c中也有包含这个头文件(在includes.h中)。
在main.c中的Task_Start()这个任务中, 也是用OSTaskCreate()创建了这两个任务的啊!

而且这两个任务的作用也只是闪烁LED灯,没什么复杂的功能,为什么两种情况下编译出的工程大小会相差60KB这么大!!?

文章中红色代码部分是LWIP tcp/ip协议的那部分,虽然编译了,但是没有在哪个地方调用了,所以他们在文件中编译或者不编译对其他的函数应该没有影响才对吧,但事实上情况又不是这样!!
这是我用ministm32做的毕业设计,这问题没解决根本没办法继续下一步,搞了几天了,还请原子哥帮帮忙啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-4-1 09:55:15 | 显示全部楼层
回复【3楼】suse110:
---------------------------------
相差这么大,肯定是调用和没调用的关系了(你没有大数组(const数组)吧?),你现在都可以编译通过,你下载进去,仿真一下看看到底有没有运行该函数就知道了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2013-8-4
在线时间
0 小时
发表于 2013-11-28 13:45:52 | 显示全部楼层
回复【楼主位】suse110:
---------------------------------
请问suse同学,你这个lwip移植做出来了吗?能不能分享一下?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 17:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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