no allocations anymore; lwip TODO

This commit is contained in:
2023-10-28 00:37:06 +02:00
parent e0527bf91b
commit baa7b8a96d
21 changed files with 40 additions and 478 deletions

View File

@ -1,3 +1,2 @@
add_subdirectory(freeRTOS)
add_subdirectory(ps7_cortexa9_0)
add_subdirectory(objects)
add_subdirectory(ps7_cortexa9_0)

View File

@ -77,23 +77,23 @@
#define configUSE_TICK_HOOK 1
#define configMAX_PRIORITIES ( 7 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 250 ) /* Large in case configUSE_TASK_FPU_SUPPORT is 2 in which case all tasks have an FPU context. */
#define configTOTAL_HEAP_SIZE ( 20 * 1024 * 1024 )
#define configTOTAL_HEAP_SIZE ( 0 )
#define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configUSE_QUEUE_SETS 1
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_STATIC_ALLOCATION 1
#define configSUPPORT_DYNAMIC_ALLOCATION 0
/* Include the query-heap CLI command to query the free heap space. */
#define configINCLUDE_QUERY_HEAP_COMMAND 1
#define configINCLUDE_QUERY_HEAP_COMMAND 0
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
@ -128,11 +128,6 @@ to exclude the API function. */
#define INCLUDE_xTaskGetHandle 1
#define INCLUDE_xSemaphoreGetMutexHolder 1
/* This demo makes use of one or more example stats formatting functions. These
format the raw data provided by the uxTaskGetSystemState() function in to human
readable ASCII form. See the notes in the implementation of vTaskList() within
FreeRTOS/Source/tasks.c for limitations. */
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
/* The private watchdog is used to generate run time stats. */
#include "xscuwdt.h"
@ -184,7 +179,7 @@ Zynq MPU. */
#define configUNIQUE_INTERRUPT_PRIORITIES 32
/* Newlib support*/
#define configUSE_NEWLIB_REENTRANT 1 // Required for thread-safety of newlib sprintf, strtok, etc...
//#define configUSE_NEWLIB_REENTRANT 1 // Required for thread-safety of newlib sprintf, strtok, etc...
#endif /* FREERTOS_CONFIG_H */

View File

