291
291
#ifndef CO_USE_GLOBALS
292
292
#include <stdlib.h>
293
293
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
+
294
317
#ifdef CO_MULTIPLE_OD
295
318
#define ON_MULTI_OD (sentence ) sentence
296
319
#else
@@ -331,10 +354,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
331
354
#endif
332
355
333
356
/* 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 ));
338
358
339
359
#ifdef CO_MULTIPLE_OD
340
360
co -> config = config ;
@@ -345,10 +365,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
345
365
ON_MULTI_OD (uint8_t TX_CNT_NMT_MST = 0 );
346
366
ON_MULTI_OD (uint8_t TX_CNT_HB_PROD = 0 );
347
367
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 ));
352
369
ON_MULTI_OD (RX_CNT_NMT_SLV = 1 );
353
370
#if (CO_CONFIG_NMT ) & CO_CONFIG_NMT_MASTER
354
371
ON_MULTI_OD (TX_CNT_NMT_MST = 1 );
@@ -360,14 +377,8 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
360
377
ON_MULTI_OD (uint8_t RX_CNT_HB_CONS = 0 );
361
378
if (CO_GET_CNT (HB_CONS ) == 1 ) {
362
379
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 ));
371
382
ON_MULTI_OD (RX_CNT_HB_CONS = countOfMonitoredNodes );
372
383
}
373
384
#endif
@@ -376,10 +387,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
376
387
ON_MULTI_OD (uint8_t RX_CNT_EM_CONS = 0 );
377
388
ON_MULTI_OD (uint8_t TX_CNT_EM_PROD = 0 );
378
389
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 ));
383
391
#if (CO_CONFIG_EM ) & CO_CONFIG_EM_CONSUMER
384
392
ON_MULTI_OD (RX_CNT_EM_CONS = 1 );
385
393
#endif
@@ -389,13 +397,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
389
397
#if (CO_CONFIG_EM ) & (CO_CONFIG_EM_PRODUCER | CO_CONFIG_EM_HISTORY )
390
398
uint8_t fifoSize = CO_GET_CNT (ARR_1003 ) + 1 ;
391
399
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 ));
399
401
}
400
402
#endif
401
403
}
@@ -404,10 +406,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
404
406
ON_MULTI_OD (uint8_t RX_CNT_SDO_SRV = 0 );
405
407
ON_MULTI_OD (uint8_t TX_CNT_SDO_SRV = 0 );
406
408
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 ));
411
410
ON_MULTI_OD (RX_CNT_SDO_SRV = config -> CNT_SDO_SRV );
412
411
ON_MULTI_OD (TX_CNT_SDO_SRV = config -> CNT_SDO_SRV );
413
412
}
@@ -416,10 +415,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
416
415
ON_MULTI_OD (uint8_t RX_CNT_SDO_CLI = 0 );
417
416
ON_MULTI_OD (uint8_t TX_CNT_SDO_CLI = 0 );
418
417
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 ));
423
419
ON_MULTI_OD (RX_CNT_SDO_CLI = config -> CNT_SDO_CLI );
424
420
ON_MULTI_OD (TX_CNT_SDO_CLI = config -> CNT_SDO_CLI );
425
421
}
@@ -429,10 +425,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
429
425
ON_MULTI_OD (uint8_t RX_CNT_TIME = 0 );
430
426
ON_MULTI_OD (uint8_t TX_CNT_TIME = 0 );
431
427
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 ));
436
429
ON_MULTI_OD (RX_CNT_TIME = 1 );
437
430
#if (CO_CONFIG_TIME ) & CO_CONFIG_TIME_PRODUCER
438
431
ON_MULTI_OD (TX_CNT_TIME = 1 );
@@ -444,10 +437,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
444
437
ON_MULTI_OD (uint8_t RX_CNT_SYNC = 0 );
445
438
ON_MULTI_OD (uint8_t TX_CNT_SYNC = 0 );
446
439
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 ));
451
441
ON_MULTI_OD (RX_CNT_SYNC = 1 );
452
442
#if (CO_CONFIG_SYNC ) & CO_CONFIG_SYNC_PRODUCER
453
443
ON_MULTI_OD (TX_CNT_SYNC = 1 );
@@ -458,42 +448,30 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
458
448
#if (CO_CONFIG_PDO ) & CO_CONFIG_RPDO_ENABLE
459
449
ON_MULTI_OD (uint16_t RX_CNT_RPDO = 0 );
460
450
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 ));
465
452
ON_MULTI_OD (RX_CNT_RPDO = config -> CNT_RPDO );
466
453
}
467
454
#endif
468
455
469
456
#if (CO_CONFIG_PDO ) & CO_CONFIG_TPDO_ENABLE
470
457
ON_MULTI_OD (uint16_t TX_CNT_TPDO = 0 );
471
458
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 ));
476
460
ON_MULTI_OD (TX_CNT_TPDO = config -> CNT_TPDO );
477
461
}
478
462
#endif
479
463
480
464
#if (CO_CONFIG_LEDS ) & CO_CONFIG_LEDS_ENABLE
481
465
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 ));
486
467
}
487
468
#endif
488
469
489
470
#if (CO_CONFIG_GFC ) & CO_CONFIG_GFC_ENABLE
490
471
ON_MULTI_OD (uint8_t RX_CNT_GFC = 0 );
491
472
ON_MULTI_OD (uint8_t TX_CNT_GFC = 0 );
492
473
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 ));
497
475
ON_MULTI_OD (RX_CNT_GFC = 1 );
498
476
ON_MULTI_OD (TX_CNT_GFC = 1 );
499
477
}
@@ -503,14 +481,8 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
503
481
ON_MULTI_OD (uint8_t RX_CNT_SRDO = 0 );
504
482
ON_MULTI_OD (uint8_t TX_CNT_SRDO = 0 );
505
483
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 ));
514
486
ON_MULTI_OD (RX_CNT_SRDO = config -> CNT_SRDO * 2 );
515
487
ON_MULTI_OD (TX_CNT_SRDO = config -> CNT_SRDO * 2 );
516
488
}
@@ -520,10 +492,7 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
520
492
ON_MULTI_OD (uint8_t RX_CNT_LSS_SLV = 0 );
521
493
ON_MULTI_OD (uint8_t TX_CNT_LSS_SLV = 0 );
522
494
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 ));
527
496
ON_MULTI_OD (RX_CNT_LSS_SLV = 1 );
528
497
ON_MULTI_OD (TX_CNT_LSS_SLV = 1 );
529
498
}
@@ -533,30 +502,21 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
533
502
ON_MULTI_OD (uint8_t RX_CNT_LSS_MST = 0 );
534
503
ON_MULTI_OD (uint8_t TX_CNT_LSS_MST = 0 );
535
504
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 ));
540
506
ON_MULTI_OD (RX_CNT_LSS_MST = 1 );
541
507
ON_MULTI_OD (TX_CNT_LSS_MST = 1 );
542
508
}
543
509
#endif
544
510
545
511
#if (CO_CONFIG_GTW ) & CO_CONFIG_GTW_ASCII
546
512
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 ));
551
514
}
552
515
#endif
553
516
554
517
#if (CO_CONFIG_TRACE ) & CO_CONFIG_TRACE_ENABLE
555
518
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 ));
560
520
}
561
521
#endif
562
522
@@ -630,28 +590,25 @@ CO_t *CO_new(CO_config_t *config, uint32_t *heapMemoryUsed) {
630
590
#endif /* #ifdef CO_MULTIPLE_OD */
631
591
632
592
/* 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 ));
645
600
646
601
/* finish successfully, set other parameters */
647
602
co -> nodeIdUnconfigured = true;
648
603
coFinal = co ;
649
- } while (false);
650
-
651
- if (coFinal == NULL ) CO_delete (co );
652
-
653
- if (heapMemoryUsed != NULL ) * heapMemoryUsed = mem ;
604
+ } while (false);
654
605
606
+ if (coFinal == NULL ) {
607
+ CO_delete (co );
608
+ }
609
+ if (heapMemoryUsed != NULL ) {
610
+ * heapMemoryUsed = mem ;
611
+ }
655
612
return coFinal ;
656
613
}
657
614
@@ -663,78 +620,78 @@ void CO_delete(CO_t *co) {
663
620
CO_CANmodule_disable (co -> CANmodule );
664
621
665
622
/* 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 );
669
626
670
627
#if (CO_CONFIG_TRACE ) & CO_CONFIG_TRACE_ENABLE
671
- free (co -> trace );
628
+ CO_free (co -> trace );
672
629
#endif
673
630
674
631
#if (CO_CONFIG_GTW ) & CO_CONFIG_GTW_ASCII
675
- free (co -> gtwa );
632
+ CO_free (co -> gtwa );
676
633
#endif
677
634
678
635
#if (CO_CONFIG_LSS ) & CO_CONFIG_LSS_MASTER
679
- free (co -> LSSmaster );
636
+ CO_free (co -> LSSmaster );
680
637
#endif
681
638
682
639
#if (CO_CONFIG_LSS ) & CO_CONFIG_LSS_SLAVE
683
- free (co -> LSSslave );
640
+ CO_free (co -> LSSslave );
684
641
#endif
685
642
686
643
#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 );
689
646
#endif
690
647
691
648
#if (CO_CONFIG_GFC ) & CO_CONFIG_GFC_ENABLE
692
- free (co -> GFC );
649
+ CO_free (co -> GFC );
693
650
#endif
694
651
695
652
#if (CO_CONFIG_LEDS ) & CO_CONFIG_LEDS_ENABLE
696
- free (co -> LEDs );
653
+ CO_free (co -> LEDs );
697
654
#endif
698
655
699
656
#if (CO_CONFIG_PDO ) & CO_CONFIG_TPDO_ENABLE
700
- free (co -> TPDO );
657
+ CO_free (co -> TPDO );
701
658
#endif
702
659
703
660
#if (CO_CONFIG_PDO ) & CO_CONFIG_RPDO_ENABLE
704
- free (co -> RPDO );
661
+ CO_free (co -> RPDO );
705
662
#endif
706
663
707
664
#if (CO_CONFIG_SYNC ) & CO_CONFIG_SYNC_ENABLE
708
- free (co -> SYNC );
665
+ CO_free (co -> SYNC );
709
666
#endif
710
667
711
668
#if (CO_CONFIG_TIME ) & CO_CONFIG_TIME_ENABLE
712
- free (co -> TIME );
669
+ CO_free (co -> TIME );
713
670
#endif
714
671
715
672
#if (CO_CONFIG_SDO_CLI ) & CO_CONFIG_SDO_CLI_ENABLE
716
673
free (co -> SDOclient );
717
674
#endif
718
675
719
676
/* SDOserver */
720
- free (co -> SDOserver );
677
+ CO_free (co -> SDOserver );
721
678
722
679
/* Emergency */
723
- free (co -> em );
680
+ CO_free (co -> em );
724
681
#if (CO_CONFIG_EM ) & (CO_CONFIG_EM_PRODUCER | CO_CONFIG_EM_HISTORY )
725
- free (co -> em_fifo );
682
+ CO_free (co -> em_fifo );
726
683
#endif
727
684
728
685
#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 );
731
688
#endif
732
689
733
690
/* NMT_Heartbeat */
734
- free (co -> NMT );
691
+ CO_free (co -> NMT );
735
692
736
693
/* CANopen object */
737
- free (co );
694
+ CO_free (co );
738
695
}
739
696
#endif /* #ifndef CO_USE_GLOBALS */
740
697
0 commit comments