Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR for 8051
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
WHALE
Не понимаю, что от меня хочет компилятор.
Код
#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 таки является константой?

zltigo
QUOTE (WHALE @ Jul 15 2015, 15:06) *
Как объяснить компилятору, что UART_BUFFERSIZE таки является константой?

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

WHALE
Цитата(zltigo @ Jul 15 2015, 16:14) *
Написать вменяемый и понятный как компилятору, так и человеку текст, а не то умопомрачение, которое Вы наваляли.

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



zltigo
QUOTE (WHALE @ Jul 15 2015, 15:27) *
эээ... а чуть-чуть развернуть вашу мысль можете?В смысле с примером правильного объявления.

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

Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти.
Поскольку ответить, полагаю, не сможете, то тогда так:
CODE
#define UART_BUFFERSIZE (8)
unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];
WHALE
Цитата(zltigo @ Jul 15 2015, 16:33) *
Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти.
Поскольку ответить, полагаю, не сможете, то тогда так:
Код
#define UART_BUFFERSIZE (8)
unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];


Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо-
диться без макросов и препроцессор не обеспечивает проверку типов.
И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят
в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и
лежащую во флэши?

zltigo
QUOTE (WHALE @ Jul 15 2015, 15:50) *
Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо-
диться без макросов и препроцессор не обеспечивает проверку типов.

Даже если слушать теоретиков зацикленных на "улучшении" Си и выcасывании "проблем", то здесь уж точно даже не этот случай.
А что-бы понять всю скудоумость подобных советов - включите-ка MISRA проверку - потом расскажите sm.gif о впечателении.
QUOTE
И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят
в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и
лежащую во флэши?

Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами.
SSerge
Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.
IAR для 8051 даже позволяет такое делать если в настройках выбрать С99 и поставить галку Allow VLA, но только для локальных массивов, объявленных внутри функции.

В любом случае для 8051 подобные излишества скорее вредны чем полезны.
WHALE
Цитата(zltigo @ Jul 15 2015, 17:08) *
Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами.


Спасибо, вы ответили на мой вопрос.Я сейчас только сообразил что для AVR и ARM проекты действительно были на плюсах. ОК,сделал через define, все работает.
Но для окончательного просветления сознания - в чем разница const C и С++. Насколько я знаю, константность в плюсах можно отменить, а в С это навсегда.И я считал .что строки
#define variable (value)
и FLASH const variable = value;
должны компилироваться компилятором что в режиме С, что в режиме С++ в одинаковый код и трактоваться
в обоих случаях как константы.Почему не так?


Цитата(SSerge @ Jul 15 2015, 19:37) *
Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.
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.
zltigo
QUOTE (SSerge @ Jul 15 2015, 18:37) *
Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.

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

SSerge
Цитата(WHALE @ Jul 15 2015, 23:03) *
Но для окончательного просветления сознания - в чем разница 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) сообщает об ошибке.
zltigo
QUOTE (SSerge @ Jul 15 2015, 19:52) *
Сделал отдельный файл с двумя злополучными строками и проверил в IAR для ARM V7.30, в режиме С++ соглашается, в С (несмотря на С99 +AllowVLA) сообщает об ошибке.

Но что-то типа
CODE
f( int x )
{
char b[x];

}

сжевать должен, ибо никаих проблем, кроме формального допущения разрешенного в С99.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.