реклама на сайте
подробности

 
 
> Keil и Cortex M4, Складывает данные по невыровненым адресам
prottoss
сообщение Feb 9 2016, 18:53
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Доброго времени суток.

Сам я Keil не использую, но была необходимость сделать проект именно на этом компиляторе. Проект собран под два проца - первый STM32F107 (Cortex M3) второй под STM32L475 (Cortex M4). Проект связан с передачей данных по USB с использованием встроенного в МК USB OTG модуля, по этому в проекте есть объявленные в виде структур данные всевозможных USB дескрипторов. Так вот, при работе программы под М3 глюков не наблюдалось и он был перенесен на М4. Тут начались глюки. Пр передаче первой же послыки (т.е. еще на этапе нумерации) по USB проц падает в HardFault. Копание показало, что Keil, при использованиии первого МК (М3) размещает все данные по выровненным на 32-бит адресам. При компилировании проекта под М4 он размещает данные с выравниванием в 16-бит... Как так то? или я чего то не понимаю/не знаю?

В IAR проект под М3 проверял, под М4 с целевым процом (STM32L475) нет, но адреса расположены с правильным выравниванием. С другим МК - STM32F407 проект работает нормально.

Четогдето в Keil подкрутить нужно? Или мне? cranky.gif


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Feb 9 2016, 20:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Без примера некорректного размещения дать какой-либо комментарий затруднительно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 10 2016, 01:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Во вложении файлы, в которых размещены дескрипторы. Ничего особенного - объявлены структуры дескрипторов устройств.
Вот функция, которая записывает данные в FIFO IN OTG
Код
/*******************************************************************************
Put data to EP IN FIFO over SW cycle
*******************************************************************************/
static void FIFO_IN_Put(UINT32 volatile *in_fifo, UINT32 const *p_src, INT src_len)
{
    INT w_count = (src_len + 3) >> 2;
    while(w_count--)
        *in_fifo = *p_src++;
}

Программа падает в хардфолт в ней сразу после обращения к данным в указателе p_src сразу же при первом вызове функции. При этом в p_src находится адрес дескриптора устройства. См. картинку.


Ниже вырезка из MAP-фала для STM32F107. Видно, что все данные, которым положено быть выровненными - выровнены:
Код
g_PUSBD_DeviceDescriptor                 0x08002928   Data          18  usbd_desc_device.o(.constdata)
    g_PUSBD_LanguageStringDescriptor         0x0800293c   Data           4  usbd_desc_device.o(.constdata)
    g_PUSBD_VendorStringDescriptor           0x08002940   Data          18  usbd_desc_device.o(.constdata)
    g_PUSBD_ProductStringDescriptor          0x08002954   Data          44  usbd_desc_device.o(.constdata)
    g_PUSBD_SerialStringDescriptor           0x08002980   Data          34  usbd_desc_device.o(.constdata)
    g_PUSBD_HID_Report                       0x080029a2   Data          25  usbd_desc_msd_hid.o(.constdata)
    g_PUSBD_HID_ReportLen                    0x080029bb   Data           1  usbd_desc_msd_hid.o(.constdata)
    g_PUSBD_ConfigDescriptor                 0x080029bc   Data          64  usbd_desc_msd_hid.o(.constdata)
    g_PUSBD_MSD_MediaInquiryData             0x080029fc   Data          44  usbd_desc_msd_hid.o(.constdata)



А это для STM32L475
Код
g_PUSBD_DeviceDescriptor                 0x08002348   Data          18  usbd_desc_device.o(.constdata)
    g_PUSBD_LanguageStringDescriptor         0x0800235a   Data           4  usbd_desc_device.o(.constdata)
    g_PUSBD_VendorStringDescriptor           0x0800235e   Data          18  usbd_desc_device.o(.constdata)
    g_PUSBD_ProductStringDescriptor          0x08002370   Data          44  usbd_desc_device.o(.constdata)
    g_PUSBD_SerialStringDescriptor           0x0800239c   Data          34  usbd_desc_device.o(.constdata)
    g_PUSBD_HID_Report                       0x080023be   Data          25  usbd_desc_msd_hid.o(.constdata)
    g_PUSBD_HID_ReportLen                    0x080023d7   Data           1  usbd_desc_msd_hid.o(.constdata)
    g_PUSBD_ConfigDescriptor                 0x080023d8   Data          64  usbd_desc_msd_hid.o(.constdata)
    g_PUSBD_MSD_MediaInquiryData             0x08002418   Data          44  usbd_desc_msd_hid.o(.constdata)

Прикрепленные файлы
Прикрепленный файл  DESCS.ZIP ( 5.68 килобайт ) Кол-во скачиваний: 6
 


--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 09:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.55717 секунд с 7
ELECTRONIX ©2004-2016