Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-22 05:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2016-июл-01 11:29 
Не в сети

Зарегистрирован: 2014-апр-02 18:11
Сообщения: 21
Добрый день!
Использую 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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-авг-04 15:23 
Не в сети

Зарегистрирован: 2015-мар-24 12:50
Сообщения: 5
Выравнивание в CodeMaster вроде как (см. Справку):
Директива
#pragma data_alignment=<N>
сообщает компилятору, что переменная со статическим размещением, объявленная после данной директивы, должна иметь выравнивание N .
N - числовая константа, которая должна быть степенью двойки (2, 4, 8 и т.д.).
Директива не действует, если:
· следующее за ней объявление не является объявлением переменной со статическим размещением (а является объявлением функции, автоматической переменной и т.п.);
· N меньше или равно выравниванию, определенному типом переменной;
· переменная используется в директиве #pragma locate.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB