Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-авг-05 15:00

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 12 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-01 17:28 
Не в сети

Зарегистрирован: 2012-апр-27 11:01
Сообщения: 25
Организация: ПАО "НПО "Алмаз"
Откуда: г.Зеленоград
Здравствуйте!
Работаю в Фитон CodeMaster-ARM 2.40.00 с родным Си-компилятором и JTAG-эмулятором. Разбирая исходные коды миландровских библиотек увидел следующий код:
void RST_CLK_LSIcmd(FunctionalState NewState)
{
#if defined ( USE_MDR1986VE3 ) || defined (USE_MDR1986VE1T)
  uint32_t temp = 0;
#endif
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NewState));

#if defined  (USE_MDR1986VE9x) || defined (USE_MDR1901VC1T)
  *(__IO uint32_t *) LSION_BB = (uint32_t) NewState;
#endif

#if defined ( USE_MDR1986VE3 ) || defined (USE_MDR1986VE1T)

  temp = MDR_BKP->REG_0F;
  /* Form new value */
  if (NewState != DISABLE) {
    /* Enable LSI clk by setting the LSE_ON bit in the BKP_REG_0F register */
    temp |= BKP_REG_0F_LSI_ON;
  }
  else {
    /* Disable LSI clk by resetting the LSE_ON bit in the BKP_REG_0F register */
    temp &= ~BKP_REG_0F_LSI_ON;
  }
  /* Configure REG_0F register with new value */
  MDR_BKP->REG_0F = temp;
#endif
}
при компиляции выдается Warning, что переменная temp не используется, хотя у меня стоит макроопределение USE_MDR1986VE1T . Так же, синтаксическая конструкция #if defined не подсвечена соответствующим образом. Начал разбираться, у оказалось, что в документации на среду разработки и компилятор нигде не описано как правильно создавать условные макросы. По идее, вместо #if defined должно быть #ifdef , а дальше как? Можно получить подробное описание на Си-компилятор?


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-01 18:28 
Не в сети

Зарегистрирован: 2020-дек-10 09:35
Сообщения: 28
Организация: Startex
Не являюсь знатоком СИ, но по мойму это все стандартно.

#ifdef case_a
проверяет единичное определение, есть #define case_a в коде или нет

#if defined(case_a) || defined(case_b)
А #if проверяет булевое значение от выражения. defined(case_a) - проверяет единичное определение, есть #define case_a или нет
Грубо говоря, #ifdef case_a это сокращенно от #if defined(case_a)

Попробуйте прописать #define USE_MDR1986VE1T прямо перед функцией RST_CLK_LSIcmd(). Иногда бывает, что буква T на конце потеряна, USE_MDR1986VE1T.


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-01 20:54 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 322
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
alexander писал(а): *
в документации на среду разработки и компилятор нигде не описано как правильно создавать условные макросы.
Это не относится к среде или компилятору. Это регламентируется СТАНДАРТАМИ языка. В любом учебнике по С/С++ есть глава про препроцессор и директивы условной компиляции. Просто прочитайте её. Можно начать с этого.


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 09:08 
Не в сети

Зарегистрирован: 2012-апр-27 11:01
Сообщения: 25
Организация: ПАО "НПО "Алмаз"
Откуда: г.Зеленоград
Professor Chaos писал(а): *
alexander писал(а): *
в документации на среду разработки и компилятор нигде не описано как правильно создавать условные макросы.
Это не относится к среде или компилятору. Это регламентируется СТАНДАРТАМИ языка. В любом учебнике по С/С++ есть глава про препроцессор и директивы условной компиляции. Просто прочитайте её. Можно начать с этого.
В документации на GCC, который БЕСПЛАТЕН, есть описание препроцессора и условных макросов https://gcc.gnu.org/onlinedocs/gcc-11.1 ... nal-Syntax . А в инструменте, который я КУПИЛ нет такого описания. Если Фитон использовал готовый стандарт, то пусть дадут ссылку на официальный стандарт (а не просто ссылка на какой-то сомнительный ресурс). А вообще, можно было привести описание препроцессора в своей документации.


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 09:46 
В сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 325
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
alexander писал(а): *
Professor Chaos писал(а): *
alexander писал(а): *
в документации на среду разработки и компилятор нигде не описано как правильно создавать условные макросы.
Это не относится к среде или компилятору. Это регламентируется СТАНДАРТАМИ языка. В любом учебнике по С/С++ есть глава про препроцессор и директивы условной компиляции. Просто прочитайте её. Можно начать с этого.
В документации на GCC, который БЕСПЛАТЕН, есть описание препроцессора и условных макросов https://gcc.gnu.org/onlinedocs/gcc-11.1 ... nal-Syntax . А в инструменте, который я КУПИЛ нет такого описания. Если Фитон использовал готовый стандарт, то пусть дадут ссылку на официальный стандарт (а не просто ссылка на какой-то сомнительный ресурс). А вообще, можно было привести описание препроцессора в своей документации.
Здравствуйте!

Все компиляторы любого языка работают со стандартами. В данном случае Фитон говорит о том, что их компилятор CMC-ARM соответствует ANSI/ISO 9899-1990 для языка С, включая Technical Corrigendum 1 и 2, поэтому, пожалуйста, обращайтесь к стандарту за пояснениями. В свою очередь, отдельный функционал компилятора компания Фитон поясняет в документе "CMC-ARM. Руководство пользователя": документ доступен для ознакомления, если среда CodeMaster-ARM установлена, тогда в пуске, в папке "Phyton CodeMaster-ARM", Вы сможете его открыть.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 09:56 
Не в сети

Зарегистрирован: 2020-дек-10 09:35
Сообщения: 28
Организация: Startex
Вангую за то, что дефайт USE_MDR1986VE1T задан без Т! Сам на такое натыкался и пучился. :)
Потому как USE_MDR1986VE3 задается без Т, а USE_MDR1986VE1T уже см Т.

