Добрый день!
Использую COdeMaster 2.40.
При попытке использования примера "Ethernet", который поставляется вместе с библиотеками Миландра, и находится по пути "Library\lib\MDR32F9_1986ВЕ4_2015\Examples\MDR1986VE1T\" столкнулся с тем, что при обращении к массиву, переданному через указатель, попадаю в HardFault.
Падаем конкретно на строке
Код:
*ptr_OutputFrame++ = *ptr_OutputBuffer++;
функции ETH_SendFrame, в файле MDR32F9Qx_eth.c или при любом обращении к *ptr_OutputBuffer в этой же функции, например
Код:
tempVal = ptr_OutputBuffer[i];
Поиском, нашел вот такую тему:
viewtopic.php?f=34&t=2936#p16311При работе в CodeMaster, адрес массива не кратен 4-м.
При этом, в определении массива, на котором все падает, есть такие строки:
Код:
uint8_t TxFrame2[ETH_CTRL_FIELD + ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION") __attribute__((section("EXECUTABLE_MEMORY_SECTION"))) __attribute__ ((aligned (4)));
то есть конкретное указание, на выравнивание в IAR.
Этот пример прекрасно работает в Keil и в IAR, но не работает в CodeMaster.
Вопрос, как указать что мне нужно выравнивать адрес массива по числу, кратным 4-м ?
Еще заметил такую вещь, при использовании конструкции типа:
Код:
*(uint32_t *) &ptr_OutFrame[0] = (((((uint8_t) (RecdFrameMAC[1] >> 8) & 0xFF) << 24)
| (((uint8_t) RecdFrameMAC[1] & 0xFF) << 16)
| (((uint8_t) (RecdFrameMAC[0] >> 8) & 0xFF) << 8)
| ((uint8_t) RecdFrameMAC[0] & 0xFF)));
или типа
Код:
*(uint16_t *)&ptr_OutFrame[ETH_TYPE_OFS] = любое число или массив;
также уходим в HardFault.