Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Keil #ifdef tanimlamasi

Başlatan M_B, 27 Aralık 2016, 16:26:49

M_B

Merhabalar;
STM32F407 Discovery Ethernet uygulamasının kodlarını inceliyorum.
main icerisinde  olan #ifdef USE_LCD  main başında #define USE_LCD veya keilin  Options C/C++ yerinde göremedim.
Tek bu main icin değil bir takım yerlerde #ifdef xxxx tanımlı farklı isimler de var. Bunların aktif olması için nerde tanımlamalar yapılıyor.
Belkide tam ifade edemedim. Sormal istediğimi :(
/*******************************************************************************
  * @file    main.c
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    31-October-2011
  * @brief   Main program body
  ******************************************************************************/

#include "stm32f4x7_eth.h"
#include "netconf.h"
#include "main.h"
#include "httpd.h"
#include "serial_debug.h"


#define SYSTEMTICK_PERIOD_MS  10

/*--------------- LCD Messages ---------------*/
#define MESSAGE1   "     STM32F4x7      "
#define MESSAGE2   "  STM32F-4 Series   "
#define MESSAGE3   "   Webserver Demo   "
#define MESSAGE4   "                    "
/*--------------- LCD Messages ---------------*/

__IO uint32_t LocalTime = 0; 		/* this variable is used to create a time reference incremented by 10ms */
uint32_t timingdelay;

/* Private function prototypes -----------------------------------------------*/
void LCD_LED_Init(void);

/***********************************************************************************
  * @brief  Main program.
  * @param  None
  * @retval None
 ***********************************************************************************/
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured to 
       144 MHz, this is done through SystemInit() function which is called from
       startup file (startup_stm32f4xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f4xx.c file
     */
  LCD_LED_Init(); 	/*Initialize LCD and Leds */ 
  ETH_BSP_Config(); /* configure ethernet (GPIOs, clocks, MAC, DMA) */ 
  LwIP_Init();  		/* Initilaize the LwIP stack */
  httpd_init();  		/* Http webserver Init */
  while (1)   			/* Infinite loop */
  {  
    /* check if any packet received */
    if (ETH_CheckFrameReceived()) 
			{ 
					LwIP_Pkt_Handle();  /* process received ethernet packet */
			}
    LwIP_Periodic_Handle(LocalTime); /* handle periodic timers for LwIP */
  }   
}

/**************************************************************************
  * @brief  Inserts a delay time.
  * @param  nCount: number of 10ms periods to wait for.
  * @retval None
 ************************************************************************/
void Delay(uint32_t nCount)
{
   timingdelay = LocalTime + nCount;  /* Capture the current local time */
   while (timingdelay > LocalTime); /* wait until the desired delay finish */  
}
/*****************************************************************************
  * @brief  Updates the system local time
  * @param  None
  * @retval None
 ****************************************************************************/
void Time_Update(void)
{
  LocalTime += SYSTEMTICK_PERIOD_MS;
}
/****************************************************************************
  * @brief  Initializes the STM324xG-EVAL's LCD and LEDs resources.
  * @param  None
  * @retval None
******************************************************************************/
void LCD_LED_Init(void)
{
#ifdef USE_LCD
  /* Initialize the STM324xG-EVAL's LCD */
  STM32f4_Discovery_LCD_Init();
#endif

  STM_EVAL_LEDInit(LED4); 
#ifdef USE_LCD
  /* Clear the LCD */
  LCD_Clear(Black);

  /* Set the LCD Back Color */
  LCD_SetBackColor(Black);

  /* Set the LCD Text Color */
  LCD_SetTextColor(White);

  /* Display message on the LCD*/
  LCD_DisplayStringLine(Line0, (uint8_t*)MESSAGE1);
  LCD_DisplayStringLine(Line1, (uint8_t*)MESSAGE2);
  LCD_DisplayStringLine(Line2, (uint8_t*)MESSAGE3);
  LCD_DisplayStringLine(Line3, (uint8_t*)MESSAGE4); 
#endif
}

#ifdef  USE_FULL_ASSERT

/***********************************************************************************
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
 ***********************************************************************************/
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {}
}
#endif

/*********** Portions COPYRIGHT 2012 Embest Tech. Co., Ltd.*****END OF FILE****/
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

keil bilmiyorum ama ilk zamanlarda genel tanımlamaları burada yapıyordum

M_B

@muhittin_kaplan  hocam;
Hazır projede o kısma da baktım orda tanımlı değildi. O yüzden sorma ihtiyacı duydum.
Diyelim ki hiç bir yerde tanımlı olmazsa ne oluyor.

not: Tek bu örnek için değil elime bir başka kit daha var onun programlarında da
bir takım yerlerde #ifdef tanımı var.  Kodları incelerken zorlanıyorum.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

preprocessor deyimi hocam, basitce programın "derlenirken dallanmasını" sağlıyor ifdef ler

ifdef HSE_VALUE //eğer define HSE_VALUE=8000000 gibi bir tanımlama varsa
     MCU yu HSE ye göre CLK ayarlaması yap.
else
     MCU yu HSI ye göre CLK ayarlaması yap

gibi çalışıyor. bildiğiniz if, farkı derlenme aşamasında programın farklı yerlerinin derlenmesini sağlamak, mcu seçimi, clk ayarı felan gibi.

M_B

Hocam
Demek istediğinizi anladım. Yalnız derleme esnasında diyorsunuz ya tanimliysa o kısmı derler yoksa derlemez. Peki USE_LCD kısmı nerde tanımlıki derleme esnasında fonksiyon içinde kontrol ediliyor.

Void LCD_LED_lnit();
Fonksiyonun en başında #ifdef USE_LCD tanımlı. Yukarılarda veya bir yerde tanımlıki fonksiyon içinde kontrol ediliyor. Tanımlı değilse diğer kismi derliyor.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

eğer biryerlerde USE_LCD tanımlıysa Void LCD_LED_lnit(); i derler. Tanımlı olmayabilir.
Tanımlı değilse Kütüphaneyi kullanacak arkadaş bu lcd yi kullanmayacak anlamına gelir. Boşuna derlenmesin.

#ifdef USE_LCD
  /* Clear the LCD */
  LCD_Clear(Black);

  /* Set the LCD Back Color */
  LCD_SetBackColor(Black);

  /* Set the LCD Text Color */
  LCD_SetTextColor(White);

  /* Display message on the LCD*/
  LCD_DisplayStringLine(Line0, (uint8_t*)MESSAGE1);
  LCD_DisplayStringLine(Line1, (uint8_t*)MESSAGE2);
  LCD_DisplayStringLine(Line2, (uint8_t*)MESSAGE3);
  LCD_DisplayStringLine(Line3, (uint8_t*)MESSAGE4);
#endif
}

eğer biryerlede tanımlı değilse, yukardaki kodların hiçbiri çalışmaz. (Muhtemelen boar la berebar bir kütüphane geldi. eğer lcd yi kullanmak istiyorsan tanımlama yapmalısın diyor.)

eğer bu kodlar işletiliyorsa debugda görüyorsanız Kütüphanenin *.h içeriğine bakın #define USE_LCD var mı ?

M_B

@muhittin_kaplan hocam;
aramış olduğum
main.h icinde
#define USE_LCD        /* enable LCD  */ 

tanımlı. 
Bilgilendirme icin teşekkürler.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet