Арифметика символа компоновщика во время сборки вычисляет неверный результат - PullRequest
0 голосов
/ 24 июня 2019

Я использую GCC для приложения микроконтроллера STM32, и я столкнулся со странным явлением. У меня есть таблица постоянных значений во флэш-памяти, которые содержат адреса из символов линкера. Теперь я хочу добавить еще одно значение, которое содержит вычисление (во время сборки) из двух символов компоновщика, но, похоже, оно не работает.

Это выглядит так:

extern uint32_t _ls1;   // Linker symbol 1          
extern uint32_t _ls2;   // Linker symbol 2      
const volatile uint32_t table[4] =
{
    (uint32_t)(&_ls1),                    // 1. Correct value 
    (uint32_t)(&_ls2),                    // 2. Correct value 
    (uint32_t)(&_ls1) + 1,                // 3. Correct value 
    (uint32_t)(&_ls1) + (uint32_t)(&_ls2) // 4. Wrong value, always 0
}

Первые три значения в таблице совершенно верны.
Всякий раз, когда я добавляю два (или более) символа компоновщика в вычисление, результат равен 0. Никаких ошибок или предупреждений не выдается.

Есть идеи?

1 Ответ

1 голос
/ 24 июня 2019

у вас что-то не так в вашем скрипте компоновщика.

Я проверил его, используя мои вещи (сейчас я работаю с использованием STM32L476, gcc)

volatile const uint32_t test[] = {
        (uint32_t)&_edata,
        (uint32_t)&_sdata,
        (uint32_t)&_edata + 1,
        (uint32_t)&_edata + 2,
        (uint32_t)&_edata + (uint32_t)&_sdata,
};

(эта таблица может иметь только автоматическое хранение, иначе она не будет компилироваться)

И результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...