• AVR Freaks

Hot!PIC32mx TCPIP and FreeRTOS how do I make them work together?

Author
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
2021/02/03 01:44:44 (permalink)
0

PIC32mx TCPIP and FreeRTOS how do I make them work together?

Hello,
 
I use:
PIC32MX795f512l
MPLAB X IDE v5.45
Harmony V3
I have downloaded all the latest version of the packages at this moment.
 
 
So I need to make TCPIP and FreeRTOS work together for my project.
I have a few tasks that need to run in different threads and meanwhile I need to be listening for TCP commands to do what they say. I don't need a webserver or anything else with my project, it just needs a TCP server that reacts to different commands send from my pc.
 
I have made a test project to test just the TCP part and I got a TCP server running that can react to the TCP commands. Now I want to integrate the TCP part with the main project, but when I set all the settings right with Harmony V3 and then implemented the code for the TCP server for the PIC32 it did not work. I could not ping the module.
So I went back to the test project and found that this did not use FreeRTOS. I added this to the project and when I did, the project just stopped working. I could not ping the PIC32 nor would it react to any of the commands I sent.
 
So my big question is: 
What is the main reason they don't work together nicely and How can I make the TCPIP work together with FreeRTOS?
 
thank you in advance for your help.
#1
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/03 08:57:00 (permalink)
0
If you have your PIC32MX project up and running, just adding FreeRTOS to it with MHC shouldn't be difficult.
I recommend to use an existing FreeRTOS project (on PIC32MZ, for example) and check how the FreeRTOS is configured and how all the modules RTOS settings (stack, priority, etc.) are handled.
Once you've done that, you can check the project output: does the stack get initialized, reports errors, etc.
 
#2
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/04 01:49:13 (permalink)
0
Hi Rainad,
Well, that is exactly what I've tried. I first had the PIC32MX TCPIP project running and it worked good. Then I tried to add the FreeRTOS with MHC. But when I did add the FreeRTOS the TCPIP did not work any more. So I looked online for answers, did find that I might have to increase the Total Heap Size, so I did with no result. Also used a different Memory Management Types, by default Heap_1 was selected, I also tried 4.
 