А все библиотечные дефайны компилятор фитона стопудово понимает адекватно. Иначе бы там давно уже ничего не работало и вой бы стоял вселенский!


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 12:53 
Не в сети

Зарегистрирован: 2012-апр-27 11:01
Сообщения: 25
Организация: ПАО "НПО "Алмаз"
Откуда: г.Зеленоград
AndOrFin писал(а): *
Вангую за то, что дефайт USE_MDR1986VE1T задан без Т! Сам на такое натыкался и пучился. :)
Потому как USE_MDR1986VE3 задается без Т, а USE_MDR1986VE1T уже см Т.

А все библиотечные дефайны компилятор фитона стопудово понимает адекватно. Иначе бы там давно уже ничего не работало и вой бы стоял вселенский!
Вот фрагмент заголовочного файла, который шел с примерами программ:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MDR32F9Qx_BOARD_H
#define __MDR32F9Qx_BOARD_H

/* Uncomment the line corresponding to the Milandr evaluation board
   used to run the example */
#if !defined (USE_MDR32F9Q1_Rev0)  && !defined (USE_MDR32F9Q1_Rev1)  && \
    !defined (USE_MDR32F9Q2_Rev0) && !defined (USE_MDR32F9Q2_Rev1) && \
    !defined (USE_MDR32F9Q3_Rev0) && !defined (USE_MDR32F9Q3_Rev1)

/* #define USE_MDR32F9Q1_Rev0 */

/* #define USE_MDR32F9Q1_Rev1  */

/* #define USE_MDR32F9Q2_Rev0 */

/* #define USE_MDR32F9Q2_Rev1 */

/* #define USE_MDR32F9Q3_Rev0 */

/* #define USE_MDR32F9Q3_Rev1 */

 #define USE_MDR1986VE1T  

/* #define USE_MDR1986VE3 */

/* #define USE_MDR1986VE9x  */

/* #define USE_MDR1986VE94 */

#endif

#endif /* __MDR32F9Qx_BOARD_H */

/******************* (C) COPYRIGHT 2010 Phyton *********************************
*
* END OF FILE MDR32F9Qx_board.h */
вроде как всё правильно.


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 12:54 
Не в сети

Зарегистрирован: 2012-апр-27 11:01
Сообщения: 25
Организация: ПАО "НПО "Алмаз"
Откуда: г.Зеленоград
Lampadov писал(а): *
alexander писал(а): *
Professor Chaos писал(а): *

Это не относится к среде или компилятору. Это регламентируется СТАНДАРТАМИ языка. В любом учебнике по С/С++ есть глава про препроцессор и директивы условной компиляции. Просто прочитайте её. Можно начать с этого.
В документации на GCC, который БЕСПЛАТЕН, есть описание препроцессора и условных макросов https://gcc.gnu.org/onlinedocs/gcc-11.1 ... nal-Syntax . А в инструменте, который я КУПИЛ нет такого описания. Если Фитон использовал готовый стандарт, то пусть дадут ссылку на официальный стандарт (а не просто ссылка на какой-то сомнительный ресурс). А вообще, можно было привести описание препроцессора в своей документации.
Здравствуйте!

Все компиляторы любого языка работают со стандартами. В данном случае Фитон говорит о том, что их компилятор CMC-ARM соответствует ANSI/ISO 9899-1990 для языка С, включая Technical Corrigendum 1 и 2, поэтому, пожалуйста, обращайтесь к стандарту за пояснениями. В свою очередь, отдельный функционал компилятора компания Фитон поясняет в документе "CMC-ARM. Руководство пользователя": документ доступен для ознакомления, если среда CodeMaster-ARM установлена, тогда в пуске, в папке "Phyton CodeMaster-ARM", Вы сможете его открыть.
Спасибо за точную информацию!


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 16:44 
Не в сети

Зарегистрирован: 2020-дек-10 09:35
Сообщения: 28
Организация: Startex
alexander писал(а): *
вроде как всё правильно.
Может быть тогда компилятор ругается на то, что ноль присвоенный в tmp нигде не используется.
uint32_t temp = 0;  - ЭТО ВОТ, а затем срау вот
temp = MDR_BKP->REG_0F;


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 19:20 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 322
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Кому нужны стандарты - можно поискать тут.


Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-02 22:03 
В сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 325
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Professor Chaos писал(а): *
Кому нужны стандарты - можно поискать тут.
Важно отметить, что не в печатном виде ANSI/ISO 9899-1990 мало где можно найти. Прикрепил в текстовом виде в составе архива к посту.

По кликабельным ссылкам доступны TECHNICAL CORRIGENDUM 1 и TECHNICAL CORRIGENDUM 2, которые в том числе учитывает Фитон в своём компиляторе.


Вложения:
ANSI_ISO_9899-1990.zip [121.68 КБ]
13 скачиваний

_________________
Отдел технической поддержки support@milandr.ru
Вернуться к началу
 Заголовок сообщения: Re: Условный макрос. Как правильно?
СообщениеДобавлено: 2021-июн-07 16:48 
Не в сети

Зарегистрирован: 2012-апр-27 11:01
Сообщения: 25
Организация: ПАО "НПО "Алмаз"
Откуда: г.Зеленоград
AndOrFin писал(а): *
alexander писал(а): *
вроде как всё правильно.
Может быть тогда компилятор ругается на то, что ноль присвоенный в tmp нигде не используется.
uint32_t temp = 0;  - ЭТО ВОТ, а затем срау вот
temp = MDR_BKP->REG_0F;
Да, именно на это ругается. Define тут не причем. Надо просто убрать присвоение 0.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 12 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB