Страница 1 из 1
Blackfin, компилятор, менеджер памяти
Добавлено: Чт янв 30, 2014 22:51:39
faddistr
Использую VDK. Компилятор из состава Visual DSP++. В C++ boot_thr.cpp: Инициализирую некоторую структуру(static). В С либе Lib существует статический указатель типа структуры. Через функцию передаю адрес структуры, присваиваю указателю. Сразу после присваивания поля структуры и указателя на структуру совпадают, адреса равны. В Lib.с объявлен статический колбек, который вызывается из недр стандартных драйверов(uart) по прерыванию. Указатель содержит корректный адрес структуры. Получается что после вызова колбека, поля указателя на структуру и поля структуры начинают отличаться. Как будто в момент инициализации указателя произошло копирования структуры, вместо присваивания указателя. При том значение &Структура и Указатель совпадают(один и тот-же участок L1 Internal memory). Но при использования в boot_thr.cpp видим старые значения полей, а в Lib.с в колбеках новые.
В чем причина такого странного поведения? Пробовал передавать указатель как колбек параметр, ефект тот-же.
Re: Blackfin, компилятор, менеджер памяти
Добавлено: Пт янв 31, 2014 16:53:17
faddistr
Поля структур для Си и С++ выравнены по разному. Хоть структуры и начинаются с одного адреса, далее идет нехорошая штука со смещениями. Прагма не работает.

Предварительно решил отказаться от Си++.
Re: Blackfin, компилятор, менеджер памяти
Добавлено: Пт янв 31, 2014 22:29:59
mrFox
а попробовать передавать ссылки на 1ю переменную структуры ?
Re: Blackfin, компилятор, менеджер памяти
Добавлено: Сб фев 01, 2014 00:50:32
faddistr
mrFox писал(а):а попробовать передавать ссылки на 1ю переменную структуры ?
А что это изменит? У меня структура в структуре, она выравнивается по 1 байту или 4м в зависимости от того си это или си++. Или он по другому начнет работать?
Re: Blackfin, компилятор, менеджер памяти
Добавлено: Сб фев 01, 2014 16:01:48
mrFox
в C и C++ видимо разные настройки выравнивания/упаковки структуры
при работе с кортексами (GCC) упаковка структур: -fpack-struct
можно еще так попробовать
Код: Выделить всё
#ifdef __cplusplus
extern "C" {
#endif
структура
#ifdef __cplusplus
}
#endif
Re: Blackfin, компилятор, менеджер памяти
Добавлено: Пн фев 03, 2014 14:48:24
faddistr
Спасибо за ответы. Проблема оказалась в похеренном файле services_types.h . После его восстановления все работает.