This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LC4357: Getting Ethernet MAC running, starting with loopback test

Part Number: TMS570LC4357
Other Parts Discussed in Thread: HALCOGEN, , LAUNCHXL2-570LC43, CCSTUDIO, DP83630, TMDX570LC43HDK, TMDSRM48HDK

Hi,

I'm trying to get EMAC working, and hit the same problem others have encountered, as in the threads here....

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/872569/ccs-launchxl2-570lc43-ethernet-all-received-frames-are-filtered/3244804?tisearch=e2e-sitesearch&keymatch=xl2-570lc43%20ethernet#3244804

I followed the steps in the Halcogen help documentation to do EMAC loopback.

I tried setting MPU regions to NORMAL_OIWTNOWA_NONSHARED (write-through), as what supposedly worked for the above poster, but it didn't work for me.

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/612990/tms570lc4357-mdiophyregread?tisearch=e2e-sitesearch&keymatch=TMS570LC4357%25252525252520Ethernet%25252525252520loopback%25252525252520MDIO

I tried picking up the package indicated in this post:

TMS570LC4357_LaunchPad_EMAC_Loopback.zip

but didn't have permission to retrieve it.

Thanks for any and all help to get the EMAC going.

  • So in your expert opinion, is this hdkif problem a blocker, or something that could be resolved? 

    Based on experience with issues debugging other MCU Ethernet drivers I think the hdkif issue is a software "bug" which hopefully can be resolved in software. However, until have identified the root cause can't be 100% sure.

    Given the observed symptom that increasing MEMP_NUM_PBUF made the device spend all it's time running the Ethernet Tx handler (and failing to clear the interrupt source) the next step would be to inspect the software which manages the transmit descriptors to see if can identify any bugs / race conditions.

    I won't be in a position to do that until the weekend, but perhaps there is enough information for a TI employee to investigate.

  • Hi @Chester Gillon and @Peter Lu,

    Can we close this thread?

    --

    Regards,

    Jagadish.

  • I don't know what the criteria is for closing threads.  The subject of this thread has not been resolved as yet, since there is no working "hdkif" facility that would provide a functional EMAC transport layer to send and receive "raw" Ethernet messages.  I was hoping Chester or TI employees would be able to help get this going/completed, but am grateful that significant progress has already been made to get a semi-functional LwIP package, which uses hdkif, running.

    If there is no hope of getting hdkif completed via communication in this thread, then I guess the thread could be closed.  But if there is any possibility of getting a EMAC transport layer/driver going, possibly packaged as a future TI demo/sample project, then I'd really like to see the conversation continued.

    Thank you very much.

  • So in your expert opinion, is this hdkif problem a blocker, or something that could be resolved?

    Looking at the hercules_examples GIT repo there are 3 hdkif.c source files:

    $ find hercules_examples/ -name hdkif.c -ls
     59247830     28 -rw-r--r--   1 mr_halfword mr_halfword    27166 Nov 28  2020 hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c
     53880066     28 -rw-rw-r--   1 mr_halfword mr_halfword    27166 Sep 25  2021 hercules_examples/Application/Hercules_Ethernet_Bootloader/lwip-1.4.1/ports/hdk/netif/hdkif.c
     50341279     28 -rw-r--r--   1 mr_halfword mr_halfword    27817 Nov 28  2020 hercules_examples/Application/ActiveWebserver/1.1.0/third_party/lwip-1.4.1/ports/hdk/netif/hdkif.c
    

    The first two files (under Application/LwIP/v00.04.00/lwip-1.4.1 and Application/Hercules_Ethernet_Bootloader/lwip-1.4.1) are identical. The third file (under Application/ActiveWebserver/1.1.0/third_party/lwip-1.4.1) is different to the other two. Comparing the 1st and 3rd files shows the 3rd file has has additional code in how the hdkif_transmit, hdkif_output and hdkif_tx_inthandler functions determine if there are free transmit buffer descriptors:

    mr_halfword@Haswell-Ubuntu:~/hercules_examples$ git diff --no-index Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c Application/ActiveWebserver/1.1.0/third_party/lwip-1.4.1/ports/hdk/netif/hdkif.c | cat
    diff --git a/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c b/Application/ActiveWebserver/1.1.0/third_party/lwip-1.4.1/ports/hdk/netif/hdkif.c
    index 0f8cd15..9c76dd7 100644
    --- a/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c
    +++ b/Application/ActiveWebserver/1.1.0/third_party/lwip-1.4.1/ports/hdk/netif/hdkif.c
    @@ -43,18 +43,18 @@
      * interface driver for lwIP.
      *
      */
    -#include "src/include/lwip/opt.h"
    -#include "src/include/lwip/def.h"
    -#include "src/include/lwip/mem.h"
    -#include "src/include/lwip/pbuf.h"
    -#include "src/include/lwip/sys.h"
    -#include "src/include/lwip/stats.h"
    -#include "src/include/lwip/snmp.h"
    -#include "src/include/netif/etharp.h"
    -#include "src/include/netif/ppp_oe.h"
    -#include "src/include/lwip/err.h"
    -#include "ports/hdk/include/netif/hdkif.h"
    -#include "ports/hdk/include/arch/cc.h"
    +#include "lwip/opt.h"
    +#include "lwip/def.h"
    +#include "lwip/mem.h"
    +#include "lwip/pbuf.h"
    +#include "lwip/sys.h"
    +#include "lwip/stats.h"
    +#include "lwip/snmp.h"
    +#include "netif/etharp.h"
    +#include "netif/ppp_oe.h"
    +#include "lwip/err.h"
    +#include "netif/hdkif.h"
    +#include "arch/cc.h"
     
     /* HALCoGen DriverLib Header & PHY files required for this interface driver. */
     #if defined(_TMS570LC43x_) || defined(_RM57Lx_)
    @@ -79,7 +79,8 @@
     #endif
     
     #define PBUF_LEN_MAX              MAX_TRANSFER_UNIT
    -
    +#define EMAC_BD_LEN_MASK          0xFFFF
    +#define EMAC_BD_PKTLEN_MASK       0xFFFF
     
     /* Define those to better describe the network interface. */
     #define IFNAME0                  'e'
    @@ -133,6 +134,7 @@ struct txch {
       volatile struct emac_tx_bdp *free_head;
       volatile struct emac_tx_bdp *active_tail;
       volatile struct emac_tx_bdp *next_bd_to_process;
    +  volatile u32_t free_num;
     }txch;
      
     /**
    @@ -279,7 +281,7 @@ hdkif_link_setup(struct hdkif *hdkif) {
      * @param pbuf  the pbuf which is to be sent over EMAC
      * @return None
      */
    -static void
    +static err_t
     hdkif_transmit(struct hdkif *hdkif, struct pbuf *pbuf) {
       struct pbuf *q;
       struct txch *txch;
    @@ -287,6 +289,11 @@ hdkif_transmit(struct hdkif *hdkif, struct pbuf *pbuf) {
     
       txch = &(hdkif->txch);
      
    +   /* Do not send if there are no enough free bd's */
    +  if(pbuf_clen(pbuf) > txch->free_num) {
    +    return ERR_MEM;
    +  }
    +  
       /* Get the buffer descriptor which is free to transmit */
       curr_bd = txch->free_head;
       
    @@ -306,7 +313,8 @@ hdkif_transmit(struct hdkif *hdkif, struct pbuf *pbuf) {
         bd_end = curr_bd;
         curr_bd->pbuf = pbuf;
         curr_bd = hdkif_swizzle_txp(curr_bd->next);
    -    //if (curr_bd) curr_bd->flags_pktlen = 0;
    +	/* Decrement free bds, since one is consumed */ 
    +    txch->free_num--;
       }
     
       /* Indicate the end of the packet */
    @@ -353,7 +361,7 @@ hdkif_transmit(struct hdkif *hdkif, struct pbuf *pbuf) {
     static err_t
     hdkif_output(struct netif *netif, struct pbuf *p) {
       SYS_ARCH_DECL_PROTECT(lev);
    -
    +  struct pbuf *q = p;
       /**
        * This entire function must run within a "critical section" to preserve
        * the integrity of the transmit pbuf queue.
    @@ -362,9 +370,19 @@ hdkif_output(struct netif *netif, struct pbuf *p) {
       SYS_ARCH_PROTECT(lev);
     
       /* adjust the packet length if less than minimum required */
    -  if(p->tot_len < MIN_PKT_LEN) {
    -     p->tot_len = MIN_PKT_LEN;
    -     p->len = MIN_PKT_LEN;
    +  /**
    +   * Adjust the packet length if less than minimum required.
    +   */
    +  if(q->tot_len < MIN_PKT_LEN) {
    +    q->tot_len = MIN_PKT_LEN;
    +
    +    while(q->next != NULL) {
    +      q->next->tot_len = q->tot_len - q->len;
    +      q = q->next;
    +    }
    +
    +    /* Adjust the length of the last pbuf. (contents - don't care) */
    +    q->len = q->tot_len;
       }
     
       /**
    @@ -504,6 +522,7 @@ hdkif_hw_init(struct netif *netif)
      
       /* Set the number of descriptors for the channel */ 
       num_bd = (SIZE_EMAC_CTRL_RAM >> 1) / sizeof(emac_tx_bdp);
    +  txch->free_num = num_bd;
       
       curr_txbd = txch->free_head;
     
    @@ -810,7 +829,7 @@ void
     hdkif_tx_inthandler(struct netif *netif) {
       struct txch *txch;
       struct hdkif *hdkif; 
    -  volatile struct emac_tx_bdp *curr_bd, *next_bd_to_process;
    +  volatile struct emac_tx_bdp *curr_bd, *next_bd_to_process,*processed_bd;
       
       hdkif = netif->state; 
       txch = &(hdkif->txch);
    @@ -818,6 +837,7 @@ hdkif_tx_inthandler(struct netif *netif) {
       next_bd_to_process = txch->next_bd_to_process;
       
       curr_bd = next_bd_to_process;
    +  processed_bd = curr_bd;
       
       /* Check for correct start of packet */
       while(hdkif_swizzle_data(curr_bd->flags_pktlen) & EMAC_BUF_DESC_SOP) {
    @@ -825,10 +845,15 @@ hdkif_tx_inthandler(struct netif *netif) {
         /* Make sure that the transmission is over */
         while((hdkif_swizzle_data(curr_bd->flags_pktlen) & EMAC_BUF_DESC_OWNER)
               == EMAC_BUF_DESC_OWNER);
    -   
    +       /* One buffer descriptor is free now */
    +    txch->free_num++; 
         /* Traverse till the end of packet is reached */ 
         while((hdkif_swizzle_data(curr_bd->flags_pktlen) & EMAC_BUF_DESC_EOP) != EMAC_BUF_DESC_EOP) {
            curr_bd = hdkif_swizzle_txp(curr_bd->next);
    +      txch->free_num++; 
    +	        if(txch->free_num == (SIZE_EMAC_CTRL_RAM >> 1) / sizeof(emac_tx_bdp)) {
    +        break;
    +    }
         }
      
         next_bd_to_process->flags_pktlen &= hdkif_swizzle_data(~(EMAC_BUF_DESC_SOP));
    @@ -846,17 +871,16 @@ hdkif_tx_inthandler(struct netif *netif) {
           txch->next_bd_to_process = hdkif_swizzle_txp(curr_bd->next);
         }
         
    -    /* Acknowledge the EMAC and free the corresponding pbuf */
    -    EMACTxCPWrite(hdkif->emac_base, 0, (uint32)curr_bd);
    -
         pbuf_free((struct pbuf *)curr_bd->pbuf);
     
         LINK_STATS_INC(link.xmit);
        
         next_bd_to_process = txch->next_bd_to_process;
    +    processed_bd = curr_bd;
         curr_bd = next_bd_to_process;
       }
    -
    +  /* Acknowledge the EMAC and free the corresponding pbuf */
    +  EMACTxCPWrite(hdkif->emac_base, 0, (uint32)processed_bd);
       EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_RX);
       EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_TX);
     }
    
    The Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/Build-LAUNCHXL2-TMS570LC43x example which shows the issue is using the Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c file (the 1st file described above).

    Copied the contents of hercules_examples/Application/ActiveWebserver/1.1.0/third_party/lwip-1.4.1/ports/hdk/netif/hdkif.c into hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c. Since the changes were around checking for free transmit buffer thought it might fix the issues. With just that change the Linux PC still fails to display the webpage correctly.

  • Thank you so much for following up on this.  I'd be most interested if a "hdkif" layer that provides reliable/consistent EMAC packet transfers could eventually result.  I'd suspect a lot of other people would also.

  • Noticed that in the hercules_examples\Application\LwIP\v00.04.00\lwip-1.4.1\ports\hdk\include\arch\cc.h file the LWIP_PLATFORM_ASSERT macro was an empty version as the DEBUG macro wasn't defined.

    Without having to enable the full LwIP DEBUG support replaced the empty LWIP_PLATFORM_ASSERT macro with the following:

    /* @todo just spin in a loop on an assertion failure so can investigate in the debugger */
    #define LWIP_PLATFORM_ASSERT(expr) { for (;;){} }

    With the LWIP_PLATFORM_ASSERT macro set to halt the program on an assertion failure, found the following assertion in hercules_examples\Application\LwIP\v00.04.00\lwip-1.4.1\apps\httpserver_raw\httpd.c was failing:

    #if !LWIP_HTTPD_DYNAMIC_HEADERS
        LWIP_ASSERT("HTTP headers not included in file system", hs->handle->http_header_included);
    #endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */

    On investigating the issue is that while the hercules_examples\Application\LwIP\v00.04.00\lwip-1.4.1\apps\httpserver_raw\makefsdata\makefsdata perl script which generated the contents of hercules_examples\Application\LwIP\v00.04.00\lwip-1.4.1\apps\httpserver_raw\fsdata.c had actually added the HTTP headers to the contents of all files in the webserver, the http_header_included flag wasn't set in the generated fsdata_file structures.

    Modified the makefsdata perl script to set the http_header_included flag, and re-generated the fsdata.c source file.

    After doing that, there were no more assertion failures, when either:

    1. Using a Windows http web browser when the web page displays correctly.
    2. Using a Linux web browser when the web page doesn't display correcty.
  • Used the call_graph.pl utility from the cg_xml package to generate the worst case stack usage for the LwIP program.

    To help automate that added the following post-build steps to the CCS project:

    "${CG_TOOL_ROOT}/bin/armofd" -x -g -o "${BuildArtifactFileBaseName}.xml" "${BuildArtifactFileName}"
    "${CG_XML_ROOT}/bin/call_graph" "${BuildArtifactFileBaseName}.xml" --i_cfg="${CG_XML_ROOT}/ofd/arm_rts_indirect.txt" --i_cfg="${CG_XML_ROOT}/ofd/ti_rts_indirect.txt" --i_cfg="${PROJECT_LOC}/../../example/lwip_example_indirect.txt" > "${BuildArtifactFileBaseName}_call_graph.txt"

    Where the attached lwip_example_indirect.txt was the call_graph.pl configuration file which specifies the indirect calls (function pointers) used by the LwIP code.

    The attached Build-LAUNCHXL2-TMS570LC43_call_graph.txt is the generated report. The worst case stack usage is reported as:

    - 632 bytes for main, from _c_int00
    - 824 bytes from IRQ, from EMACCore0RxIsr

    In the HALCoGen configuration:
    a. The User Stack Length was 4096 which was sufficient.
    b. The IRQ Stack Length was 256 which could have lead to stack overflow.

    The IRQ Stack Length has been increased to 1024 to avoid the possability of stack overflow, but that didn't change the failure mechanism of serving a file being stalled when using a Linux http client.

    # Configuration file used with the cg_xml call_graph.pl to specify indirect function calls made the lwip http example.
    # This is to aid determining the worst case stack usage
    
    # Via the linkoutput function pointer in the netif structure
    etharp_arp_input : hdkif_output
    etharp_send_ip : hdkif_output
    etharp_raw : hdkif_output
    
    # Via the output function pointer in the netif structure
    ip_output_if : etharp_output
    
    # init function pointer argument to netif_add()
    netif_add : hdkif_init
    
    # raw_input() calls the pcb->recv function pointer if the pointer is non-null.
    # The recv function pointer is only set by raw_recv() which is not called (and the linker is removing).
    # Therefore, raw_input() doesn't make any indirect calls at runtime. 
    raw_input :
    
    # The pcb callback functions as called by:
    # TCP_EVENT_ACCEPT    : http_accept
    # TCP_EVENT_SENT      : http_sent
    # TCP_EVENT_RECV      : http_recv
    # TCP_EVENT_CLOSED    : http_recv
    # TCP_EVENT_CONNECTED : <not used as httpd is a TCP server only>
    # TCP_EVENT_POLL      : http_poll
    # TCP_EVENT_ERR       :
    tcp_process : http_accept
    tcp_input : http_err http_recv http_sent
    tcp_process_refused_data : http_recv
    tcp_slowtmr : http_err http_poll
    tcp_abandon : http_err
    
    # UDP callback functions set by calls to udp_recv()
    udp_input : LocatorReceive dhcp_recv
    
    # Callback functions registered by a call to sys_timeout()
    sys_check_timeouts : tcpip_tcp_timer arp_timer dhcp_timer_coarse dhcp_timer_fine

    Call Graph for Build-LAUNCHXL2-TMS570LC43.out
    **********************************************************************
    _c_int00 : wcs = 632
    |  __TI_auto_init : wcs = ???
    |  _cacheEnable_ : wcs = ???
    |  _coreEnableEventBusExport_ : wcs = ???
    |  _coreEnableIrqVicOffset_ : wcs = ???
    |  _coreInitRegisters_ : wcs = ???
    |  _coreInitStackPointer_ : wcs = ???
    |  _errata_SSWF021_45_both_plls : wcs = 40
    |  |  check_frequency : wcs = 8
    |  |  disable_plls : wcs = 16
    |  _memInit_ : wcs = ???
    |  _mpuInit_ : wcs = ???
    |  esmGroup3Notification : wcs = 8
    |  esmInit : wcs = 0
    |  exit : wcs = ???
    |  getResetSource : wcs = 0
    |  handlePLLLockFail : wcs = 0
    |  main : wcs = 632
    |  |  EMAC_LwIP_Main : wcs = 624
    |  |  |  IntMasterIRQEnable : wcs = 0
    |  |  |  LocatorConfig : wcs = 80
    |  |  |  |  udp_bind : wcs = 32
    |  |  |  |  |  udp_new_port : wcs = 8
    |  |  |  |  udp_connect : wcs = 56
    |  |  |  |  |  udp_bind : wcs = 32
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  udp_new : wcs = 32
    |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  IntMasterIRQDisable : wcs = 0
    |  |  |  |  |  |  |  IntMasterStatusGet : wcs = 0
    |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  IntMasterIRQEnable : wcs = 0
    |  |  |  |  |  memset : wcs = 20
    |  |  |  |  udp_recv : wcs = 16
    |  |  |  httpd_init : wcs = 520
    |  |  |  |  httpd_init_addr : wcs = 512
    |  |  |  |  |  tcp_accept : wcs = 8
    |  |  |  |  |  tcp_arg : wcs = 8
    |  |  |  |  |  tcp_bind : wcs = 88
    |  |  |  |  |  |  tcp_new_port : wcs = 8
    |  |  |  |  |  |  tcp_timer_needed : wcs = 56
    |  |  |  |  |  |  |  sys_timeout : wcs = 48
    |  |  |  |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  tcp_listen_with_backlog : wcs = 72
    |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_timer_needed : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  tcp_new : wcs = 496
    |  |  |  |  |  |  tcp_alloc : wcs = 488
    |  |  |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  memset : wcs = 20
    |  |  |  |  |  |  |  tcp_kill_prio : wcs = 472
    |  |  |  |  |  |  |  |  tcp_abort : wcs = 448
    |  |  |  |  |  |  |  |  |  tcp_abandon : wcs = 440
    |  |  |  |  |  |  |  |  |  |  http_err : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  http_state_free : wcs = 40
    |  |  |  |  |  |  |  |  |  |  |  |  http_state_eof : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  fs_close : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  mem_free : wcs = 32
    |  |  |  |  |  |  |  |  |  |  |  |  |  plug_holes : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  tcp_pcb_remove : wcs = 400
    |  |  |  |  |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  |  |  |  |  tcp_output_segment : wcs = 352
    |  |  |  |  |  |  |  |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  lwip_standard_chksum : wcs = 32
    |  |  |  |  |  |  |  |  |  |  |  |  |  ip_output : wcs = 312
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  ip_output_if : wcs = 272
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_output : wcs = 232
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_output_to_arp_index : wcs = 176
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_request : wcs = 160
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_raw : wcs = 128
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  hdkif_output : wcs = 72
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  hdkif_transmit : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  EMACTxHdrDescPtrWrite : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  hdkif_swizzle_data : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  hdkif_swizzle_txp : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  hdkif_swizzle_data : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_ref : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  mem_malloc : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  mem_free : wcs = 32
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_pool_is_empty : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_send_ip : wcs = 96
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  hdkif_output : wcs = 72
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_query : wcs = 192
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_find_entry : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_free_entry : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_request : wcs = 160
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_send_ip : wcs = 96
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_copy : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_ref : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  etharp_send_ip : wcs = 96
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  ip_route : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  ip_route : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  tcp_eff_send_mss : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  ip_route : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  tcp_seg_free : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  tcp_send_empty_ack : wcs = 344
    |  |  |  |  |  |  |  |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  ip_output : wcs = 312
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  tcp_output_alloc_header : wcs = 112
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_pcb_purge : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  tcp_segs_free : wcs = 80
    |  |  |  |  |  |  |  |  |  |  |  |  |  tcp_seg_free : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  ip_output : wcs = 312
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  tcp_segs_free : wcs = 80
    |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_kill_timewait : wcs = 464
    |  |  |  |  |  |  |  |  tcp_abort : wcs = 448
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_next_iss : wcs = 0
    |  |  |  |  |  tcp_setprio : wcs = 8
    |  |  |  ipaddr_ntoa : wcs = 56
    |  |  |  |  ipaddr_ntoa_r : wcs = 48
    |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  I_MOD : wcs = ???
    |  |  |  lwIPInit : wcs = 592
    |  |  |  |  dhcp_start : wcs = 360
    |  |  |  |  |  dhcp_discover : wcs = 344
    |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  dhcp_create_msg : wcs = 104
    |  |  |  |  |  |  |  dhcp_option : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_byte : wcs = 8
    |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_delete_msg : wcs = 64
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_option : wcs = 8
    |  |  |  |  |  |  dhcp_option_byte : wcs = 8
    |  |  |  |  |  |  dhcp_option_short : wcs = 8
    |  |  |  |  |  |  dhcp_option_trailer : wcs = 8
    |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  mem_trim : wcs = 40
    |  |  |  |  |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  ip_output_if : wcs = 272
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_chain : wcs = 40
    |  |  |  |  |  |  |  |  pbuf_cat : wcs = 16
    |  |  |  |  |  |  |  |  pbuf_ref : wcs = 24
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  |  |  udp_bind : wcs = 32
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  dhcp_stop : wcs = 56
    |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  udp_remove : wcs = 40
    |  |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  mem_malloc : wcs = 24
    |  |  |  |  |  memset : wcs = 20
    |  |  |  |  |  udp_bind : wcs = 32
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  udp_connect : wcs = 56
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  udp_new : wcs = 32
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  udp_recv : wcs = 16
    |  |  |  |  |  udp_remove : wcs = 40
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  hdkif_macaddrset : wcs = 16
    |  |  |  |  lwip_init : wcs = 64
    |  |  |  |  |  mem_init : wcs = 8
    |  |  |  |  |  memp_init : wcs = 8
    |  |  |  |  |  netif_init : wcs = 0
    |  |  |  |  |  stats_init : wcs = 0
    |  |  |  |  |  sys_timeouts_init : wcs = 56
    |  |  |  |  |  |  sys_now : wcs = 0
    |  |  |  |  |  |  sys_timeout : wcs = 48
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  tcp_init : wcs = 0
    |  |  |  |  |  udp_init : wcs = 0
    |  |  |  |  netif_add : wcs = 520
    |  |  |  |  |  hdkif_init : wcs = 176
    |  |  |  |  |  |  hdkif_hw_init : wcs = 160
    |  |  |  |  |  |  |  Dp83640IDGet : wcs = 48
    |  |  |  |  |  |  |  |  MDIOPhyRegRead : wcs = 24
    |  |  |  |  |  |  |  Dp83640LinkStatusGet : wcs = 48
    |  |  |  |  |  |  |  |  MDIOPhyLinkStatusGet : wcs = 8
    |  |  |  |  |  |  |  |  MDIOPhyRegRead : wcs = 24
    |  |  |  |  |  |  |  EMACCoreIntAck : wcs = 8
    |  |  |  |  |  |  |  EMACInit : wcs = 16
    |  |  |  |  |  |  |  EMACMACAddrSet : wcs = 16
    |  |  |  |  |  |  |  EMACMACSrcAddrSet : wcs = 8
    |  |  |  |  |  |  |  EMACMIIEnable : wcs = 8
    |  |  |  |  |  |  |  EMACNumFreeBufSet : wcs = 16
    |  |  |  |  |  |  |  EMACRxBroadCastEnable : wcs = 8
    |  |  |  |  |  |  |  EMACRxEnable : wcs = 8
    |  |  |  |  |  |  |  EMACRxHdrDescPtrWrite : wcs = 16
    |  |  |  |  |  |  |  EMACRxIntPulseEnable : wcs = 16
    |  |  |  |  |  |  |  EMACRxUnicastSet : wcs = 8
    |  |  |  |  |  |  |  EMACTxEnable : wcs = 8
    |  |  |  |  |  |  |  EMACTxIntPulseEnable : wcs = 16
    |  |  |  |  |  |  |  MDIOInit : wcs = 24
    |  |  |  |  |  |  |  |  U_DIV : wcs = ???
    |  |  |  |  |  |  |  MDIOPhyAliveStatusGet : wcs = 8
    |  |  |  |  |  |  |  hdkif_link_setup : wcs = 72
    |  |  |  |  |  |  |  |  Dp83640AutoNegotiate : wcs = 48
    |  |  |  |  |  |  |  |  |  MDIOPhyRegRead : wcs = 24
    |  |  |  |  |  |  |  |  |  MDIOPhyRegWrite : wcs = 16
    |  |  |  |  |  |  |  |  Dp83640PartnerAbilityGet : wcs = 40
    |  |  |  |  |  |  |  |  |  MDIOPhyRegRead : wcs = 24
    |  |  |  |  |  |  |  |  EMACDuplexSet : wcs = 8
    |  |  |  |  |  |  |  hdkif_swizzle_data : wcs = 8
    |  |  |  |  |  |  |  hdkif_swizzle_rxp : wcs = 16
    |  |  |  |  |  |  |  |  hdkif_swizzle_data : wcs = 8
    |  |  |  |  |  |  |  hdkif_swizzle_txp : wcs = 16
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_clen : wcs = 8
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  rtiEnableNotification : wcs = 8
    |  |  |  |  |  |  |  rtiStartCounter : wcs = 8
    |  |  |  |  |  |  |  sciDisplayText : wcs = 24
    |  |  |  |  |  |  |  |  sciSendByte : wcs = 8
    |  |  |  |  |  |  hdkif_inst_config : wcs = 8
    |  |  |  |  |  netif_set_addr : wcs = 496
    |  |  |  |  |  |  netif_set_gw : wcs = 8
    |  |  |  |  |  |  netif_set_ipaddr : wcs = 472
    |  |  |  |  |  |  |  tcp_abort : wcs = 448
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  netif_set_netmask : wcs = 8
    |  |  |  |  netif_set_default : wcs = 8
    |  |  |  |  netif_set_up : wcs = 168
    |  |  |  |  |  etharp_request : wcs = 160
    |  |  |  |  |  |  <repeat ...>
    |  |  |  rtiInit : wcs = 0
    |  |  |  sciDisplayText : wcs = 24
    |  |  |  |  <repeat ...>
    |  |  |  sciInit : wcs = 0
    |  |  |  sciReceive : wcs = 16
    |  |  gioInit : wcs = 0
    |  systemInit : wcs = 16
    |  |  mapClocks : wcs = 8
    |  |  muxInit : wcs = 0
    |  |  periphInit : wcs = 0
    |  |  setupFlash : wcs = 0
    |  |  setupPLL : wcs = 0
    |  |  trimLPO : wcs = 8
    |  |  |  customTrimLPO : wcs = 0
    |  vimInit : wcs = 8
    
    The roots of the following graphs are functions that: 
    - Are never called ... OR ...
    - Are called indirectly and are not listed among the functions called
      indirectly in the configuration file specified with --i_cfg=file.
      Run "perldoc call_graph.pl" for more information.
    ======================================================================
    
    abort : wcs = 0
    
    EMACCore0RxIsr : wcs = 824
    |  lwIPRxIntHandler : wcs = 728
    |  |  hdkif_rx_inthandler : wcs = 720
    |  |  |  EMACCoreIntAck : wcs = 8
    |  |  |  EMACRxCPWrite : wcs = 16
    |  |  |  EMACRxHdrDescPtrWrite : wcs = 16
    |  |  |  ethernet_input : wcs = 664
    |  |  |  |  etharp_arp_input : wcs = 160
    |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  etharp_update_arp_entry : wcs = 120
    |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  etharp_find_entry : wcs = 88
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  etharp_send_ip : wcs = 96
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  hdkif_output : wcs = 72
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  ip_input : wcs = 640
    |  |  |  |  |  icmp_dest_unreach : wcs = 368
    |  |  |  |  |  |  icmp_send_response : wcs = 352
    |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  inet_chksum : wcs = 48
    |  |  |  |  |  |  |  |  lwip_standard_chksum : wcs = 32
    |  |  |  |  |  |  |  ip_output : wcs = 312
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  icmp_input : wcs = 312
    |  |  |  |  |  |  inet_chksum : wcs = 48
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  inet_chksum_pbuf : wcs = 56
    |  |  |  |  |  |  |  lwip_standard_chksum : wcs = 32
    |  |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  |  ip_output_if : wcs = 272
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_copy : wcs = 24
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  inet_chksum : wcs = 48
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  raw_input : wcs = 32
    |  |  |  |  |  tcp_input : wcs = 608
    |  |  |  |  |  |  http_err : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  http_recv : wcs = 552
    |  |  |  |  |  |  |  http_close_conn : wcs = 480
    |  |  |  |  |  |  |  |  http_close_or_abort_conn : wcs = 464
    |  |  |  |  |  |  |  |  |  http_state_free : wcs = 40
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  tcp_abort : wcs = 448
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  tcp_arg : wcs = 8
    |  |  |  |  |  |  |  |  |  tcp_close : wcs = 432
    |  |  |  |  |  |  |  |  |  |  tcp_close_shutdown : wcs = 424
    |  |  |  |  |  |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_pcb_purge : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_pcb_remove : wcs = 400
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_send_fin : wcs = 136
    |  |  |  |  |  |  |  |  |  |  |  |  tcp_enqueue_flags : wcs = 120
    |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_clen : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  |  |  tcp_create_segment : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  tcp_seg_free : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_timer_needed : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  tcp_err : wcs = 8
    |  |  |  |  |  |  |  |  |  tcp_poll : wcs = 16
    |  |  |  |  |  |  |  |  |  tcp_recv : wcs = 8
    |  |  |  |  |  |  |  |  |  tcp_sent : wcs = 8
    |  |  |  |  |  |  |  http_parse_request : wcs = 160
    |  |  |  |  |  |  |  |  http_find_file : wcs = 104
    |  |  |  |  |  |  |  |  |  fs_open : wcs = 16
    |  |  |  |  |  |  |  |  |  |  strcmp : wcs = 0
    |  |  |  |  |  |  |  |  |  http_get_404_file : wcs = 32
    |  |  |  |  |  |  |  |  |  |  fs_open : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  http_init_file : wcs = 64
    |  |  |  |  |  |  |  |  |  |  strnstr : wcs = 32
    |  |  |  |  |  |  |  |  |  |  |  strlen : wcs = 0
    |  |  |  |  |  |  |  |  |  |  |  strncmp : wcs = 8
    |  |  |  |  |  |  |  |  |  strchr : wcs = 0
    |  |  |  |  |  |  |  |  pbuf_cat : wcs = 16
    |  |  |  |  |  |  |  |  pbuf_clen : wcs = 8
    |  |  |  |  |  |  |  |  pbuf_copy_partial : wcs = 32
    |  |  |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  |  strncmp : wcs = 8
    |  |  |  |  |  |  |  |  strnstr : wcs = 32
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  http_send : wcs = 528
    |  |  |  |  |  |  |  |  fs_bytes_left : wcs = 8
    |  |  |  |  |  |  |  |  http_check_eof : wcs = 512
    |  |  |  |  |  |  |  |  |  fs_bytes_left : wcs = 8
    |  |  |  |  |  |  |  |  |  http_eof : wcs = 496
    |  |  |  |  |  |  |  |  |  |  http_close_conn : wcs = 480
    |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  http_eof : wcs = 496
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  http_send_data_nonssi : wcs = 240
    |  |  |  |  |  |  |  |  |  http_write : wcs = 216
    |  |  |  |  |  |  |  |  |  |  tcp_write : wcs = 192
    |  |  |  |  |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  pbuf_cat : wcs = 16
    |  |  |  |  |  |  |  |  |  |  |  pbuf_clen : wcs = 8
    |  |  |  |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_create_segment : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_pbuf_prealloc : wcs = 112
    |  |  |  |  |  |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_segs_free : wcs = 80
    |  |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  |  |  tcp_write_checks : wcs = 8
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_recved : wcs = 400
    |  |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_update_rcv_ann_wnd : wcs = 16
    |  |  |  |  |  |  http_sent : wcs = 552
    |  |  |  |  |  |  |  http_send : wcs = 528
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  |  tcp_abort : wcs = 448
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_listen_input : wcs = 512
    |  |  |  |  |  |  |  tcp_abandon : wcs = 440
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_alloc : wcs = 488
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_eff_send_mss : wcs = 24
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_enqueue_flags : wcs = 120
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_parseopt : wcs = 16
    |  |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_timer_needed : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_pcb_remove : wcs = 400
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_process : wcs = 480
    |  |  |  |  |  |  |  http_accept : wcs = 60
    |  |  |  |  |  |  |  |  http_state_alloc : wcs = 36
    |  |  |  |  |  |  |  |  |  http_state_init : wcs = 28
    |  |  |  |  |  |  |  |  |  |  memset : wcs = 20
    |  |  |  |  |  |  |  |  |  mem_malloc : wcs = 24
    |  |  |  |  |  |  |  |  tcp_arg : wcs = 8
    |  |  |  |  |  |  |  |  tcp_err : wcs = 8
    |  |  |  |  |  |  |  |  tcp_poll : wcs = 16
    |  |  |  |  |  |  |  |  tcp_recv : wcs = 8
    |  |  |  |  |  |  |  |  tcp_sent : wcs = 8
    |  |  |  |  |  |  |  |  tcp_setprio : wcs = 8
    |  |  |  |  |  |  |  tcp_abort : wcs = 448
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_eff_send_mss : wcs = 24
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_parseopt : wcs = 16
    |  |  |  |  |  |  |  tcp_pcb_purge : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_receive : wcs = 392
    |  |  |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  |  |  pbuf_cat : wcs = 16
    |  |  |  |  |  |  |  |  pbuf_clen : wcs = 8
    |  |  |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_oos_insert_segment : wcs = 96
    |  |  |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  tcp_seg_free : wcs = 64
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  tcp_segs_free : wcs = 80
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_rexmit_fast : wcs = 24
    |  |  |  |  |  |  |  |  |  tcp_rexmit : wcs = 16
    |  |  |  |  |  |  |  |  tcp_seg_copy : wcs = 40
    |  |  |  |  |  |  |  |  |  memcpy : wcs = 0
    |  |  |  |  |  |  |  |  |  memp_malloc : wcs = 24
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  pbuf_ref : wcs = 24
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_seg_free : wcs = 64
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_send_empty_ack : wcs = 344
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_update_rcv_ann_wnd : wcs = 16
    |  |  |  |  |  |  |  tcp_rexmit : wcs = 16
    |  |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_seg_free : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_timer_needed : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_process_refused_data : wcs = 568
    |  |  |  |  |  |  |  http_recv : wcs = 552
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_recv_null : wcs = 456
    |  |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_close : wcs = 432
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  tcp_recved : wcs = 400
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_recv_null : wcs = 456
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_timewait_input : wcs = 400
    |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  udp_input : wcs = 592
    |  |  |  |  |  |  LocatorReceive : wcs = 384
    |  |  |  |  |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  udp_sendto : wcs = 352
    |  |  |  |  |  |  |  |  ip_route : wcs = 8
    |  |  |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_recv : wcs = 544
    |  |  |  |  |  |  |  dhcp_bind : wcs = 504
    |  |  |  |  |  |  |  |  U_DIV : wcs = ???
    |  |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  |  netif_set_gw : wcs = 8
    |  |  |  |  |  |  |  |  netif_set_ipaddr : wcs = 472
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  netif_set_netmask : wcs = 8
    |  |  |  |  |  |  |  |  netif_set_up : wcs = 168
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_handle_ack : wcs = 8
    |  |  |  |  |  |  |  dhcp_handle_nak : wcs = 488
    |  |  |  |  |  |  |  |  dhcp_discover : wcs = 344
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  |  netif_set_down : wcs = 88
    |  |  |  |  |  |  |  |  |  etharp_cleanup_netif : wcs = 80
    |  |  |  |  |  |  |  |  |  |  etharp_free_entry : wcs = 64
    |  |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  netif_set_gw : wcs = 8
    |  |  |  |  |  |  |  |  netif_set_ipaddr : wcs = 472
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  netif_set_netmask : wcs = 8
    |  |  |  |  |  |  |  dhcp_handle_offer : wcs = 360
    |  |  |  |  |  |  |  |  dhcp_select : wcs = 344
    |  |  |  |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  |  |  |  dhcp_create_msg : wcs = 104
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  dhcp_delete_msg : wcs = 64
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  dhcp_option : wcs = 8
    |  |  |  |  |  |  |  |  |  dhcp_option_byte : wcs = 8
    |  |  |  |  |  |  |  |  |  dhcp_option_long : wcs = 8
    |  |  |  |  |  |  |  |  |  dhcp_option_short : wcs = 8
    |  |  |  |  |  |  |  |  |  dhcp_option_trailer : wcs = 8
    |  |  |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_parse_reply : wcs = 88
    |  |  |  |  |  |  |  |  memset : wcs = 20
    |  |  |  |  |  |  |  |  pbuf_copy_partial : wcs = 32
    |  |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  icmp_dest_unreach : wcs = 368
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  ip4_addr_isbroadcast : wcs = 16
    |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  pbuf_header : wcs = 16
    |  |  |  |  memcmp : wcs = 8
    |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  <repeat ...>
    |  |  |  |  pbuf_header : wcs = 16
    |  |  |  hdkif_swizzle_data : wcs = 8
    |  |  |  hdkif_swizzle_rxp : wcs = 16
    |  |  |  |  <repeat ...>
    |  |  |  pbuf_alloc : wcs = 88
    |  |  |  |  <repeat ...>
    |  |  |  pbuf_free : wcs = 56
    |  |  |  |  <repeat ...>
    
    EMACCore0TxIsr : wcs = 184
    |  lwIPTxIntHandler : wcs = 88
    |  |  hdkif_tx_inthandler : wcs = 80
    |  |  |  EMACCoreIntAck : wcs = 8
    |  |  |  EMACTxCPWrite : wcs = 16
    |  |  |  hdkif_swizzle_data : wcs = 8
    |  |  |  hdkif_swizzle_txp : wcs = 16
    |  |  |  |  <repeat ...>
    |  |  |  pbuf_free : wcs = 56
    |  |  |  |  <repeat ...>
    
    EMACRxIntISR : wcs = 144
    |  EMACCoreIntAck : wcs = 8
    |  EMACReceive : wcs = 40
    |  |  EMACRxCPWrite : wcs = 16
    |  |  EMACRxHdrDescPtrWrite : wcs = 16
    |  |  EMACSwizzleData : wcs = 8
    |  emacRxNotification : wcs = 8
    
    EMACTxIntISR : wcs = 144
    |  EMACCoreIntAck : wcs = 8
    |  EMACTxIntHandler : wcs = 40
    |  |  EMACSwizzleData : wcs = 8
    |  |  EMACTxCPWrite : wcs = 16
    |  emacTxNotification : wcs = 8
    
    __TI_auto_init_nobinit_nopinit : wcs = 16
    |  _system_post_cinit : wcs = ???
    
    __TI_decompress_lzss : wcs = 24
    
    __TI_decompress_none : wcs = 0
    |  memcpy : wcs = 0
    
    __TI_zero_init : wcs = 20
    |  memset : wcs = 20
    
    __aeabi_idivmod : wcs = 12
    |  __aeabi_idiv0 : wcs = ???
    
    __aeabi_uidivmod : wcs = 8
    |  __aeabi_idiv0 : wcs = ???
    
    esmHighInterrupt : wcs = 112
    |  esmGroup1Notification : wcs = 8
    |  esmGroup2Notification : wcs = 8
    
    phantomInterrupt : wcs = 0
    
    rtiCompare3Interrupt : wcs = 752
    |  rtiNotification : wcs = 656
    |  |  sys_check_timeouts : wcs = 640
    |  |  |  arp_timer : wcs = 88
    |  |  |  |  etharp_tmr : wcs = 80
    |  |  |  |  |  etharp_free_entry : wcs = 64
    |  |  |  |  |  |  <repeat ...>
    |  |  |  |  sys_timeout : wcs = 48
    |  |  |  |  |  <repeat ...>
    |  |  |  dhcp_timer_coarse : wcs = 376
    |  |  |  |  dhcp_coarse_tmr : wcs = 368
    |  |  |  |  |  dhcp_t1_timeout : wcs = 360
    |  |  |  |  |  |  dhcp_renew : wcs = 344
    |  |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  |  dhcp_create_msg : wcs = 104
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_delete_msg : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_option : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_short : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_trailer : wcs = 8
    |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  dhcp_t2_timeout : wcs = 360
    |  |  |  |  |  |  dhcp_rebind : wcs = 344
    |  |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  |  dhcp_create_msg : wcs = 104
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_delete_msg : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_option : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_short : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_trailer : wcs = 8
    |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  sys_timeout : wcs = 48
    |  |  |  |  |  <repeat ...>
    |  |  |  dhcp_timer_fine : wcs = 528
    |  |  |  |  dhcp_fine_tmr : wcs = 520
    |  |  |  |  |  dhcp_timeout : wcs = 512
    |  |  |  |  |  |  dhcp_discover : wcs = 344
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_rebind : wcs = 344
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_reboot : wcs = 344
    |  |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  |  dhcp_create_msg : wcs = 104
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_delete_msg : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_option : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_long : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_short : wcs = 8
    |  |  |  |  |  |  |  dhcp_option_trailer : wcs = 8
    |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_release : wcs = 496
    |  |  |  |  |  |  |  I_DIV : wcs = ???
    |  |  |  |  |  |  |  dhcp_create_msg : wcs = 104
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_delete_msg : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  dhcp_option_trailer : wcs = 8
    |  |  |  |  |  |  |  dhcp_set_state : wcs = 8
    |  |  |  |  |  |  |  netif_set_down : wcs = 88
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  netif_set_gw : wcs = 8
    |  |  |  |  |  |  |  netif_set_ipaddr : wcs = 472
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  netif_set_netmask : wcs = 8
    |  |  |  |  |  |  |  pbuf_realloc : wcs = 80
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  udp_sendto_if : wcs = 320
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_renew : wcs = 344
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  dhcp_select : wcs = 344
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  sys_timeout : wcs = 48
    |  |  |  |  |  <repeat ...>
    |  |  |  memp_free : wcs = 24
    |  |  |  |  <repeat ...>
    |  |  |  pbuf_free_ooseq : wcs = 96
    |  |  |  |  sys_arch_protect : wcs = 8
    |  |  |  |  |  <repeat ...>
    |  |  |  |  sys_arch_unprotect : wcs = 8
    |  |  |  |  |  <repeat ...>
    |  |  |  |  tcp_segs_free : wcs = 80
    |  |  |  |  |  <repeat ...>
    |  |  |  sys_now : wcs = 0
    |  |  |  tcpip_tcp_timer : wcs = 608
    |  |  |  |  sys_timeout : wcs = 48
    |  |  |  |  |  <repeat ...>
    |  |  |  |  tcp_tmr : wcs = 600
    |  |  |  |  |  tcp_fasttmr : wcs = 584
    |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_process_refused_data : wcs = 568
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  tcp_slowtmr : wcs = 592
    |  |  |  |  |  |  U_DIV : wcs = ???
    |  |  |  |  |  |  http_err : wcs = 56
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  http_poll : wcs = 552
    |  |  |  |  |  |  |  http_close_conn : wcs = 480
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  http_send : wcs = 528
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  memp_free : wcs = 24
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_keepalive : wcs = 336
    |  |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  ip_output : wcs = 312
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_output_alloc_header : wcs = 112
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_pcb_purge : wcs = 88
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_rexmit_rto : wcs = 400
    |  |  |  |  |  |  |  tcp_output : wcs = 384
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_rst : wcs = 352
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_segs_free : wcs = 80
    |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  tcp_zero_window_probe : wcs = 352
    |  |  |  |  |  |  |  inet_chksum_pseudo : wcs = 64
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  ip_output : wcs = 312
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_copy_partial : wcs = 32
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  pbuf_free : wcs = 56
    |  |  |  |  |  |  |  |  <repeat ...>
    |  |  |  |  |  |  |  tcp_output_alloc_header : wcs = 112
    |  |  |  |  |  |  |  |  <repeat ...>
    
    tcp_accept_null : wcs = 16
    
    vimECCErrorHandler : wcs = 120
    |  esmGroup1Notification : wcs = 8
    |  esmGroup2Notification : wcs = 8
    
    
    The following functions are known to contain indirect function calls, but
    do not contain any information about those indirect calls in the configuration
    file specified with --i_cfg=file.  Run "perldoc call_graph.pl" for more
    information.
    ======================================================================
    
    __TI_auto_init_nobinit_nopinit
    

  • Previous analysis of the code in hercules_examples\Application\LwIP\v00.04.00 code found that the sys_check_timeouts() function wasn't been called, thus meaning LwIP timers weren't being scheduled.

    The HALCoGen configuration was changed to enable RTI compare 3 to generate an interrupt with a 10 millisecond period and:

    a. rtiNotification() used to call sys_check_timeouts() to schedule any LwIP timers.

    b. sys_now() modified to return the system time in milliseconds - incremented by 10 every RTI compare 3 interrupt.

    With the addition of scheduling of LwIP timers the behavior when using a Linux web browser has changed in that while the webpage still noticeably stalls initially with about 1/3rd of the block diagram initially displayed, after a few seconds 2/3rd's are displayed and then a few seconds later the webpage is completely displayed.

    When a Windows web browser is used and the page displays 'instantly' there are no errors reported in lwip_stats.memp[MEMP_NUM_PBUF]:

    lwip_stats	struct stats_	{link={xmit=189,recv=117,fw=0,drop=0,chkerr=0...},etharp={xmit=2,recv=4,fw=0,drop=...,ip=...	0x080109A8	
    	link	struct stats_proto	{xmit=189,recv=117,fw=0,drop=0,chkerr=0...}	0x080109A8	
    	etharp	struct stats_proto	{xmit=2,recv=4,fw=0,drop=0,chkerr=0...}	0x080109C0	
    	ip	struct stats_proto	{xmit=186,recv=113,fw=0,drop=0,chkerr=0...}	0x080109D8	
    	icmp	struct stats_proto	{xmit=1,recv=1,fw=0,drop=0,chkerr=0...}	0x080109F0	
    	udp	struct stats_proto	{xmit=3,recv=2,fw=0,drop=0,chkerr=0...}	0x08010A08	
    	tcp	struct stats_proto	{xmit=179,recv=101,fw=0,drop=0,chkerr=0...}	0x08010A20	
    	mem	struct stats_mem	{avail=30720,used=68,max=456,err=0,illegal=0}	0x08010A38	
    	memp	struct stats_mem[8]	[{avail=4,used=0,max=0,err=0,illegal=0},{avail=4,used=2,max=2,err=0,illegal=0},{avail=...,...	0x08010A42	
    lwip_stats.memp[6]	struct stats_mem	{avail=48,used=0,max=2,err=0,illegal=0}	0x08010A7E	
    localTimeMilliseconds	unsigned int	42460	0x08010D7C	

    Whereas when a Linux web browser is used and the webpage now completes displaying after a delay there are out-of-memory errors reported in lwip_stats.memp[MEMP_NUM_PBUF]:

    lwip_stats	struct stats_	{link={xmit=219,recv=176,fw=0,drop=0,chkerr=0...},etharp={xmit=3,recv=2,fw=0,drop=...,ip=...	0x080109A8	
    	link	struct stats_proto	{xmit=219,recv=176,fw=0,drop=0,chkerr=0...}	0x080109A8	
    	etharp	struct stats_proto	{xmit=3,recv=2,fw=0,drop=0,chkerr=0...}	0x080109C0	
    	ip	struct stats_proto	{xmit=217,recv=174,fw=0,drop=0,chkerr=0...}	0x080109D8	
    	icmp	struct stats_proto	{xmit=0,recv=0,fw=0,drop=0,chkerr=0...}	0x080109F0	
    	udp	struct stats_proto	{xmit=3,recv=2,fw=0,drop=0,chkerr=0...}	0x08010A08	
    	tcp	struct stats_proto	{xmit=211,recv=171,fw=0,drop=0,chkerr=0...}	0x08010A20	
    	mem	struct stats_mem	{avail=30720,used=68,max=4048,err=0,illegal=0}	0x08010A38	
    	memp	struct stats_mem[8]	[{avail=4,used=0,max=0,err=0,illegal=0},{avail=4,used=2,max=2,err=0,illegal=0},{avail=...,...	0x08010A42	
    lwip_stats.memp[6]	struct stats_mem	{avail=48,used=0,max=48,err=97,illegal=0}	0x08010A7E	
    localTimeMilliseconds	unsigned int	52880	0x08010D7C	

    Therefore, adding support to schedule LwIP timers has worked around the problem of the hdkif running of pbuf's when transmitting, by causing the transmission to resume after a timeout. Still need to find the root cause.

    Also, have been running the example in projects for the following types of board, which all behave in the same way, in that have the same issue when using a Linux web browser:

    1. LAUNCHXL2-570LC43
    2. TMDX570LC43HDK (uses a different pin-mux for the Ethernet Phy than the LAUNCHXL2-570LC43
    3. TMDSRM48HDK (uses a little-endian Cortex-R4F with no cache as opposed to the above two which use a big-endian Cortex-R5F with a cache)