|
|
  |
IAR for 8051, объявление массива |
|
|
|
Jul 15 2015, 12:06
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Не понимаю, что от меня хочет компилятор. Код #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 таки является константой?
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jul 15 2015, 12:33
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
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];
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 15 2015, 12:50
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(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 и лежащую во флэши?
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jul 15 2015, 13:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (WHALE @ Jul 15 2015, 15:50)  Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо- диться без макросов и препроцессор не обеспечивает проверку типов. Даже если слушать теоретиков зацикленных на "улучшении" Си и выcасывании "проблем", то здесь уж точно даже не этот случай. А что-бы понять всю скудоумость подобных советов - включите-ка MISRA проверку - потом расскажите  о впечателении. QUOTE И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и лежащую во флэши? Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 15 2015, 16:03
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(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.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jul 15 2015, 16:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(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) сообщает об ошибке.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jul 15 2015, 17:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (SSerge @ Jul 15 2015, 19:52)  Сделал отдельный файл с двумя злополучными строками и проверил в IAR для ARM V7.30, в режиме С++ соглашается, в С (несмотря на С99 +AllowVLA) сообщает об ошибке. Но что-то типа CODE f( int x ) { char b[x];
} сжевать должен, ибо никаих проблем, кроме формального допущения разрешенного в С99.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|