Easyelectronics.ru

Электроника для всех
Текущее время: 23 ноя 2017, 03:03

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



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 291
Добрый день.
При компиляции приложения возникла данная проблема:
Код:
.\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
Сообщения: 1107
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
Сообщения: 291
Вот, удалось воспроизвести вне приложения. 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
Сообщения: 1107
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
Сообщения: 355
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
Сообщения: 291
Нет, не помог атрибут used. И волатильность для переменной qwerty тоже не помогает.
Aдрес 0x100500 - это просто число. Чтобы что-нибудь было в теле функции.
А вы сами скопируйте тот код и попробуйте скомпилировать его. Зависимостей внешних нет.


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

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


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

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


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

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


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

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

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