Skip to content

Commit ece6597

Browse files
authored
Merge pull request CANopenNode#336 from MaJerle/master
Replace malloc/free with CO_ and add macro for complete allocation
2 parents 7cdf746 + 9c146e8 commit ece6597

File tree

1 file changed

+79
-122
lines changed

1 file changed

+79
-122
lines changed

CANopen.c

+79-122
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,29 @@
291291
#ifndef CO_USE_GLOBALS
292292
#include <stdlib.h>
293293

294+
/* Default allocation strategy ************************************************/
295+
#if !defined(CO_alloc) || !defined(CO_free)
296+
#if defined(CO_alloc)
297+
#warning CO_alloc is defined but CO_free is not. using default values instead
298+
#undef CO_alloc
299+
#endif
300+
#if defined(CO_free)
301+
#warning CO_free is defined but CO_alloc is not. using default values instead
302+
#undef CO_free
303+
#endif
304+
305+
/*
306+
* Allocate memory for number of elements, each of specific size
307+
* Allocated memory must be reset to all zeros
308+
*/
309+
#define CO_alloc(num, size) calloc((num), (size))
310+
#define CO_free(ptr) free((ptr))
311+
312+
#endif
313+
314+
/* Define macros for allocation */
315+
#define CO_alloc_break_on_fail(var, num, size) if (((var) = CO_alloc((num), (size))) != NULL) { mem += (size) * (num); } else { break; }
316+
294317
#ifdef CO_MULTIPLE_OD
295318
#define ON_MULTI_OD(sentence) sentence
296319
#else
@@ -331,10 +354,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
331354
#endif
332355

333356
/* CANopen object */
334-
void *p = calloc(1, sizeof(CO_t));
335-
if (p == NULL) break;
336-
else co = (CO_t *)p;
337-
mem += sizeof(CO_t);
357+
CO_alloc_break_on_fail(co, 1, sizeof(*co));
338358

339359
#ifdef CO_MULTIPLE_OD
340360
co->config = config;
@@ -345,10 +365,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
345365
ON_MULTI_OD(uint8_t TX_CNT_NMT_MST = 0);
346366
ON_MULTI_OD(uint8_t TX_CNT_HB_PROD = 0);
347367
if (CO_GET_CNT(NMT) == 1) {
348-
p = calloc(1, sizeof(CO_NMT_t));
349-
if (p == NULL) break;
350-
else co->NMT = (CO_NMT_t *)p;
351-
mem += sizeof(CO_NMT_t);
368+
CO_alloc_break_on_fail(co->NMT, CO_GET_CNT(NMT), sizeof(*co->NMT));
352369
ON_MULTI_OD(RX_CNT_NMT_SLV = 1);
353370
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER
354371
ON_MULTI_OD(TX_CNT_NMT_MST = 1);
@@ -360,14 +377,8 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
360377
ON_MULTI_OD(uint8_t RX_CNT_HB_CONS = 0);
361378
if (CO_GET_CNT(HB_CONS) == 1) {
362379
uint8_t countOfMonitoredNodes = CO_GET_CNT(ARR_1016);
363-
p = calloc(1, sizeof(CO_HBconsumer_t));
364-
if (p == NULL) break;
365-
else co->HBcons = (CO_HBconsumer_t *)p;
366-
mem += sizeof(CO_HBconsumer_t);
367-
p = calloc(countOfMonitoredNodes, sizeof(CO_HBconsNode_t));
368-
if (p == NULL) break;
369-
else co->HBconsMonitoredNodes = (CO_HBconsNode_t *)p;
370-
mem += countOfMonitoredNodes * sizeof(CO_HBconsNode_t);
380+
CO_alloc_break_on_fail(co->HBcons, CO_GET_CNT(HB_CONS), sizeof(*co->HBcons));
381+
CO_alloc_break_on_fail(co->HBconsMonitoredNodes, countOfMonitoredNodes, sizeof(*co->HBconsMonitoredNodes));
371382
ON_MULTI_OD(RX_CNT_HB_CONS = countOfMonitoredNodes);
372383
}
373384
#endif
@@ -376,10 +387,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
376387
ON_MULTI_OD(uint8_t RX_CNT_EM_CONS = 0);
377388
ON_MULTI_OD(uint8_t TX_CNT_EM_PROD = 0);
378389
if (CO_GET_CNT(EM) == 1) {
379-
p = calloc(1, sizeof(CO_EM_t));
380-
if (p == NULL) break;
381-
else co->em = (CO_EM_t *)p;
382-
mem += sizeof(CO_EM_t);
390+
CO_alloc_break_on_fail(co->em, CO_GET_CNT(EM), sizeof(*co->em));
383391
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
384392
ON_MULTI_OD(RX_CNT_EM_CONS = 1);
385393
#endif
@@ -389,13 +397,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
389397
#if (CO_CONFIG_EM) & (CO_CONFIG_EM_PRODUCER | CO_CONFIG_EM_HISTORY)
390398
uint8_t fifoSize = CO_GET_CNT(ARR_1003) + 1;
391399
if (fifoSize >= 2) {
392-
p = calloc(fifoSize, sizeof(CO_EM_fifo_t));
393-
if (p == NULL) break;
394-
else co->em_fifo = (CO_EM_fifo_t *)p;
395-
mem += fifoSize * sizeof(CO_EM_fifo_t);
396-
}
397-
else {
398-
co->em_fifo = NULL;
400+
CO_alloc_break_on_fail(co->em_fifo, fifoSize, sizeof(*co->em_fifo));
399401
}
400402
#endif
401403
}
@@ -404,10 +406,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
404406
ON_MULTI_OD(uint8_t RX_CNT_SDO_SRV = 0);
405407
ON_MULTI_OD(uint8_t TX_CNT_SDO_SRV = 0);
406408
if (CO_GET_CNT(SDO_SRV) > 0) {
407-
p = calloc(CO_GET_CNT(SDO_SRV), sizeof(CO_SDOserver_t));
408-
if (p == NULL) break;
409-
else co->SDOserver = (CO_SDOserver_t *)p;
410-
mem += sizeof(CO_SDOserver_t) * CO_GET_CNT(SDO_SRV);
409+
CO_alloc_break_on_fail(co->SDOserver, CO_GET_CNT(SDO_SRV), sizeof(*co->SDOserver));
411410
ON_MULTI_OD(RX_CNT_SDO_SRV = config->CNT_SDO_SRV);
412411
ON_MULTI_OD(TX_CNT_SDO_SRV = config->CNT_SDO_SRV);
413412
}
@@ -416,10 +415,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
416415
ON_MULTI_OD(uint8_t RX_CNT_SDO_CLI = 0);
417416
ON_MULTI_OD(uint8_t TX_CNT_SDO_CLI = 0);
418417
if (CO_GET_CNT(SDO_CLI) > 0) {
419-
p = calloc(CO_GET_CNT(SDO_CLI), sizeof(CO_SDOclient_t));
420-
if (p == NULL) break;
421-
else co->SDOclient = (CO_SDOclient_t *)p;
422-
mem += sizeof(CO_SDOclient_t) * CO_GET_CNT(SDO_CLI);
418+
CO_alloc_break_on_fail(co->SDOclient, CO_GET_CNT(SDO_CLI), sizeof(*co->SDOclient));
423419
ON_MULTI_OD(RX_CNT_SDO_CLI = config->CNT_SDO_CLI);
424420
ON_MULTI_OD(TX_CNT_SDO_CLI = config->CNT_SDO_CLI);
425421
}
@@ -429,10 +425,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
429425
ON_MULTI_OD(uint8_t RX_CNT_TIME = 0);
430426
ON_MULTI_OD(uint8_t TX_CNT_TIME = 0);
431427
if (CO_GET_CNT(TIME) == 1) {
432-
p = calloc(1, sizeof(CO_TIME_t));
433-
if (p == NULL) break;
434-
else co->TIME = (CO_TIME_t *)p;
435-
mem += sizeof(CO_TIME_t);
428+
CO_alloc_break_on_fail(co->TIME, CO_GET_CNT(TIME), sizeof(*co->TIME));
436429
ON_MULTI_OD(RX_CNT_TIME = 1);
437430
#if (CO_CONFIG_TIME) & CO_CONFIG_TIME_PRODUCER
438431
ON_MULTI_OD(TX_CNT_TIME = 1);
@@ -444,10 +437,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
444437
ON_MULTI_OD(uint8_t RX_CNT_SYNC = 0);
445438
ON_MULTI_OD(uint8_t TX_CNT_SYNC = 0);
446439
if (CO_GET_CNT(SYNC) == 1) {
447-
p = calloc(1, sizeof(CO_SYNC_t));
448-
if (p == NULL) break;
449-
else co->SYNC = (CO_SYNC_t *)p;
450-
mem += sizeof(CO_SYNC_t);
440+
CO_alloc_break_on_fail(co->SYNC, CO_GET_CNT(SYNC), sizeof(*co->SYNC));
451441
ON_MULTI_OD(RX_CNT_SYNC = 1);
452442
#if (CO_CONFIG_SYNC) & CO_CONFIG_SYNC_PRODUCER
453443
ON_MULTI_OD(TX_CNT_SYNC = 1);
@@ -458,42 +448,30 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
458448
#if (CO_CONFIG_PDO) & CO_CONFIG_RPDO_ENABLE
459449
ON_MULTI_OD(uint16_t RX_CNT_RPDO = 0);
460450
if (CO_GET_CNT(RPDO) > 0) {
461-
p = calloc(CO_GET_CNT(RPDO), sizeof(CO_RPDO_t));
462-
if (p == NULL) break;
463-
else co->RPDO = (CO_RPDO_t *)p;
464-
mem += sizeof(CO_RPDO_t) * CO_GET_CNT(RPDO);
451+
CO_alloc_break_on_fail(co->RPDO, CO_GET_CNT(RPDO), sizeof(*co->RPDO));
465452
ON_MULTI_OD(RX_CNT_RPDO = config->CNT_RPDO);
466453
}
467454
#endif
468455

469456
#if (CO_CONFIG_PDO) & CO_CONFIG_TPDO_ENABLE
470457
ON_MULTI_OD(uint16_t TX_CNT_TPDO = 0);
471458
if (CO_GET_CNT(TPDO) > 0) {
472-
p = calloc(CO_GET_CNT(TPDO), sizeof(CO_TPDO_t));
473-
if (p == NULL) break;
474-
else co->TPDO = (CO_TPDO_t *)p;
475-
mem += sizeof(CO_TPDO_t) * CO_GET_CNT(TPDO);
459+
CO_alloc_break_on_fail(co->TPDO, CO_GET_CNT(TPDO), sizeof(*co->TPDO));
476460
ON_MULTI_OD(TX_CNT_TPDO = config->CNT_TPDO);
477461
}
478462
#endif
479463

480464
#if (CO_CONFIG_LEDS) & CO_CONFIG_LEDS_ENABLE
481465
if (CO_GET_CNT(LEDS) == 1) {
482-
p = calloc(1, sizeof(CO_LEDs_t));
483-
if (p == NULL) break;
484-
else co->LEDs = (CO_LEDs_t *)p;
485-
mem += sizeof(CO_LEDs_t);
466+
CO_alloc_break_on_fail(co->LEDs, CO_GET_CNT(LEDS), sizeof(*co->LEDs));
486467
}
487468
#endif
488469

489470
#if (CO_CONFIG_GFC) & CO_CONFIG_GFC_ENABLE
490471
ON_MULTI_OD(uint8_t RX_CNT_GFC = 0);
491472
ON_MULTI_OD(uint8_t TX_CNT_GFC = 0);
492473
if (CO_GET_CNT(GFC) == 1) {
493-
p = calloc(1, sizeof(CO_GFC_t));
494-
if (p == NULL) break;
495-
else co->GFC = (CO_GFC_t *)p;
496-
mem += sizeof(CO_GFC_t);
474+
CO_alloc_break_on_fail(co->GFC, CO_GET_CNT(GFC), sizeof(*co->GFC));
497475
ON_MULTI_OD(RX_CNT_GFC = 1);
498476
ON_MULTI_OD(TX_CNT_GFC = 1);
499477
}
@@ -503,14 +481,8 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
503481
ON_MULTI_OD(uint8_t RX_CNT_SRDO = 0);
504482
ON_MULTI_OD(uint8_t TX_CNT_SRDO = 0);
505483
if (CO_GET_CNT(SRDO) > 0) {
506-
p = calloc(1, sizeof(CO_SRDOGuard_t));
507-
if (p == NULL) break;
508-
else co->SRDOGuard = (CO_SRDOGuard_t *)p;
509-
mem += sizeof(CO_SRDOGuard_t);
510-
p = calloc(CO_GET_CNT(SRDO), sizeof(CO_SRDO_t));
511-
if (p == NULL) break;
512-
else co->SRDO = (CO_SRDO_t *)p;
513-
mem += sizeof(CO_SRDO_t) * CO_GET_CNT(SRDO);
484+
CO_alloc_break_on_fail(co->SRDOGuard, 1, sizeof(*co->SRDOGuard));
485+
CO_alloc_break_on_fail(co->SRDO, CO_GET_CNT(SRDO), sizeof(*co->SRDO));
514486
ON_MULTI_OD(RX_CNT_SRDO = config->CNT_SRDO * 2);
515487
ON_MULTI_OD(TX_CNT_SRDO = config->CNT_SRDO * 2);
516488
}
@@ -520,10 +492,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
520492
ON_MULTI_OD(uint8_t RX_CNT_LSS_SLV = 0);
521493
ON_MULTI_OD(uint8_t TX_CNT_LSS_SLV = 0);
522494
if (CO_GET_CNT(LSS_SLV) == 1) {
523-
p = calloc(1, sizeof(CO_LSSslave_t));
524-
if (p == NULL) break;
525-
else co->LSSslave = (CO_LSSslave_t *)p;
526-
mem += sizeof(CO_LSSslave_t);
495+
CO_alloc_break_on_fail(co->LSSslave, CO_GET_CNT(LSS_SLV), sizeof(*co->LSSslave));
527496
ON_MULTI_OD(RX_CNT_LSS_SLV = 1);
528497
ON_MULTI_OD(TX_CNT_LSS_SLV = 1);
529498
}
@@ -533,30 +502,21 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
533502
ON_MULTI_OD(uint8_t RX_CNT_LSS_MST = 0);
534503
ON_MULTI_OD(uint8_t TX_CNT_LSS_MST = 0);
535504
if (CO_GET_CNT(LSS_MST) == 1) {
536-
p = calloc(1, sizeof(CO_LSSmaster_t));
537-
if (p == NULL) break;
538-
else co->LSSmaster = (CO_LSSmaster_t *)p;
539-
mem += sizeof(CO_LSSmaster_t);
505+
CO_alloc_break_on_fail(co->LSSmaster, CO_GET_CNT(LSS_MST), sizeof(*co->LSSmaster));
540506
ON_MULTI_OD(RX_CNT_LSS_MST = 1);
541507
ON_MULTI_OD(TX_CNT_LSS_MST = 1);
542508
}
543509
#endif
544510

545511
#if (CO_CONFIG_GTW) & CO_CONFIG_GTW_ASCII
546512
if (CO_GET_CNT(GTWA) == 1) {
547-
p = calloc(1, sizeof(CO_GTWA_t));
548-
if (p == NULL) break;
549-
else co->gtwa = (CO_GTWA_t *)p;
550-
mem += sizeof(CO_GTWA_t);
513+
CO_alloc_break_on_fail(co->gtwa, CO_GET_CNT(GTWA), sizeof(*co->gtwa));
551514
}
552515
#endif
553516

554517
#if (CO_CONFIG_TRACE) & CO_CONFIG_TRACE_ENABLE
555518
if (CO_GET_CNT(TRACE) > 0) {
556-
p = calloc(CO_GET_CNT(TRACE), sizeof(CO_trace_t));
557-
if (p == NULL) break;
558-
else co->trace = (CO_trace_t *)p;
559-
mem += sizeof(CO_trace_t) * CO_GET_CNT(TRACE);
519+
CO_alloc_break_on_fail(co->trace, CO_GET_CNT(TRACE), sizeof(*co->trace));
560520
}
561521
#endif
562522

@@ -630,28 +590,25 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
630590
#endif /* #ifdef CO_MULTIPLE_OD */
631591

632592
/* CANmodule */
633-
p = calloc(1, sizeof(CO_CANmodule_t));
634-
if (p == NULL) break;
635-
else co->CANmodule = (CO_CANmodule_t *)p;
636-
mem += sizeof(CO_CANmodule_t);
637-
p = calloc(CO_GET_CO(CNT_ALL_RX_MSGS), sizeof(CO_CANrx_t));
638-
if (p == NULL) break;
639-
else co->CANrx = (CO_CANrx_t *)p;
640-
mem += sizeof(CO_CANrx_t) * CO_GET_CO(CNT_ALL_RX_MSGS);
641-
p = calloc(CO_GET_CO(CNT_ALL_TX_MSGS), sizeof(CO_CANtx_t));
642-
if (p == NULL) break;
643-
else co->CANtx = (CO_CANtx_t *)p;
644-
mem += sizeof(CO_CANtx_t) * CO_GET_CO(CNT_ALL_TX_MSGS);
593+
CO_alloc_break_on_fail(co->CANmodule, 1, sizeof(*co->CANmodule));
594+
595+
/* CAN RX blocks */
596+
CO_alloc_break_on_fail(co->CANrx, CO_GET_CO(CNT_ALL_RX_MSGS), sizeof(*co->CANrx));
597+
598+
/* CAN TX blocks */
599+
CO_alloc_break_on_fail(co->CANtx, CO_GET_CO(CNT_ALL_TX_MSGS), sizeof(*co->CANtx));
645600

646601
/* finish successfully, set other parameters */
647602
co->nodeIdUnconfigured = true;
648603
coFinal = co;
649-
} while(false);
650-
651-
if (coFinal == NULL) CO_delete(co);
652-
653-
if (heapMemoryUsed != NULL) *heapMemoryUsed = mem;
604+
} while (false);
654605

606+
if (coFinal == NULL) {
607+
CO_delete(co);
608+
}
609+
if (heapMemoryUsed != NULL) {
610+
*heapMemoryUsed = mem;
611+
}
655612
return coFinal;
656613
}
657614