Also a problem I run into when I tried to open the MHC for the FreeRTOS demo project for the PIC32MZ (https://github.com/Microc...r/Demo/PIC32MZ_MPLAB), is that it does not want to open. I get this error message when I try to open:
 [image]data:image/png;base64,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[/image]
 I also could not find a demo project that does use both TCPIP and FreeRTOS. I used the net_apps_pic323mx project for the tcpip client application (https://github.com/Microc...apps/tcpip_tcp_client) But as soon as I add the FreeRTOS it stops working.
 
Do you have a (github link to) a project that you are certain should work that uses both TCPIP and FreeRTOS? Or if you know what I should add to the tcpip client demo to make it work with FreeRTOS, that would be great.
#3
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/04 01:51:14 (permalink)
0
Sorry, the picture did not send at all what I had hoped for...
But it said:
"MBLOAB Harmony COnfigurator could not find requeired files in this project configuration.
This project configuration may not have been created with the MPLAB Harmony Configurator New Project Wizard or it has been incorrectly modified in some way."
#4
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/04 11:10:50 (permalink)
0
There are plenty of FreeRTOS for PIC32MZ but not for PIC32MX unfortunately.
When you say "But when I did add the FreeRTOS the TCPIP did not work any more" what exactly happens?
Please post here the tcpip console output and we can see what the problem is.
Most likely it's some configuration issue: stack, heap, etc.
 
#5
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/08 08:33:51 (permalink)
0
Okay, I've tried it with the sys_console_messages via the usb connection on the ETH_SK2
So, I added FreeRTOS via Harmony 3 and then connected the usb to my PC and when I connected the Ethernet cable this is what it said:
PIC32INT IP Address: 10.10.0.15 
Waiting for command type: openurl <url>
Waiting for Client Connection on port: 30000

 
So it looks like the TCPIP stack does start up right, but when I try to send one of the commands to the PIC, it does not respond. I use Packet sender for sending the TCP commands and it says "Could not connect"
 
As for my settings, I have my stack size for both the RTOS app and the TCPIP Core set to 8192 Bytes
The other settings in TCPIP core are set as the default.
I have the total heap size for FreeRTOS set to 50 000
 
I saw within the Heap configuration for the TCPIP core the setting for Heap area usage, in the dropdown there is the setting for TCPIP_STACK_HEAP_USE_SOCKET_TCP so I tried setting it to this, but still no response on my commands.
Any other settings you need to know or I should try to chance?
#6
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/08 15:59:26 (permalink)
4 (1)
Youri
So it looks like the TCPIP stack does start up right, but when I try to send one of the commands to the PIC, it does not respond. I use Packet sender for sending the TCP commands and it says "Could not connect"

What command do you try from the PC?
Is it UDP or TCP? Do you have a socket waiting on that  port on your PIC board?
 
Youri
I saw within the Heap configuration for the TCPIP core the setting for Heap area usage, in the dropdown there is the setting for TCPIP_STACK_HEAP_USE_SOCKET_TCP so I tried setting it to this, but still no response on my commands.

I'm not aware of this setting: TCPIP_STACK_HEAP_USE_SOCKET_TCP.
Can you please share a screen shot to see where this setting comes from?
 
 
#7
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/09 00:29:27 (permalink)
0
I use TCP for the communication. I have setup a TCP server on the PIC that's waiting on port 30 000. When I send "HI" from my PC it should respond with "Hello" This was just to test out the communication between the PC an PIC.
This part does work when I don't use FreeRTOS, I get the response I expect from the PIC but when I do add FreeRTOS via Harmony, The PIC does not respond anymore.
 
I tried to attach the screenshot of the setting, but every time I upload it, it l get the error "File upload failed" I tried it a lot of times. But the setting can be found within the TCPIP stack in the Basic Configurations Tab then go to the TCPIP Core and in the HEAP configuration there is the setting for Heap area usage, this setting has a little drop down where you can select a few different things amoung which the TCPIP_STACK_HEAP_USE_SOCKET_TCP
#8
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/09 06:40:59 (permalink)
0
What version of H3 net package do you use?
There's only 3 options under TCPIP Core->Heap Configuration->Use Heap Config:
TCPIP_STACK_HEAP_TYPE_EXTERNAL_HEAP
 TCPIP_STACK_HEAP_TYPE_INTERNAL_HEAP
TCPIP_STACK_HEAP_TYPE_INTERNAL_HEAP_POOL
 
Please show the console output from the start.
- enable the TCP commands in MHC and then type 'tcp info' from your console
 - type 'netinfo' and 'heapinfo'
Let's see what you get. FreeRTOS or not, the stack should work.
 
 
 
 
 
 
 
 
#9
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/09 08:05:11 (permalink)
0
I use Net version 3.7.0
But the option for TCPIP_STACK_HEAP_USE_SOCKET_TCP is not under Heap Configuration->Use Heap Config but it can be found under Heap Configuration->Heap area usage.
For me, it is about 6 rows down from the Use Heap Config.
I have the same 3 option at that one as you posted.
 
First I tried the commands without FreeRTOS:
I did enable the TCP commands but when I type 'tcp info' it returns with:
*** Command Processor: unknown command. ***
 
With netinfo it returned:
 
---------- Interface <eth0/PIC32INT> ---------- 
Host Name: MCHPBOARD_E - NBNS disabled
IPv4 Address: 10.10.0.15
Mask: 255.255.255.0
Gateway: 10.10.0.100
DNS: 10.10.0.100
MAC Address: 54:10:ec:0d:3b:28
default IP address is ON
Link is UP
Status: Ready

 
heapinfo returned:
Heap type: internal. Initial created heap size: 39168 Bytes
Allocable block heap size: 29888 Bytes
All available heap size: 29888 Bytes, high watermark: 9280
Last heap error: 0x0
No Trace info exists.

 
 
Now I try it with FreeRTOS:
Something weird happens. I use Coolterm for the usb connection between the board and my PC.
I can type to the console pretty good untill I also connect the Ethernet cable. I do get the messages I shared last time that end with "waiting for client connection on port 30000"
But I cannot type inside the coolterm console to send the commands. When I try to disconnect from the port Coolterm has a hard time and is not responding for a little while, after that it does disconnect but I cannot reconnect. I get the error message "5: Access Denied"
 
#10
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/09 09:30:56 (permalink)
0
Probably the command is 'tcpinfo' rather than 2 different words.
Looks like you have some misconfiguration when FreeRTOS is brought to the mix.
Make a comparison with an working PIC32MZ FreeRTOS project and see if you can spot any difference.
Make sure you have enough stack for the console and command tasks.
 
 
#11
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/12 08:48:36 (permalink)
0
Yes it was tcpinfo, it gave me the number of max sockets it could be running which was 10.
I've tried changing a lot of different settings with heap size and even the Rx and Tx buffer sizes.
I've used a PIC32MZ demo project to configure the heap size and stack size and it did not work.
At the moment I have a TCPIP stack size of 12 000 and the total is 50 000.
 
I have messed with all the number I could find and never found a combination that worked.
So, I have no idea what sizes for the stacks I should try next, I feel like have made them way, way higher at some points than they ever should be. I maxed the stack sizes at one point and it didn't even work.
#12
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/12 09:20:15 (permalink)
4 (1)
So what is the output of 'tcpinfo' then, this was the question.
 
TCP/IP heap == 12 K is on the low side.
You should increase it, make it at least 40 K for now and then you can tune it down if needed.
 
#13
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/16 08:54:54 (permalink)
0
Forum:
This is what tcpinfo says after the thernet cable is inserted when I am not using FreeRTOS:

.sktIx: 0, addType: 1, remotePort: 0, localPort: 30000, flags: 0x05
.rxSize: 512, txSize: 513, state: 0, rxPend: 0, txPend: 0


But when I do use Free RTOS, as soon as I connect a Ethernet cable the USB stops working and I cannot send any commands, so I cannot check what tcpinfo says then.
 
So this behavior is a bit weird. So I looked into it a bit more with the debugger. I have removed most of the TCP code, I only left in the initialization, to see what happens when the cable is plugged in. As soon as I put the ethernet cable into the port, the debugger halts at the __builtin_software_breakpoint() inside of the _general_exception_handler in the exceptions.c file.
 
for this I used the following settings for the heap:
TCP/IP Stack Dynamic RAM Size = 40k
FreeRTOS total heap size = 50 k
 
 
I checked the call stack and this is what it said:

Runtime exception @ PC address 0x9d006d84 in function: TCPIP_STACK_Task ( )  at  d:/mplab/tcpip_tcp_client/firmware/src/config/pic32mx_eth_sk2/library/tcpip/src/tcpip_manager.c : 1764   

 
This line is inside the static void _TCPIPStackExecuteModules(void) function which is:
 #if !defined(TCPIP_STACK_APP_EXECUTE_MODULE_TASKS)
static void _TCPIPStackExecuteModules(void)
{
    int     modIx;
    TCPIP_MODULE_SIGNAL_ENTRY*  pSigEntry;
    tcpipModuleSignalHandler    signalHandler;
    uint16_t                    signalVal;
    OSAL_CRITSECT_DATA_TYPE     critSect;

    pSigEntry = TCPIP_STACK_MODULE_SIGNAL_TBL + TCPIP_MODULE_LAYER1;
    for(modIx = TCPIP_MODULE_LAYER1; modIx < sizeof(TCPIP_STACK_MODULE_SIGNAL_TBL)/sizeof(*TCPIP_STACK_MODULE_SIGNAL_TBL); modIx++, pSigEntry++)
    {
        critSect =  OSAL_CRIT_Enter(OSAL_CRIT_TYPE_LOW);
        signalHandler = pSigEntry->signalHandler;
        signalVal = pSigEntry->signalVal;
        OSAL_CRIT_Leave(OSAL_CRIT_TYPE_LOW, critSect);

        if(signalHandler == 0 || signalVal == 0)
        {   // unused slot or no pending signals
            continue;
        }
        // pending signals; either TMO or RX related or ASYNC
        // execute the handler-> module Task function
        // Note: this can set signals for sibling modules!
        (*signalHandler)();
    }
}
#endif  // !defined(TCPIP_STACK_APP_EXECUTE_MODULE_TASKS)

 
the line 1764 itself is
 critSect =  OSAL_CRIT_Enter(OSAL_CRIT_TYPE_LOW); 

 
How I understand this now, is that if the TCPIP_STACK_APP_EXECUTE_MODULE_TASKS is defined, it would respond on the TCP singals internally within another part of the code (I found some comments that lead me to this conclusion), if it is not, it will run this code. I'm not sure what exactly this does do.
 
So maybe this helps.
#14
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/18 09:11:34 (permalink)
4.5 (2)
Just increase the stack size for the TCP/IP thread. How big is it now?
 
#15
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/19 07:00:47 (permalink)
0
I think there has been a bit of progress. Now when I debug the code it runs well up to the moment it wants to open the port. In this part of the code it has the if statement:
if (OSAL_SEM_Pend(&tcpSemaphore, OSAL_WAIT_FOREVER) != OSAL_RESULT_TRUE)
    {
        // SYS_DEBUG message
    }
    for(hTCP = 0; hTCP < TcpSockets; hTCP++)
    {
        pSkt = TCBStubs[hTCP];
        if(pSkt == 0)
        { // found an empty slot
            break;
        }
    }

The moment it returns from the OSAL_SEM_Pend function I end up in the general exception.
 
I have added a picture of my TCPIP Core settings and one of my FreeRTOS settings from Harmony.
I have had this work up to this part with lower values for the TCP/IP Stack Dynamic Ram size (about 30k) and the TCP RTOS Stack size of about 8k.
I also tried to increase both values, but when I set the TCP/IP Stack Dynamic Ram Size to 60k, the program just doesn't run smoothly, it takes a long time to even enitialize. And when I increase the TCP RTOS Stack size further, it looks like there is not enough left for the other parts of FreeRTOS, because this too takes way to long to get past the initialization.
 
So it seems like I can't really increase the sizes of the stacks and when I try to increase the total heap size for the FreeRTOS I get an error when building that I don't have enough memory for heap. So that seems pretty maxed out.
 

Attached Image(s)

#16
Youri
New Member
  • Total Posts : 14
  • Reward points : 0
  • Joined: 2021/01/14 08:03:10
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/19 08:42:58 (permalink)
0
I also tried to run the code without opening the port and just sent it to an idle state and see what will happen. To check if the problem is within opening the port part of the code.
 
So I ran the code without opening the socket. This state would just call the idle state.
When I did connect the ethernet cable, the debugger did halt at the general exception handler again. Via call stack it said that the runtime exception was in function prvCheckTasksWaitingTermination.
 
So with this it looks like it is not the tcpip part that doesn't work, or at least, the fault is not within opening the socket.
#17
rainad
Super Member
  • Total Posts : 1476
  • Reward points : 0
  • Joined: 2009/05/01 13:39:25
  • Location: 0
  • Status: offline
Re: PIC32mx TCPIP and FreeRTOS how do I make them work together? 2021/02/23 07:02:56 (permalink)
0
40 KB stack size for the TCP/IP stack is excessive. Max 8KB will do.
Probably you have some issues on that board.
Maybe you can try a plain  serial connection, without using USB for now, to understand which piece creates the issue.
 
 
#18
Jump to:
© 2021 APG vNext Commercial Version 4.5