Ну потому, что в С++ const uint8_t и uint8_t это разные типы. В зависимости от флагов компилятора он или сам приведет типы, ругнувшись, или даст ошибку компиляции.
Ну, начнём с того, что здесь ты не берёшь указатель на константу, а просто передаёшь готовый константный указатель - не путай такие вещи. А ругается потому, что вот такой конструкцией Код (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) {}
а как тогда взять указатель на адрес во FLASH? Самый простой случай - скопировать из FLASH в RAM. RAM много, поэтому этот факт не напрягает. Напрягает время, затрачиваемое на копирование из FLASH в RAM. а дальше этот указатель передаётся в обработчик SPI, который принимает Код (C++): uint8_t* . Получается, что мне нужен ещё один обработчик SPI, который будет принимать Код (C++): const uint8_t*
В 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.
Опять пошёл поток сознания. Я ж тебе говорил, есть вопросы, спрашивай. А болтовня о том, что в коде которого я не видел вылазят ошибки, которых я тоже не вижу мне неинтересна и комментироваться никак не будет.
кстати, в IAR диапазон настраивается так и сделал. IAR для MSP430 не ругается, данные в data SPI попадают прямиком из FRAM (через регистр), а не как раньше через ОЗУ.