@@ -663,78 +620,78 @@ void CO_delete(CO_t *co) {
663620
CO_CANmodule_disable(co->CANmodule);
664621

665622
/* CANmodule */
666-
free(co->CANtx);
667-
free(co->CANrx);
668-
free(co->CANmodule);
623+
CO_free(co->CANtx);
624+
CO_free(co->CANrx);
625+
CO_free(co->CANmodule);
669626

670627
#if (CO_CONFIG_TRACE) & CO_CONFIG_TRACE_ENABLE
671-
free(co->trace);
628+
CO_free(co->trace);
672629
#endif
673630

674631
#if (CO_CONFIG_GTW) & CO_CONFIG_GTW_ASCII
675-
free(co->gtwa);
632+
CO_free(co->gtwa);
676633
#endif
677634

678635
#if (CO_CONFIG_LSS) & CO_CONFIG_LSS_MASTER
679-
free(co->LSSmaster);
636+
CO_free(co->LSSmaster);
680637
#endif
681638

682639
#if (CO_CONFIG_LSS) & CO_CONFIG_LSS_SLAVE
683-
free(co->LSSslave);
640+
CO_free(co->LSSslave);
684641
#endif
685642

686643
#if (CO_CONFIG_SRDO) & CO_CONFIG_SRDO_ENABLE
687-
free(co->SRDO);
688-
free(co->SRDOGuard);
644+
CO_free(co->SRDO);
645+
CO_free(co->SRDOGuard);
689646
#endif
690647

691648
#if (CO_CONFIG_GFC) & CO_CONFIG_GFC_ENABLE
692-
free(co->GFC);
649+
CO_free(co->GFC);
693650
#endif
694651

695652
#if (CO_CONFIG_LEDS) & CO_CONFIG_LEDS_ENABLE
696-
free(co->LEDs);
653+
CO_free(co->LEDs);
697654
#endif
698655

699656
#if (CO_CONFIG_PDO) & CO_CONFIG_TPDO_ENABLE
700-
free(co->TPDO);
657+
CO_free(co->TPDO);
701658
#endif
702659

703660
#if (CO_CONFIG_PDO) & CO_CONFIG_RPDO_ENABLE
704-
free(co->RPDO);
661+
CO_free(co->RPDO);
705662
#endif
706663

707664
#if (CO_CONFIG_SYNC) & CO_CONFIG_SYNC_ENABLE
708-
free(co->SYNC);
665+
CO_free(co->SYNC);
709666
#endif
710667

711668
#if (CO_CONFIG_TIME) & CO_CONFIG_TIME_ENABLE
712-
free(co->TIME);
669+
CO_free(co->TIME);
713670
#endif
714671

715672
#if (CO_CONFIG_SDO_CLI) & CO_CONFIG_SDO_CLI_ENABLE
716673
free(co->SDOclient);
717674
#endif
718675

719676
/* SDOserver */
720-
free(co->SDOserver);
677+
CO_free(co->SDOserver);
721678

722679
/* Emergency */
723-
free(co->em);
680+
CO_free(co->em);
724681
#if (CO_CONFIG_EM) & (CO_CONFIG_EM_PRODUCER | CO_CONFIG_EM_HISTORY)
725-
free(co->em_fifo);
682+
CO_free(co->em_fifo);
726683
#endif
727684

728685
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_ENABLE
729-
free(co->HBconsMonitoredNodes);
730-
free(co->HBcons);
686+
CO_free(co->HBconsMonitoredNodes);
687+
CO_free(co->HBcons);
731688
#endif
732689

733690
/* NMT_Heartbeat */
734-
free(co->NMT);
691+
CO_free(co->NMT);
735692

736693
/* CANopen object */
737-
free(co);
694+
CO_free(co);
738695
}
739696
#endif /* #ifndef CO_USE_GLOBALS */
740697

0 commit comments

Comments
 (0)