@ -11,7 +11,7 @@
/*******************************************************************/
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x2000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x01400000;
/* _HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x01400000; */
_ABORT_STACK_SIZE = DEFINED(_ABORT_STACK_SIZE) ? _ABORT_STACK_SIZE : 1024;
_SUPERVISOR_STACK_SIZE = DEFINED(_SUPERVISOR_STACK_SIZE) ? _SUPERVISOR_STACK_SIZE : 2048;
@ -244,7 +244,7 @@ _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
/* Generate Stack and Heap definitions */
.heap (NOLOAD) : {
/* .heap (NOLOAD) : {
. = ALIGN(16);
_heap = .;
HeapBase = .;
@ -253,6 +253,7 @@ _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
_heap_end = .;
HeapLimit = .;
} > ps7_ddr_0_S_AXI_BASEADDR
*/
.stack (NOLOAD) : {
. = ALIGN(16);

View File

@ -1,3 +0,0 @@
target_sources(
${TARGET_NAME} PRIVATE
ObjectFactory.cpp)

View File

@ -1,66 +0,0 @@
#include "ObjectFactory.h"
#include <fsfw/objectmanager/frameworkObjects.h>
#include <fsfw/storagemanager/PoolManager.h>
#include <fsfw/tmtc/TmManager.h>
#include <mission/controller/PrintController.h>
#include "fsfw/events/EventManager.h"
#include "fsfw/health/HealthTable.h"
#include "fsfw/internalerror/InternalErrorReporter.h"
#include "fsfw/tmtc/UdpTmTcBridge.h"
#include "systemObjects.h"
namespace objects {
enum commonObjects : object_id_t {
/* 0x63 ('C') for core objects */
CCSDS_DISTRIBUTOR = 0x63000000,
PUS_DISTRIBUTOR = 0x63000001,
TM_FUNNEL = 0x63000002,
CFDP_DISTRIBUTOR = 0x63000003,
CFDP_HANDLER = 0x63000004,
PUS_TM_FUNNEL = 0x63000005,
CFDP_TM_FUNNEL = 0x64000006,
};
}
// void Factory::setStaticFrameworkObjectIds() {
// // MonitoringReportContent<float>::timeStamperId = objects::TIME_STAMPER;
// // MonitoringReportContent<double>::timeStamperId = objects::TIME_STAMPER;
// // MonitoringReportContent<uint32_t>::timeStamperId = objects::TIME_STAMPER;
// // MonitoringReportContent<int32_t>::timeStamperId = objects::TIME_STAMPER;
// // MonitoringReportContent<int16_t>::timeStamperId = objects::TIME_STAMPER;
// // MonitoringReportContent<uint16_t>::timeStamperId = objects::TIME_STAMPER;
// // PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_DISTRIBUTOR;
// // PusServiceBase::PACKET_DESTINATION = objects::PUS_TM_FUNNEL;
// // CommandingServiceBase::defaultPacketSource = objects::PUS_DISTRIBUTOR;
// // CommandingServiceBase::defaultPacketDestination = objects::PUS_TM_FUNNEL;
// // VerificationReporter::DEFAULT_RECEIVER = objects::PUS_SERVICE_1_VERIFICATION;
// }
void ObjectFactory::produce(void *args) {
//Factory::setStaticFrameworkObjectIds();
{
LocalPool::LocalPoolConfig poolCfg = {{100, 16}, {50, 32}, {40, 64},
{30, 128}, {20, 1024}, {10, 2048}};
new PoolManager(objects::IPC_STORE, poolCfg);
}
new EventManager(objects::EVENT_MANAGER, 20);
new HealthTable(objects::HEALTH_TABLE);
new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
new TmManager(objects::TM_MANAGER);
new UdpTmTcBridgeNew(130,7777,0,0);
new PrintController(123);
}

View File

@ -1,8 +0,0 @@
#pragma once
#include <cstdint>
namespace ObjectFactory {
void produce(void* args);
} // namespace ObjectFactory

View File

@ -1,4 +0,0 @@
target_sources(
${TARGET_NAME} PRIVATE
ServoCommInterface.cpp
SerialTCPCookie.cpp)

View File

@ -1,8 +0,0 @@
#include "SerialTCPCookie.h"
SerialTCPCookie::SerialTCPCookie(const char* host, uint16_t port, bool flush, size_t bufferSize)
: host(host), port(port), flush(flush), bufferSize(bufferSize), socket(-1) {
buffer = new uint8_t[bufferSize];
}
SerialTCPCookie::~SerialTCPCookie() { delete buffer; }

View File

@ -1,17 +0,0 @@
#pragma once
#include <fsfw/devicehandlers/CookieIF.h>
#include <stddef.h>
class SerialTCPCookie : public CookieIF {
public:
SerialTCPCookie(const char* host, uint16_t port, bool flush, size_t bufferSize);
virtual ~SerialTCPCookie();
const char* const host;
const uint16_t port;
const bool flush;
uint8_t *buffer;
const size_t bufferSize;
int socket;
};

View File

@ -1,138 +0,0 @@
#include "ServoCommInterface.h"
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h> // POSIX.1-2001 does not require the inclusion of <sys/types.h>, and this header file is not required on Linux. However, some historical (BSD) implementations required this header file, and portable applications are probably wise to include it.
#include <unistd.h>
#include <utility>
#include "SerialTCPCookie.h"
ServoCommInterface::ServoCommInterface(object_id_t setObjectId) : SystemObject(setObjectId) {}
ReturnValue_t ServoCommInterface::initializeInterface(CookieIF *cookie) {
SerialTCPCookie *tcpCookie = dynamic_cast<SerialTCPCookie *>(cookie);
if (tcpCookie != nullptr) {
return initializeInterface(tcpCookie);
}
return DeviceCommunicationIF::INVALID_COOKIE_TYPE;
}
ReturnValue_t ServoCommInterface::sendMessage(CookieIF *cookie, const uint8_t *sendData,
size_t sendLen) {
SerialTCPCookie *tcpCookie = dynamic_cast<SerialTCPCookie *>(cookie);
if (tcpCookie != nullptr) {
return sendMessage(tcpCookie, sendData, sendLen);
}
return DeviceCommunicationIF::INVALID_COOKIE_TYPE;
}
ReturnValue_t ServoCommInterface::sendMessage(SerialTCPCookie *cookie, const uint8_t *sendData,
size_t sendLen) {
if (cookie->socket == -1) {
return returnvalue::FAILED;
}
ssize_t result = send(cookie->socket, sendData, sendLen, 0);
if (result < 0){
return returnvalue::FAILED;
}
if (std::cmp_not_equal(result, sendLen)) {
return returnvalue::FAILED;
}
return returnvalue::OK;
}
ReturnValue_t ServoCommInterface::getSendSuccess(CookieIF *cookie) { return returnvalue::OK; }
ReturnValue_t ServoCommInterface::requestReceiveMessage(CookieIF *cookie, size_t requestLen) {
return returnvalue::OK;
}
ReturnValue_t ServoCommInterface::readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
size_t *size) {
SerialTCPCookie *tcpCookie = dynamic_cast<SerialTCPCookie *>(cookie);
if (tcpCookie != nullptr) {
return readReceivedMessage(tcpCookie, buffer, size);
}
return DeviceCommunicationIF::INVALID_COOKIE_TYPE;
}
ReturnValue_t ServoCommInterface::readReceivedMessage(SerialTCPCookie *cookie, uint8_t **buffer,
size_t *size) {
if (cookie->socket == -1) {
return returnvalue::FAILED;
}
ssize_t result = recv(cookie->socket, cookie->buffer, cookie->bufferSize, 0);
if (result <= -1) {
*size = 0;
if (errno == EAGAIN or errno == EWOULDBLOCK) {
//no data
return returnvalue::OK;
}
// TODO wrap errno
return returnvalue::FAILED;
}
if (result == 0) {
// peer shut down
close(cookie->socket);
cookie->socket = -1;
return returnvalue::FAILED; // TODO connection closed
}
*size = result;
*buffer = cookie->buffer;
if (std::cmp_greater_equal(result, cookie->bufferSize) and cookie->flush) {
// we do not know if there is more data in the socket, so we read until we get no more
uint8_t ignore[10];
while (recv(cookie->socket, ignore, sizeof(ignore), 0) > 0) {
}
//ignore any fault here as previous read was ok. next call will catch it
}
return returnvalue::OK;
}
ReturnValue_t ServoCommInterface::initializeInterface(SerialTCPCookie *cookie) {
cookie->socket = socket(AF_INET6, SOCK_STREAM, 0);
if (cookie->socket == -1) {
return returnvalue::FAILED;
}
sockaddr_in6 serverAddr;
serverAddr.sin6_family = AF_INET6;
serverAddr.sin6_port = htons(cookie->port);
int retval =inet_pton(AF_INET6, cookie->host, &serverAddr.sin6_addr);
if (retval == 0) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "IpCommInterface::initializeInterface: Invalid IP!" << std::endl;
#endif
return returnvalue::FAILED;
}
retval = connect(cookie->socket, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (retval == -1) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "IpCommInterface::initializeInterface: connection failed with " << errno
<< std::endl;
#endif
return returnvalue::FAILED;
}
fcntl(cookie->socket, F_SETFL, O_NONBLOCK);
return returnvalue::OK;
}

