Skip to main content
Basavanagouda1
Associate II
February 21, 2020
Solved

.bss section data corrupted

  • February 21, 2020
  • 2 replies
  • 2210 views

Hi All,

We using SPC560P development board in our project. We saw board is halt program execution and checked .bss variable values corrupted. 

Could you please help me to understand this issue. Sharing my map file in attachment. 

EPWMD7 values are corrupted. 

Thanks,

Basava.

    This topic has been closed for replies.
    Best answer by Tesla DeLorean

    Check memory allocator, and if heap/stack are colliding.

    Check startup code.

    Instrument code to monitor the stack and heap. Walk the heap, check for fragmentation, structure corruption, double releases, leaks, etc.

    Check _sbrk() code.

    2 replies

    Tesla DeLorean
    Tesla DeLoreanBest answer
    Guru
    February 21, 2020

    Check memory allocator, and if heap/stack are colliding.

    Check startup code.

    Instrument code to monitor the stack and heap. Walk the heap, check for fragmentation, structure corruption, double releases, leaks, etc.

    Check _sbrk() code.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    Erwan YVIN
    ST Employee
    February 26, 2020

    Hello ,

    yes , check _sbrk code

    please check the PC,LR and R14 with the debugger

    Best regards

    Erwan

    Basavanagouda1
    Associate II
    February 26, 2020

    Hi Erwan , Clive

    I tried to find out the bug root cause and found the below code is causing that issue.

    I tried to read ADC channels value in group using DMA I'm calling below function to do that. Please let me know is there any setting is missed here.

    suwAdc0Grp1SampleBuff is a global buffer. ADC group is created with 6 channel and each channel will be 2bytes value.

    So, I have created this buffer with 7 element array (7x2 bytes) and I choose Linear buffer option in the SPC5 studio.

    Is my DMA configuration and buffer selection is correct?

    typedef uint16_t adcsample_t;

    adcsample_t suwAdc0Grp1SampleBuff[7];

    adc_lld_start_conversion(&ADCD1, &adc0_group_adc0_grp1, &suwAdc0Grp1SampleBuff[0], 1);

    void adc_lld_setup_scan_conversion(ADCDriver *adcp, const ADCConversionGroup *grpp, adcsample_t *samples, size_t depth) {

    #if SPC5_ADC_DMA_MODE == SPC5_ADC_DMA_ON

     vuint8_t *src;

     adcp->samples = samples;

     adcp->depth  = depth;

     adcp->grpp   = grpp;

     src = ((vuint8_t *)&adcp->adc_tagp->CDR[adcp->grpp->init_channel].R) + 2;

     /* Setting up DMA TCD parameters.*/

     edmaChannelSetup(adcp->adc_dma_channel,                  /* channel.         */

              src,                           /* src.     */

              adcp->samples,                      /* dst.           */

              0,                            /* soff, advance by four.  */

              2,                            /* doff, advance by two.  */

              1,                            /* ssize, 16 bits transfers.*/

              1,                            /* dsize, 16 bits transfers.*/

      2,                            /* nbytes */

              (uint32_t)adcp->depth,                  /* iter.          */

              CPL2((uint32_t)adcp->grpp->num_channels * 4U),      /* slast.          */

              (CPL2((uint32_t)adcp->grpp->num_channels * (uint32_t)adcp->depth * sizeof(adcsample_t))), /* dlast.          */

              EDMA_TCD_MODE_DREQ | EDMA_TCD_MODE_INT_END);   /* mode.          */

     /* Active DMA.*/

     adcp->adc_tagp->DMAE.R = ADC_DMAE_DMAEN;

     /* initialize registers for dma cases */

     adc_initialize_registers_dma(adcp);

    #else /* SPC5_ADC_DMA_MODE == SPC5_ADC_DMA_OFF */

     adcp->samples = samples;

     adcp->depth  = depth;

     adcp->grpp   = grpp;

     /* initialize rx_ptr and rx_cnt */

     adcp->rx_ptr  = adcp->samples;

     adcp->rx_cnt  = adcp->depth * adcp->grpp->num_channels;

     /* initialize registers for non-dma cases */

     adc_initialize_registers_nondma(adcp);

    #endif /* SPC5_ADC_DMA_MODE == SPC5_ADC_DMA_OFF */

    #if SPC5_ADC_DMA_MODE == SPC5_ADC_DMA_ON

     /* Starting DMA channels.*/

     edmaChannelStart(adcp->adc_dma_channel);

    #endif /* SPC5_ADC_DMA_MODE */

     /* Starts conversion.*/

     adcp->adc_tagp->MCR.B.NSTART = 1U;

    }

    Thanks,

    Basava.