Волатильный массив

Тема в разделе "Микроконтроллеры AVR", создана пользователем parovoZZ, 30 дек 2018.

  1. parovoZZ

    parovoZZ Гуру

    Есть такой говнокод:
    Код (C++):
    volatile    uint8_t    data[n];
    где-то определена функция
    Код (C++):
    uint8_t my_function (uint8_t *data)
    {
    здесь говнокод
    }
    так вот при вызове этой функции
    Код (C++):
    my_function (&data[x]);
    компилятор кидает предупреждение
    разумеется, что при добавлении volatile в эту функцию предупреждение исчезает, но проблема в том, что он ругается и на вложенные функции, в которые передаётся массив. Менять во вложенных функциях ничего не хочется, ибо они в файлах, которые таскаются между проектами (грубо говоря драйверы периферии). Вот как быть? Может, надо настроечки компилятора "подкрутить"? Или забить? Я не слишком сильно проскиллован в указателях(

    n и х вполне определенные числа, но здесь опущены.
     
  2. Если не указывать, то функции будут скомпилированы с оптимизациями, которые volatile должен отменять. Тут вопрос в том, насколько и в какой функции это нужно.
     
  3. DIYMan

    DIYMan Гуру

    Попробуй в my_function передавать через const_cast:
    Код (C++):
    my_function (const_cast<uint8_t*>(&data[x]));
     
  4. parovoZZ

    parovoZZ Гуру

    Тем не менее, оно и так работает. Volatile из-за того, что один из элементов массива записывается в прерывании. Я так понимаю, что указатель на область памяти с массивом передаётся через РОН (так утверждает AN), соответственно - пусть компилятор оптимизирует всё внутри функции. Мне важно, чтобы мой массив был доступен из обработчика прерывания.
     
  5. parovoZZ

    parovoZZ Гуру

    Да, почитаю, что это такое.
     
  6. Значит и не нужно volatile там. Или пока везет. Но скорее не нужно, т.к. в большинстве случаев не нужно.