Easyelectronics.ru

Электроника для всех
Текущее время: 21 фев 2018, 16:08

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 17:32 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 303
Добрый день.
При компиляции приложения возникла данная проблема:
Код:
.\Objects\Firmware.axf: Error: L6137E: Symbol abort was not preserved by the LTO codegen but is needed by the image.

Возникает она вот здесь:
Код:
void Core::run()
{
    while(true)
    {
        _isRunning = true;
        (this->*_handler)(); // вот тут ошибка
    }
}
Стоит только закомментировать данную строку, как компиляция проходит успешно. Переменная _handler содержит указатель на метод-член класса Core. Ее значение меняется в обработчике прерывания:
Код:
...
if(state)
{
    // ...
     this->_changeMode(&Core::_autoModeHandler);
}
else
{
    // ...
    this->_changeMode(&Core::_freeModeHandler);
}
Код:
void _changeMode(Handler handler)
{
    _isRunning = false;
    _handler = handler;
}


Может у кого была подобная ошибка, как ее исправить? Может на ассемблере это можно переписать, вдруг так сработает... Суть - хранить указатель на метод и иметь возможность его вызвать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 18:56 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1313
ElecDron писал(а):
Может у кого была подобная ошибка, как ее исправить?

Не сталкивался сам, но по уму должен быть какой-то способ сказать компилятору, что функция или переменная реально нужны. Для GCC это выглядит так:
Код:
void dummyFunction(void) __attribute__((used));

// Never called.
void dummyFunction(void) {
    vTaskSwitchContext();
}

Думаю, для кейла должно быть что-нибудь подобное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 19:11 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 303
Вот, удалось воспроизвести вне приложения. Keil 5.24a, компилятор ARM Compiler 6.7, режим С++14. Опция lto включена.
Код:
void test()
{
    volatile int* qqq = reinterpret_cast<int*>(0x100500);
    *qqq = 1;
}

void test2()
{
    volatile int* qqq = reinterpret_cast<int*>(0x100500);
    *qqq = 1;
}

bool dummy()
{
    volatile int* qqq = reinterpret_cast<int*>(0x100500);
    return *qqq > 0;
}

int main()
{
    using Handler = void (*)();
    Handler qwerty;
    if(dummy()) qwerty = &test;
    else qwerty = &test2;

    qwerty(); // а если закомментировать, то нормально...

    while(true);
}
Как тогда сохранить указатель на функцию/метод???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 19:18 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1313
ElecDron писал(а):
Как тогда сохранить указатель на функцию/метод???

Добавление __attribute__((used)) к функциям помогает?

Нашел в кейловских доках (http://www.keil.com/appnotes/files/apnt_298.pdf):
...
Functions can be marked with the used attribute to prevent elimination. For example:
Код:
void foo2 (void) __attribute__((used)) {
i = -1;
}

...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 19:30 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 429
ElecDron писал(а):
Вот, удалось воспроизвести вне приложения. Keil 5.24a, компилятор ARM Compiler 6.7, режим С++14. Опция lto включена.
Код:
void test()
{
    volatile int* qqq = reinterpret_cast<int*>(0x100500);
    *qqq = 1;
}

А что за адрес 0x100500? Это же не RAM и даже не флеш...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 22:50 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 303
Нет, не помог атрибут used. И волатильность для переменной qwerty тоже не помогает.
Aдрес 0x100500 - это просто число. Чтобы что-нибудь было в теле функции.
А вы сами скопируйте тот код и попробуйте скомпилировать его. Зависимостей внешних нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil Armclang с опцией LTO удаляет переменную
СообщениеДобавлено: 26 сен 2017, 22:52 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4636
Очередная попытка ущербных натянуть сову на глобус...
Одни игрушки, нет бы делом занялись...


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

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


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

Сейчас этот форум просматривают: Google [Bot]


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB