Конвертировать -10 в строку

Тема в разделе "ESP8266, ESP32", создана пользователем Vovka, 24 окт 2020.

  1. asam

    asam Гик

    Ну потому, что в С++ const uint8_t и uint8_t это разные типы. В зависимости от флагов компилятора он или сам приведет типы, ругнувшись, или даст ошибку компиляции.
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Ну, начнём с того, что здесь ты не берёшь указатель на константу, а просто передаёшь готовый константный указатель - не путай такие вещи.

    А ругается потому, что вот такой конструкцией
    Код (C++):

    const uint8_t ConfArray[] = RADIO_CONFIGURATION_DATA_ARRAY;
    inline void Radio_Init(uint8_t *pArray)
    Radio_Init(ConfArray);
     
    Ты отменяешь константность. Параметр функции Radio_Init - не константа, т.е. в момент передачи константность ConfArray отменяется.

    Решать эту проблему так, как ты решаешь
    Код (C++):
    Radio_Init((uint8_t*)ConfArray);
    Очень грубо и в целом неверно. Т.е. ты по сути сказал компилятору, "да я знаю, что константность отменяется и умышленно это делаю - заткнись"!

    Остаётся вопрос, нафига ты это сделал? Тебе и вправду нужно было отменить константность? Менять собрался? А если нет, то нафига так насиловать компилятор?

    Гораздо правильнее сделать параметр функции константой, тогда и отменять не придётся. Примерно, вот так:
    Код (C++):
    inline void Radio_Init(const uint8_t *pArray) {
        Serial.println(pArray[0]);
    }
    void setup(void) {
        Serial.begin(115200);
        const uint8_t ConfArray[] = { 'a' };
        Radio_Init(ConfArray);
    }

    void loop(void) {}
     
    parovoZZ, Andrey12 и b707 нравится это.
  3. parovoZZ

    parovoZZ Гуру

    а как тогда взять указатель на адрес во FLASH? Самый простой случай - скопировать из FLASH в RAM. RAM много, поэтому этот факт не напрягает. Напрягает время, затрачиваемое на копирование из FLASH в RAM.

    а дальше этот указатель передаётся в обработчик SPI, который принимает
    Код (C++):
    uint8_t*
    . Получается, что мне нужен ещё один обработчик SPI, который будет принимать
    Код (C++):
    const uint8_t*
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Тот, что принимает const, примет и не const, Обратное недопустимо.
     
    parovoZZ и Andrey12 нравится это.
  5. parovoZZ

    parovoZZ Гуру

    В IAR ошибка уходит в обработчик SPI.
    Попробовал этот же код в AtmelStudio. AVRGCC выдаёт warning, но компилирует. Запустил дебаг. ConfArray указывает на адрес 0x8156. Это FLASH. Но в окне memory область памяти PROGMEM смещена на 0х8000 почему-то (никогда на это внимания не обращал). Мой RADIO_CONFIGURATION_DATA_ARRAY лежит начиная с адреса 0х0156 (это область памяти Ext I/O так-то...) Видимо, это какие-то костыли из-за фон неймана... Разворачиваешь ConfArray в окне watch - а там одни ошибки.
    Собственно, это то, что и нужно - считывать FLASH минуя SRAM.
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Опять пошёл поток сознания. Я ж тебе говорил, есть вопросы, спрашивай. А болтовня о том, что в коде которого я не видел вылазят ошибки, которых я тоже не вижу мне неинтересна и комментироваться никак не будет.
     
    b707 нравится это.
  7. parovoZZ

    parovoZZ Гуру

    кстати, в IAR диапазон настраивается
    IAR_CHAr.png

    так и сделал. IAR для MSP430 не ругается, данные в data SPI попадают прямиком из FRAM (через регистр), а не как раньше через ОЗУ.