View File

@ -1,28 +0,0 @@
#pragma once
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
#include <fsfw/objectmanager/SystemObject.h>
#include "SerialTCPCookie.h"
class ServoCommInterface : public DeviceCommunicationIF, public SystemObject {
public:
ServoCommInterface(object_id_t setObjectId);
virtual ~ServoCommInterface() {}
ReturnValue_t initializeInterface(CookieIF *cookie) override;
ReturnValue_t sendMessage(CookieIF *cookie, const uint8_t *sendData, size_t sendLen) override;
ReturnValue_t getSendSuccess(CookieIF *cookie) override;
ReturnValue_t requestReceiveMessage(CookieIF *cookie, size_t requestLen) override;
ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **buffer, size_t *size) override;
private:
ReturnValue_t initializeInterface(SerialTCPCookie *cookie);
ReturnValue_t sendMessage(SerialTCPCookie *cookie, const uint8_t *sendData, size_t sendLen);
ReturnValue_t readReceivedMessage(SerialTCPCookie *cookie, uint8_t **buffer, size_t *size);
};

View File

@ -1,13 +0,0 @@
#pragma once
#include <fsfw/introspection/ClasslessEnum.h>
FSFW_CLASSLESS_ENUM(SystemObjects, uint32_t, ((SERVO_FRONT_LEFT, "Servo front left"))
((SERVO_FRONT_RIGHT, "Servo front right"))
((SERVO_BACK_LEFT, "Servo back left"))
((SERVO_BACK_RIGHT,"Servo back right"))
((MOTOR_AXLE_LEFT, "Motors left axle"))
((MOTOR_AXLE_RIGHT, "Motors right axle"))
((MOTOR_AXLE_BACK, "Motors back axle"))
((STEERING_CONTROLLER, "Steering Controller"))
((COMM_IF, 123, "CommIF")))

View File

@ -6,7 +6,7 @@ target_sources(${TARGET_NAME} PUBLIC
src/asm_vectors.S
src/open.c
src/xil_exception.c
src/sbrk.c
#src/sbrk.c
src/xl2cc_counter.c
src/xil_cache.c
src/xil_spinlock.c
@ -48,5 +48,5 @@ target_sources(${TARGET_NAME} PUBLIC
src/outbyte.c
src/unlink.c
src/abort.c
src/_sbrk.c
#src/_sbrk.c
)