embkernel
 All Classes Functions Variables Typedefs Groups Pages
LibRtosTraceNet.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "LibRtosTraceNet.hpp"
7 
8 LibTraceRtosNet::LibTraceRtosNet(int priority, size_t stackSize, uint16_t port) :
9  mTask(priority, "RTOS_TRACE", stackSize, *this) {
10  mPort = port;
11 }
12 
13 LibTraceRtosNet::~LibTraceRtosNet() {
14 }
15 
16 void LibTraceRtosNet::run() {
17  while (true) {
18  mSocket.listen(mPort);
19  mSocket.accept(Rtos::TICK_INFINITE);
20  Rtos::clearTraceBuffer();
21  while (mSocket.isConnected()) {
22  LibPktHandler::PKT* pkt;
23  LibPktHandler::RESULT result = mPktHandler.recvPkt(mSocket, &pkt, RTOS_CFG_TRACE_BUFFER_SIZE / 2);
24  if (result == LibPktHandler::RES_SUCCESS) {
25  switch (pkt->hdr.cmd) {
26  case CMD_GET_TASK_NAME: {
27  RtosTask* task = (RtosTask*) ((uint32_t*) pkt->data)[0];
28  mPktHandler.sendPkt(mSocket, CMD_GET_TASK_NAME, strlen(task->getName()), task->getName());
29  break;
30  }
31  case GET_CLOCK_FREQUENCY: {
32  uint32_t frequency = RTOS_CFG_CPU_FREQUENCY;
33  mPktHandler.sendPkt(mSocket, GET_CLOCK_FREQUENCY, 4, &frequency);
34  break;
35  }
36  case CMD_GET_TASK_STACK: {
37  RtosTask* task = (RtosTask*) ((uint32_t*) pkt->data)[0];
38  uint32_t param[3];
39  param[0] = (uint32_t) task;
40  param[1] = task->getStackSize();
41  param[2] = task->getFreeStackSize();
42  mPktHandler.sendPkt(mSocket, CMD_GET_TASK_STACK, sizeof(param), param);
43  break;
44  }
45  default:
46  break;
47  }
48  mPktHandler.freePkt(&pkt);
49  }
50 
51  Rtos::TRACE_TAG* tag;
52  int count = Rtos::getTraceBuffer(&tag);
53  if (count > 0) {
54  mPktHandler.sendPkt(mSocket, CMD_SEND_TRACE_TAGS, count * sizeof(Rtos::TRACE_TAG), tag);
55  Rtos::releaseBuffer(count);
56  }
57  else if (count < 0) { //Buffer full error
58  mPktHandler.sendPkt(mSocket, CMD_BUFFER_FULL, 0, 0, Rtos::convertMsToTick(5000));
59  break;
60  }
61  }
62  mPktHandler.reset();
63  mSocket.close();
64  }
65 }
66