On the following code I have a packet of 6 bytes that I write to a buffer. I pass the buffer as read_packet function argument. When optimized, the code doesn't work. I only got noise on the UART and even with the debugger I coudn't see the correct values. After some hours of trial and error I decided to select the level 0 of optimization and it started working.
What is the compiler doing?
while (true)
{
uint32_t received[6];
//received
read_packet(received);
//nrf_gpio_pin_toggle(led1);
//nrf_gpio_pin_toggle(led3);
app_uart_put(received[1]);
//app_uart_put(12);
//printf("The contents of the package is %u\n\r", (unsigned int)received);
}
bool read_packet(uint32_t *buffer)
{
//uint32_t *result = malloc(sizeof(uint32_t)*6);
static uint32_t result[6];
NRF_RADIO->EVENTS_READY = 0U;
// Enable radio and wait for ready
NRF_RADIO->TASKS_RXEN = 1U;
while (NRF_RADIO->EVENTS_READY == 0U)
{
// wait
}
NRF_RADIO->EVENTS_END = 0U;
// Start listening and wait for address received event
NRF_RADIO->TASKS_START = 1U;
// Wait for end of packet or buttons state changed
while (NRF_RADIO->EVENTS_END == 0U)
{
// wait
}
if (NRF_RADIO->CRCSTATUS == 1U)
{
buffer[0] = packet[0];
buffer[1] = packet[1];
buffer[2] = packet[2];
buffer[3] = packet[3];
buffer[4] = packet[4];
buffer[5] = packet[5];
}
NRF_RADIO->EVENTS_DISABLED = 0U;
// Disable radio
NRF_RADIO->TASKS_DISABLE = 1U;
while (NRF_RADIO->EVENTS_DISABLED == 0U)
{
// wait
}
return 1;
}