9 years, 2 months ago.

RPC for RawSerial hangs after sometime

I have added RPC support on FRDM K64 target so that i can communicate from PC using python.

I have K64 communicating with BT chip over UART (for this I have to use RawSerial as Serial had problems where it hangs due to mutex calls from C library). This is on UART0.

From python script I am trying to call putc and getc. It works for some time but later my mbed target gets hanged in serial_getc() function and never comes out of this.

Note: the hang is not seen when I disable my debug serial terminal which is on UART3. It is only when the debug terminal is on the mbed hangs in serial_getc().

Code snippet on mbed:

mbed k64 code

Serial pc(PTC17,PTC16);

#include "mbed.h"
main()
{
    EthernetInterface eth;
    if(eth.init())
    {
        pc.printf("Error while initializing the ethernet interface.\n");
        return -1;
    }
    if(eth.connect())
    {
        pc.printf("Error while starting the ethernet interface.\n");
        return -1;
    }
    
    pc.printf("IP Address is %s\n", eth.getIPAddress());

	RPC::add_rpc_class<RpcRawSerial>();    // Note:  I added RPCRawSerial support in RPCclasses.h
	RpcRawSerial bt(PTB17,PTB16,"btuart");  

     TCPSocketServer server;
     server.bind(ECHO_SERVER_PORT);
     server.listen();


     while (true) {
     pc.printf("\nWait for new connection...\n");
     TCPSocketConnection client;
     server.accept(client);
     pc.printf("Connection from: %s\n", client.get_address());
     char buffer[256];

     while (true) 
        {
			

            int n = client.receive(buffer, sizeof(buffer));
            if (n <= 0) break;
   

            buffer[n] = '\0';
            pc.printf("Received message from Client :'%s'\n",buffer);
                
                RPC::call(buffer, outbuf);
                pc.printf("Result got =%s\n", outbuf);
							  
                client.send_all(outbuf, n);
                if (n <= 0) break;

        }

          client.close();
	
    }

    return 0;
}

I tried even using the RPCSerial instead of my own RPCRawSerial, but the result is the same. Hangs in serial_getc.

Only after completely disabling the debug UART it works fine.

Any clue on Why there is a hang when debug is enabled ?

mbed k64 code

My RPC raw Serial class is as below
class RpcRawSerial : public RPC {
public:
    RpcRawSerial(PinName a0, PinName a1, const char *name=NULL) : RPC(name), o(a0, a1) {}

    void baud(int a0) {o.baud(a0);}
    int readable(void) {return o.readable();}
    int writeable(void) {return o.writeable();}
    int putc(int a0) {return o.putc(a0);}
    int getc(void) {return o.getc();}
    int puts(const char * a0) {return o.puts(a0);}

    virtual const struct rpc_method *get_rpc_methods() {
        static const rpc_method rpc_methods[] = {
            {"baud", rpc_method_caller<RpcRawSerial, int, &RpcRawSerial::baud>},
            {"readable", rpc_method_caller<int, RpcRawSerial, &RpcRawSerial::readable>},
            {"writeable", rpc_method_caller<int, RpcRawSerial, &RpcRawSerial::writeable>},
            {"putc", rpc_method_caller<int, RpcRawSerial, int, &RpcRawSerial::putc>},
            {"getc", rpc_method_caller<int, RpcRawSerial, &RpcRawSerial::getc>},
            {"puts", rpc_method_caller<int, RpcRawSerial, const char *, &RpcRawSerial::puts>},
            RPC_METHOD_SUPER(RPC)
        };
        return rpc_methods;
    }
    static struct rpc_class *get_rpc_class() {
        static const rpc_function funcs[] = {
            {"new", rpc_function_caller<const char*, PinName, PinName, const char*, &RPC::construct<RpcRawSerial, PinName, PinName, const char*> >},
            RPC_METHOD_END
        };
        static rpc_class c = {"RawSerial", funcs, NULL};
        return &c;
    }
private:
    RawSerial o;    //Instead of Serial, i made it RawSerial
};

-yk

Any input on why a hang (serial_getc) when I use the standard RPC serial along with the serial debug port. It does not hang when I do not use my serial debug port. I want both enabled as part of my project.? Any approach I should take to debug this problem ? - YK

posted by yogesh kulkarni 27 Oct 2015
Be the first to answer this question.