Портирование проекта из ICCAVR в Atmel Studio 7.0 _fla sh проблема - PullRequest
0 голосов
/ 27 февраля 2020

В настоящее время я портирую большой проект в Atmel Studio из ICCAVR, поскольку мне нужно использовать некоторые библиотеки ASF для проекта, над которым я работаю.

Я получаю эту ошибку в приведенном ниже примере кода при попытке преобразовать следующую строку в Atmel Studio

void debugoutf(__flash char * header, __flash char * msg);

Ошибка указателя при адресном пространстве '__fla sh 'должно быть константой в параметре функции' header '

Я попытался использовать макрос в документации, чтобы он мог компилироваться в Atmel Studio.

#ifndef FLASHVAR_H_
#define FLASHVAR_H_

    #include <avr/pgmspace.h>

    #if defined(__ICCAVR__) // IAR C Compiler
    #define FLASH_DECLARE(x) __flash x
    #endif
    #if defined(__GNUC__) // GNU Compiler
    #define FLASH_DECLARE(x) x __attribute__((__progmem__))
    #endif

Преобразование IAR в AVR

void debugout(FLASH_DECLARE (char * header), char * msg);

Мой вопрос заключается в том, правильно ли я сделал преобразование, поскольку я не думаю, что сделал это правильно, поскольку ничего не печатается в моей отладке UART.

1 Ответ

0 голосов
/ 27 февраля 2020

Проблема с использованием __attribute__((__progmem__)) для переменной заключается в том, что всякий раз, когда вы хотите прочитать данные из такой переменной, вы не можете просто обращаться к ней обычным способом, как если бы вы обращались к переменной из ОЗУ. Вместо этого вы должны использовать специальные функции, предоставляемые заголовком avr/pgmspace.h в avr-lib c, например pgm_read_byte.

Это довольно раздражает, но у вас нет сделать это таким образом, потому что они добавили именованные адресные пространства , такие как __flash, в последние версии G CC (при условии, что вы используете C, а не C ++). Я рекомендую вам прекратить использование __attribute__((__progmem__)) и использовать вместо него __flash, если ваша версия G CC поддерживает это. Если компилятор выдает ошибку или предупреждение, потому что ожидает, что элементы, хранящиеся в fla sh, будут помечены как const, вы можете просто добавить const в объявление / определение (в правильной позиции). Если у вас возникли проблемы с этим, пожалуйста, напишите новый вопрос или отредактируйте этот вопрос так, чтобы он содержал MCVE .

. Для приведенного вами примера кода вы должны попробовать написать:

void debugoutf(const __flash char * header, const __flash char * msg);
...