Перейти к содержанию
    

IAR for 8051

Не понимаю, что от меня хочет компилятор.

 #ifndef FLASH
  #define FLASH _Pragma("location=\"FLASH\"")
   #endif
FLASH  const unsigned char UART_BUFFERSIZE = 8;
  unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];

Error[Pe028]: expression must have a constant value D:\PROGEKTS\microcontrollers\C8051\Silabs\No_RTOS\TEST\SRC\main.c 10

на строке с объявлением буффера UART1_RX_Buffer.

На IAR-е для AVR и для ARM все нормально.

Как объяснить компилятору, что UART_BUFFERSIZE таки является константой?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как объяснить компилятору, что UART_BUFFERSIZE таки является константой?

Написать вменяемый и понятный как компилятору, так и человеку текст, а не то умопомрачение, которое Вы наваляли.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написать вменяемый и понятный как компилятору, так и человеку текст, а не то умопомрачение, которое Вы наваляли.

эээ... а чуть-чуть развернуть вашу мысль можете?В смысле с примером правильного объявления.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эээ... а чуть-чуть развернуть вашу мысль можете?В смысле с примером правильного объявления.

#define UART_BUFFERSIZE (8)
FLASH  const unsigned char uart_buffersize = UART_BUFFERSIZE;
unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];

Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти.

Поскольку ответить, полагаю, не сможете, то тогда так:

#define UART_BUFFERSIZE (8)
unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти.

Поскольку ответить, полагаю, не сможете, то тогда так:

#define UART_BUFFERSIZE (8)
unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];

 

Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо-

диться без макросов и препроцессор не обеспечивает проверку типов.

И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят

в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и

лежащую во флэши?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо-

диться без макросов и препроцессор не обеспечивает проверку типов.

Даже если слушать теоретиков зацикленных на "улучшении" Си и выcасывании "проблем", то здесь уж точно даже не этот случай.

А что-бы понять всю скудоумость подобных советов - включите-ка MISRA проверку - потом расскажите :) о впечателении.

И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят

в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и

лежащую во флэши?

Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.

IAR для 8051 даже позволяет такое делать если в настройках выбрать С99 и поставить галку Allow VLA, но только для локальных массивов, объявленных внутри функции.

 

В любом случае для 8051 подобные излишества скорее вредны чем полезны.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами.

 

Спасибо, вы ответили на мой вопрос.Я сейчас только сообразил что для AVR и ARM проекты действительно были на плюсах. ОК,сделал через define, все работает.

Но для окончательного просветления сознания - в чем разница const C и С++. Насколько я знаю, константность в плюсах можно отменить, а в С это навсегда.И я считал .что строки

#define variable (value)

и FLASH const variable = value;

должны компилироваться компилятором что в режиме С, что в режиме С++ в одинаковый код и трактоваться

в обоих случаях как константы.Почему не так?

 

 

Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.

IAR для 8051 даже позволяет такое делать если в настройках выбрать С99 и поставить галку Allow VLA, но только для локальных массивов, объявленных внутри функции.

 

В любом случае для 8051 подобные излишества скорее вредны чем полезны.

 

А чего-это он будет выделен динамически, если это глобальный массив и никаких malloc и близко нет.

Галки С99 и Allow VLA стоят изначально и не помогают.

О,нашел

CLIB does not support any C99 functionality. For example, complex numbers and

variable length arrays are not supported.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.

Ну это Вы круто загнули :). На стеке С99 этот массив размесить сможет. Но описанный ранее случай тоже не об этом. Там простая С++ оптимизация при которой переменая была просто выкинута за ненадобностью.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но для окончательного просветления сознания - в чем разница const C и С++.

В C++ const делает объявленный объект локальным в единице трансляции, в С же такая переменная будет глобальной и на неё можно ссылаться из других файлов.

В С++ const эквивалентен static const в С.

Чтобы получить в С++ поведение аналогичное const для С, нужно писать extern const.

А чего-это он будет выделен динамически, если это глобальный массив и никаких malloc и близко нет.

Галки С99 и Allow VLA стоят изначально и не помогают.

О,нашел

CLIB does not support any C99 functionality. For example, complex numbers and

variable length arrays are not supported.

Сделал отдельный файл с двумя злополучными строками и проверил в IAR для ARM V7.30, в режиме С++ соглашается, в С (несмотря на С99 +AllowVLA) сообщает об ошибке.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал отдельный файл с двумя злополучными строками и проверил в IAR для ARM V7.30, в режиме С++ соглашается, в С (несмотря на С99 +AllowVLA) сообщает об ошибке.

Но что-то типа

f( int x )
{
char b[x];

}

сжевать должен, ибо никаих проблем, кроме формального допущения разрешенного в С99.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...