#ifdef #else #endif #fi #ifndef 的用法

本文介绍了预处理的概念及其在编译过程中的作用,并详细解释了条件编译指令的三种应用场景,包括文件包含、宏定义及如何通过条件编译控制程序功能的开关。
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。
   关于预处理命令中的文件包含(#include),宏定义(#define),书上已经有了详细的说明,在这里就不详述了。这里主要是对条件编译(#ifdef,#else,#endif,#if等)进行说明。以下分3种情况:
  1:情况1:
  #ifdef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
   这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
  例: 
  #define NUM
  .............
  .............
  .............
  #ifdef NUM
   printf("之前NUM有过定义啦!:) \n");
  #else
   printf("之前NUM没有过定义!:( \n");
  #endif
  }
   如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
   我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
  2:情况2: 
  #ifndef _XXXX 
  ...程序段1... 
  #else 
  ...程序段2... 
  #endif
   这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。
  3:情况3:
  #if 常量 
  ...程序段1...
  #else
  ...程序段2...
  #endif 
   这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。

   我认为,这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。而不要测试的时候,只要将常量变0。

我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:

  1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。

  在程序首部定义#ifdef HNLD:

  #ifdef HNLD

  #include"n166_hn.c"

  #endif

  如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。

  2.在每一个子程序前加上标记,以便追踪程序的运行。

  #ifdef DEBUG

  printf(" Now is in hunan !");

  #endif

  3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:

  #ifndef TEST

  i=dial(); 

  //程序调试运行时绕过此语句

  #else 

  i=0;

  #endif

  调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。

请作为资深开发工程师,解释我给出的代码。请逐行分析我的代码并给出你对这段代码的理解。 我给出的代码是: #include "Inc.h" volatile U8 code CusFwCompDate[9] = __DATE2__; volatile U8 code CusFwCompTime[9] = __TIME__; // ===>product string<=== U8 code iProduct[] = { 12, 0x03, 'U', 'S', 'B', ' ', 'C', 'a', 'm', 'e', 'r', 'a' }; #ifdef _UAC_EXIST_ U8 code iProduct_MIC[] = { // MID = 1111 "RTS5101-01" //LuLu S800 Audio 11, 3, 'U', 'S', 'B', ' ', 'A', 'u', 'd', 'i', 'o' }; #endif // ===>Device Descriptor<=== U8 code VideoDevDesc[18]= { DESC_SIZE_DEV, //bLength: 0x01, //USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType: 0x00, //bcdUSB version:NORM:0200H 0x02, DEV_CLS_MULTI, //bDeviceClass: -> This is a Multi-interface Function Code Device DEV_SUBCLS_COMMON, //bDeviceSubClass: -> This is the Common Class Sub Class DEV_PROTOCOL_IAD, //bDeviceProtocol: -> This is the Interface Association Descriptor protocol 0x40, //bMaxPacketSize0: = (64) Bytes _RT_VID_L_, //idVendor: = Realtek Corp. _RT_VID_H_, _5841_PID_L_, //idProduct: _5841_PID_H_, 0x00,//FW_TRUNK_VERSION%256,//_FW_SUB_VER_, //bcdDevice: 1.00 0x00,//FW_TRUNK_VERSION/256,//_FW_MAIN_VER_, I_MANUFACTURER, //iManufacturer: I_PRODUCT, //iProduct: I_SERIALNUMBER, //iSerialNumber: 0x01 //bNumConfigurations: }; void InitCustomizedVars(void ) { InitSensorGlobalVar(); // property page control enable/disable #ifdef _AF_ENABLE_ g_wCamTrmCtlSel=CT_CTL_SEL_AUTO_EXP_MODE |CT_CTL_SEL_AUTO_EXP_PRY // hemonel 2009-09-21: enable low light compensation for foxlink+HP commercial |CT_CTL_SEL_EXPOSURE_TIME_ABS //CT_CTL_SEL_EXPOSURE_TIME_REL //|CT_CTL_SEL_PANTILT_ABS //|CT_CTL_SEL_ZOOM_ABS |CT_CTL_SEL_ROLL_ABS |CT_CTL_SEL_FOCUS_ABS ; g_byCamTrmCtlSel_Ext = 0 |CT_CTL_SEL_FOCUS_AUTO #ifdef _UVC_1V5_ |CT_CTL_SEL_ROI #endif ; #else g_wCamTrmCtlSel=CT_CTL_SEL_AUTO_EXP_MODE |CT_CTL_SEL_AUTO_EXP_PRY // hemonel 2009-09-21: enable low light compensation for foxlink+HP commercial |CT_CTL_SEL_EXPOSURE_TIME_ABS //CT_CTL_SEL_EXPOSURE_TIME_REL //|CT_CTL_SEL_PANTILT_ABS //|CT_CTL_SEL_ZOOM_ABS |CT_CTL_SEL_ROLL_ABS ; #ifdef _UVC_1V5_ g_byCamTrmCtlSel_Ext = CT_CTL_SEL_ROI; #else g_byCamTrmCtlSel_Ext = 0; #endif #endif g_wProcUnitCtlSel=PU_CTL_SEL_BRIGHTNESS |PU_CTL_SEL_CONTRAST |PU_CTL_SEL_HUE |PU_CTL_SEL_SATURATION |PU_CTL_SEL_SHARPNESS |PU_CTL_SEL_GAMMA |PU_CTL_SEL_WHITE_BALANCE_TEMPERATURE //|PU_CTL_SEL_WHITE_BALANCE_COMPONENT |PU_CTL_SEL_BACKLIGHT_COMPENSATION //#ifdef _MANUAL_ET_GAIN_TEST_ |PU_CTL_SEL_GAIN //#endif |PU_CTL_SEL_POWER_LINE_FREQUENCY //|PU_CTL_SEL_HUE_AUTO |PU_CTL_SEL_WHITE_BALANCE_TEMPERATURE_AUTO //|PU_CTL_SEL_WHITE_BALANCE_COMPONENT_AUTO //|PU_CTL_SEL_DIGITAL_MULTIPLIER //|PU_CTL_SEL_DIGITAL_MULTIPLIER_LIMIT ; #if defined _UVC_REALTEK_EXTENDEDUNIT_ || defined _LENOVO_IDEA_EYE_EXTENDEDUNIT_ g_dwRtkExtUnitCtlSel = 0 #ifdef _UVC_REALTEK_EXTENDEDUNIT_ |RTK_EXT_CTL_SEL_ISP_SPECIAL_EFFECT |RTK_EXT_CTL_SEL_EVCOM |RTK_EXT_CTL_SEL_CTE |RTK_EXT_CTL_SEL_AE_LOCK |RTK_EXT_CTL_SEL_AWB_LOCK |RTK_EXT_CTL_SEL_AF_LOCK #ifdef _FLASH_LED_ENABLE_ |RTK_EXT_CTL_SEL_LED_TORCH |RTK_EXT_CTL_SEL_LED_FLASH #endif #ifdef _EXT_ISO_ENABLE_ |RTK_EXT_CTL_SEL_ISO #endif #ifdef _SCENE_MODE_ |RTK_EXT_CTL_SEL_SCENE_MODE #endif |RTK_EXT_CTL_SEL_ROI_MODE #ifndef _UVC_1V5_ |RTK_EXT_CTL_SEL_ROI #endif |RTK_EXT_CTL_SEL_3ASTS #endif #endif #ifdef _LENOVO_IDEA_EYE_EXTENDEDUNIT_ |RTK_EXT_CTL_SEL_IDEAEYE_SENSITIVITY |RTK_EXT_CTL_SEL_IDEAEYE_STATUS |RTK_EXT_CTL_SEL_IDEAEYE_MODE #endif ; // property page process unit control configure BrightnessItem.Min = CTL_MIN_PU_BRIGHTNESS;//min BrightnessItem.Max = CTL_MAX_PU_BRIGHTNESS;//max BrightnessItem.Res = CTL_RES_PU_BRIGHTNESS;//res BrightnessItem.Def = CTL_DEF_PU_BRIGHTNESS;//def BrightnessItem.Des = CTL_DEF_PU_BRIGHTNESS;//des BrightnessItem.Last = CTL_DEF_PU_BRIGHTNESS;//last ContrastItem.Min = CTL_MIN_PU_CONTRAST;//min ContrastItem.Max = CTL_MAX_PU_CONTRAST;//max ContrastItem.Res = CTL_RES_PU_CONTRAST;//res ContrastItem.Def = CTL_DEF_PU_CONTRAST;//def ContrastItem.Des = CTL_DEF_PU_CONTRAST;//des ContrastItem.Last = CTL_DEF_PU_CONTRAST;//last HueItem.Min = CTL_MIN_PU_HUE;//min HueItem.Max = CTL_MAX_PU_HUE;//max HueItem.Res = CTL_RES_PU_HUE;//res HueItem.Def = CTL_DEF_PU_HUE;//def HueItem.Des = CTL_DEF_PU_HUE;//des HueItem.Last = CTL_DEF_PU_HUE;//last SaturationItem.Min = CTL_MIN_PU_SATURATION;//min SaturationItem.Max = CTL_MAX_PU_SATURATION;//max SaturationItem.Res = CTL_RES_PU_SATURATION;//res SaturationItem.Def = CTL_DEF_PU_SATURATION;//def SaturationItem.Des = CTL_DEF_PU_SATURATION;//des SaturationItem.Last = CTL_DEF_PU_SATURATION;//last SharpnessItem.Min = CTL_MIN_PU_SHARPNESS;//min SharpnessItem.Max = CTL_MAX_PU_SHARPNESS;//max SharpnessItem.Res = CTL_RES_PU_SHARPNESS;//res SharpnessItem.Def = CTL_DEF_PU_SHARPNESS;//def SharpnessItem.Des = CTL_DEF_PU_SHARPNESS;//des SharpnessItem.Last = CTL_DEF_PU_SHARPNESS;//last GammaItem.Min = CTL_MIN_PU_GAMMA;//min GammaItem.Max = CTL_MAX_PU_GAMMA;//max GammaItem.Res = CTL_RES_PU_GAMMA;//res GammaItem.Def = CTL_DEF_PU_GAMMA;//def GammaItem.Des = CTL_DEF_PU_GAMMA;//des GammaItem.Last = CTL_DEF_PU_GAMMA;//last WhiteBalanceTempItem.Min = CTL_MIN_PU_WHITE_BALANCE_TEMPERATURE;//min WhiteBalanceTempItem.Max = CTL_MAX_PU_WHITE_BALANCE_TEMPERATURE;//max WhiteBalanceTempItem.Res = CTL_RES_PU_WHITE_BALANCE_TEMPERATURE;//res WhiteBalanceTempItem.Def = CTL_DEF_PU_WHITE_BALANCE_TEMPERATURE;//def WhiteBalanceTempItem.Des = CTL_DEF_PU_WHITE_BALANCE_TEMPERATURE;//des WhiteBalanceTempItem.Last = CTL_DEF_PU_WHITE_BALANCE_TEMPERATURE;//last // WhiteBalanceTempAutoItem.Min = 0;//min WhiteBalanceTempAutoItem.Max = 1;//max WhiteBalanceTempAutoItem.Res = 1;//res WhiteBalanceTempAutoItem.Def = 1;//def WhiteBalanceTempAutoItem.Des = 1;//des WhiteBalanceTempAutoItem.Last = 1;//last BackLightCompItem.Min = CTL_MIN_PU_BACKLIGHTCOMP;//min BackLightCompItem.Max = CTL_MAX_PU_BACKLIGHTCOMP;//max BackLightCompItem.Res = CTL_RES_PU_BACKLIGHTCOMP;//res BackLightCompItem.Def = CTL_DEF_PU_BACKLIGHTCOMP;//def BackLightCompItem.Des = CTL_DEF_PU_BACKLIGHTCOMP;//des BackLightCompItem.Last = CTL_DEF_PU_BACKLIGHTCOMP;//last GainItem.Min = CTL_MIN_PU_GAIN;//min GainItem.Max = CTL_MAX_PU_GAIN;//max GainItem.Res = CTL_RES_PU_GAIN;//res GainItem.Def = CTL_DEF_PU_GAIN;//def GainItem.Des = CTL_DEF_PU_GAIN;//des GainItem.Last = CTL_DEF_PU_GAIN;//last PwrLineFreqItem.Min = CTL_MIN_PU_PWRLINEFRQ;//min PwrLineFreqItem.Max = CTL_MAX_PU_PWRLINEFRQ;//max PwrLineFreqItem.Res = CTL_RES_PU_PWRLINEFRQ;//res PwrLineFreqItem.Def = CTL_DEF_PU_PWRLINEFRQ;//def PwrLineFreqItem.Des = CTL_DEF_PU_PWRLINEFRQ;//des PwrLineFreqItem.Last = CTL_DEF_PU_PWRLINEFRQ;//last // property page camera terminal control configure ExposureTimeAbsolutItem.Min = CTL_MIN_CT_EXPOSURE_TIME_ABSOLUTE;//min ExposureTimeAbsolutItem.Max = CTL_MAX_CT_EXPOSURE_TIME_ABSOLUTE;//max ExposureTimeAbsolutItem.Res = CTL_RES_CT_EXPOSURE_TIME_ABSOLUTE;//res ExposureTimeAbsolutItem.Def = CTL_DEF_CT_EXPOSURE_TIME_ABSOLUTE;//def ExposureTimeAbsolutItem.Des = CTL_DEF_CT_EXPOSURE_TIME_ABSOLUTE;//des ExposureTimeAbsolutItem.Last = CTL_DEF_CT_EXPOSURE_TIME_ABSOLUTE;//last // ExposureTimeAutoItem.Min = 0;//min ExposureTimeAutoItem.Max = 1;//max ExposureTimeAutoItem.Res = EXPOSURE_TIME_AUTO_MOD_MANUAL |EXPOSURE_TIME_AUTO_MOD_APERTPRO;//res ExposureTimeAutoItem.Def = EXPOSURE_TIME_AUTO_MOD_APERTPRO;//def ExposureTimeAutoItem.Des = EXPOSURE_TIME_AUTO_MOD_APERTPRO;//des ExposureTimeAutoItem.Last = EXPOSURE_TIME_AUTO_MOD_APERTPRO;//last LowLightCompItem.Min = CTL_MIN_PU_LOWLIGHTCOMP;//min LowLightCompItem.Max = CTL_MAX_PU_LOWLIGHTCOMP;//max LowLightCompItem.Res = CTL_RES_PU_LOWLIGHTCOMP;//res LowLightCompItem.Def = CTL_DEF_PU_LOWLIGHTCOMP;//def LowLightCompItem.Des = CTL_DEF_PU_LOWLIGHTCOMP;//des LowLightCompItem.Last = CTL_DEF_PU_LOWLIGHTCOMP;//last PanItem.Min = CTL_MIN_PU_PAN;//min PanItem.Max = CTL_MAX_PU_PAN;//max PanItem.Res = CTL_RES_PU_PAN;//res PanItem.Def = CTL_DEF_PU_PAN;//def PanItem.Des = CTL_DEF_PU_PAN;//des PanItem.Last = CTL_DEF_PU_PAN;//last TiltItem.Min = CTL_MIN_PU_TILT;//min TiltItem.Max = CTL_MAX_PU_TILT;//max TiltItem.Res = CTL_RES_PU_TILT;//res TiltItem.Def = CTL_DEF_PU_TILT;//def TiltItem.Des = CTL_DEF_PU_TILT;//des TiltItem.Last = CTL_DEF_PU_TILT;//last ZoomItem.Min = CTL_MIN_PU_ZOOM;//min ZoomItem.Max = CTL_MAX_PU_ZOOM;//max ZoomItem.Res = CTL_RES_PU_ZOOM;//res ZoomItem.Def = CTL_DEF_PU_ZOOM;//def ZoomItem.Des = CTL_DEF_PU_ZOOM;//des ZoomItem.Last = CTL_DEF_PU_ZOOM;//last RollItem.Min = CTL_MIN_PU_ROLL;//min RollItem.Max = CTL_MAX_PU_ROLL;//max RollItem.Res = CTL_RES_PU_ROLL;//res RollItem.Def = CTL_DEF_PU_ROLL;//def RollItem.Des = CTL_DEF_PU_ROLL;//des RollItem.Last = CTL_DEF_PU_ROLL;//last #ifdef _AF_ENABLE_ FocusAbsolutItem.Min = CTL_MIN_CT_FOCUS_ABSOLUTE;//min FocusAbsolutItem.Max = CTL_MAX_CT_FOCUS_ABSOLUTE;//max FocusAbsolutItem.Res = CTL_RES_CT_FOCUS_ABSOLUTE;//res FocusAbsolutItem.Def = CTL_DEF_CT_FOCUS_ABSOLUTE;//def FocusAbsolutItem.Des = CTL_DEF_CT_FOCUS_ABSOLUTE;//des FocusAbsolutItem.Last = CTL_DEF_CT_FOCUS_ABSOLUTE;//last FocusAutoItem.Min = CTL_MIN_CT_FOCUS_AUTO;//min FocusAutoItem.Max = CTL_MAX_CT_FOCUS_AUTO;//max FocusAutoItem.Res = CTL_RES_CT_FOCUS_AUTO;//res FocusAutoItem.Def = CTL_DEF_CT_FOCUS_AUTO;//def FocusAutoItem.Des = CTL_DEF_CT_FOCUS_AUTO;//des FocusAutoItem.Last = CTL_DEF_CT_FOCUS_AUTO;//last #endif // vendor property page control configure TCorrectionItem.Min = CTL_MIN_EXTU_TRAPEZIUMCORRECTION;//min TCorrectionItem.Max = CTL_MAX_EXTU_TRAPEZIUMCORRECTION;//max TCorrectionItem.Res = CTL_RES_EXTU_TRAPEZIUMCORRECTION;//res TCorrectionItem.Def = CTL_DEF_EXTU_TRAPEZIUMCORRECTION;//def TCorrectionItem.Des = CTL_DEF_EXTU_TRAPEZIUMCORRECTION;//des TCorrectionItem.Last = CTL_DEF_EXTU_TRAPEZIUMCORRECTION;//last #ifdef _UVC_REALTEK_EXTENDEDUNIT_ // RtkExtISPSpecialEffectItem.Min = 0;//min RtkExtISPSpecialEffectItem.Max = CTL_MAX_RTKEXT_SPECIALEFFECT;//max RtkExtISPSpecialEffectItem.Res = 0;//res RtkExtISPSpecialEffectItem.Def = CTL_DEF_RTKEXT_SPECIALEFFECT;//def RtkExtISPSpecialEffectItem.Des = CTL_DEF_RTKEXT_SPECIALEFFECT;//des RtkExtISPSpecialEffectItem.Last = CTL_DEF_RTKEXT_SPECIALEFFECT;//last RtkExtEVCompensationItem.Min = CTL_MIN_RTKEXT_EVCOMP;//min RtkExtEVCompensationItem.Max = CTL_MAX_RTKEXT_EVCOMP;//max RtkExtEVCompensationItem.Res = CTL_RES_RTKEXT_EVCOMP;//res RtkExtEVCompensationItem.Def = CTL_DEF_RTKEXT_EVCOMP;//def RtkExtEVCompensationItem.Des = CTL_DEF_RTKEXT_EVCOMP;//des RtkExtEVCompensationItem.Last = CTL_DEF_RTKEXT_EVCOMP;//last #ifdef _EXT_ISO_ENABLE_ RtkExtISOItem.Min = CTL_MIN_RTKEXT_ISO;//min RtkExtISOItem.Max = CTL_MAX_RTKEXT_ISO;//max RtkExtISOItem.Res = CTL_RES_RTKEXT_ISO;//res RtkExtISOItem.Def = CTL_DEF_RTKEXT_ISO;//def RtkExtISOItem.Des = CTL_DEF_RTKEXT_ISO;//des RtkExtISOItem.Last = CTL_DEF_RTKEXT_ISO;//last #endif #ifdef _SCENE_MODE_ RtkExtSceneModeItem.Min = SCENEMODE_AUTO;//min RtkExtSceneModeItem.Max = SCENEMODE_AUTO |SCENEMODE_MACRO //|SCENEMODE_PORTRAIT |SCENEMODE_SPORT |SCENEMODE_SNOW //|SCENEMODE_NIGHT |SCENEMODE_BEACH |SCENEMODE_SUNSET |SCENEMODE_CANDLELIGHT |SCENEMODE_LANDSCAPE //|SCENEMODE_NIGHTPORTRAIT |SCENEMODE_BACKLIT //|SCENEMODE_MANUAL ;//max RtkExtSceneModeItem.Res = SCENEMODE_AUTO;//res RtkExtSceneModeItem.Def = SCENEMODE_AUTO;//def RtkExtSceneModeItem.Des = SCENEMODE_AUTO;//des RtkExtSceneModeItem.Last = SCENEMODE_AUTO;//last #endif RtkExtROIModeItem.Min = CTL_MIN_RTKEXT_ROIMODE;//min RtkExtROIModeItem.Max = CTL_MAX_RTKEXT_ROIMODE;//max RtkExtROIModeItem.Res = CTL_RES_RTKEXT_ROIMODE;//res RtkExtROIModeItem.Def = CTL_DEF_RTKEXT_ROIMODE;//def RtkExtROIModeItem.Des = CTL_DEF_RTKEXT_ROIMODE;//des RtkExtROIModeItem.Last = CTL_DEF_RTKEXT_ROIMODE;//last #endif #if ((defined _UVC_REALTEK_EXTENDEDUNIT_) || (defined _UVC_1V5_)) ROIItem.Max.bmAutoControls = CTL_MAX_RTKEXT_ROI_AUTOFUNCTION; #endif g_bySnrImgDir = 0; } void SetBkBrightness(S8 sbySetValue) { #ifdef _LENOVO_JAPAN_PROPERTY_PAGE_ XBYTE[ISP_Y_OFFSET] = sbySetValue - 128; #else XBYTE[ISP_Y_OFFSET] = (U8)sbySetValue; #endif } void SetBkContrast(U8 bySetValue) { #ifdef _LENOVO_JAPAN_PROPERTY_PAGE_ U8 contrast; if (bySetValue >= ContrastItem.Def) { contrast = LinearIntp_Byte(ContrastItem.Def, CTL_DEF_PU_CONTRAST_STANDARD, ContrastItem.Max, CTL_MAX_PU_CONTRAST_STANDARD, bySetValue); } else { contrast = LinearIntp_Byte(ContrastItem.Def, CTL_DEF_PU_CONTRAST_STANDARD, ContrastItem.Min, CTL_MIN_PU_CONTRAST_STANDARD, bySetValue); } if(contrast >= CTL_DEF_PU_CONTRAST_STANDARD) { XBYTE[ISP_CONTRAST] = LinearIntp_Byte(CTL_DEF_PU_CONTRAST_STANDARD, g_byContrast_Def, CTL_MAX_PU_CONTRAST_STANDARD, 80, contrast); } else { XBYTE[ISP_CONTRAST] = LinearIntp_Byte(CTL_DEF_PU_CONTRAST_STANDARD, g_byContrast_Def, CTL_MIN_PU_CONTRAST_STANDARD, 16, contrast); } #else //heonel 2010-06-22 follow Dell V0.11 if(bySetValue >= 0x20) { XBYTE[ISP_CONTRAST] = LinearIntp_Byte(0x20, 0x20, ContrastItem.Max, 80, bySetValue); } else { XBYTE[ISP_CONTRAST] = LinearIntp_Byte(ContrastItem.Min, 16,0x20, 0x20, bySetValue); } #endif } void SetBkSaturation(U8 bySetValue) { U8 byTemp; #ifdef _LOWLIGHT_DYN_SATURATION_ bySetValue = (U8)(((U16)g_byCurSaturationRatio*bySetValue)>>7); #endif //heonel 2010-06-22 follow Dell V0.11 if(bySetValue >= 0x40) { byTemp = LinearIntp_Byte(0x40, 0x40, SaturationItem.Max, 255, bySetValue); } else { byTemp = LinearIntp_Byte(SaturationItem.Min, 0,0x40, 0x40, bySetValue); } XBYTE[ISP_U_GAIN] = byTemp; XBYTE[ISP_V_GAIN] = byTemp; #ifdef _DARK_MODE_ENABLE_ g_byLastUGain = XBYTE[ISP_U_GAIN]; g_byLastVGain = XBYTE[ISP_V_GAIN]; #endif } void SetBkHue (S16 swSetValue) { SetBkHueRT(swSetValue); } void SetGainParam(U16 wGain) { #ifdef _AF_STAT_I2C_OUT_ if (CUSFUNCA_AFI2COUT_EN == (g_byCusFuncAEn&CUSFUNCA_AFI2COUT_EN)) { VCM_Write_PATH(wGain); } else #endif { #ifdef _SENSOR_GAIN_EN_ SetSensorGain(wGain); #else if(wGain >= 64) { XBYTE[ISP_Y_GAIN] = LinearIntp_Byte_Bound(64, 0x80, GainItem.Max, 0xE0, wGain); } else { XBYTE[ISP_Y_GAIN] = LinearIntp_Byte_Bound(GainItem.Min, 0x40, 64, 0x80, wGain); } #ifdef _DARK_MODE_ENABLE_ g_byLastYGain = XBYTE[ISP_Y_GAIN]; #endif #endif } } #ifdef _LENOVO_JAPAN_PROPERTY_PAGE_ U8 MappingSharpness(U8 bySetValue, U8 byDef) { U8 bysharpness; if(bySetValue >= SharpnessItem.Def) { bysharpness = LinearIntp_Byte(SharpnessItem.Def, CTL_DEF_PU_SHARPNESS_STANDARD, SharpnessItem.Max, CTL_MAX_PU_SHARPNESS_STANDARD, bySetValue); } else { bysharpness = LinearIntp_Byte(SharpnessItem.Def, CTL_DEF_PU_SHARPNESS_STANDARD, SharpnessItem.Min, CTL_MIN_PU_SHARPNESS_STANDARD, bySetValue); } if(bySetValue >= CTL_DEF_PU_SHARPNESS_STANDARD) { bysharpness = LinearIntp_Byte(CTL_DEF_PU_SHARPNESS_STANDARD, byDef, CTL_MAX_PU_SHARPNESS_STANDARD, 255, bysharpness); } else { bysharpness = LinearIntp_Byte(CTL_DEF_PU_SHARPNESS_STANDARD, byDef, CTL_MIN_PU_SHARPNESS_STANDARD, 0, bysharpness); } return bysharpness; } #endif void SetGammaParam(U16 wSetValue) //bydir =0: normarl dir; 1: from lowlux to normal; 2: from noamal to lowlux { U8 i; U16 wX2, wY2; static U8 code gc_byYgammaMax[16]= {0,8,16,45,61,73,84,93,102,118,133,146,159,182,204,224}; // y = x^0.6 // Y gamma: y=x {0,8,16,24,32,40,48,56,64,80,96,112,128,160,192,224}; static U8 code gc_byYgammaMin[16]= {0,8,16,17,19,22,26,31,36,47,61,76,93,131,175,224}; // y=x^1.6 #ifdef _LENOVO_JAPAN_PROPERTY_PAGE_ U16 gamma; if (wSetValue>=GammaItem.Def) { gamma = LinearIntp_Word(GammaItem.Def, CTL_DEF_PU_GAMMA_STANDARD, GammaItem.Max, CTL_MAX_PU_GAMMA_STANDARD, wSetValue); } else { gamma = LinearIntp_Word(GammaItem.Def, CTL_DEF_PU_GAMMA_STANDARD, GammaItem.Min, CTL_MIN_PU_GAMMA_STANDARD, wSetValue); } for(i =0; i<16; i++) { if(gamma > CTL_DEF_PU_GAMMA_STANDARD) { wX2 = CTL_MAX_PU_GAMMA_STANDARD; wY2 = gc_byYgammaMax[i]; } else if (gamma < CTL_DEF_PU_GAMMA_STANDARD) { wX2 = CTL_MIN_PU_GAMMA_STANDARD; wY2 = gc_byYgammaMin[i]; } else { wX2 = CTL_MIN_PU_GAMMA_STANDARD; wY2 = gc_byYgammaMin[i]; } XBYTE[ISP_YGAMMA_P0+i] = ClipWord(LinearIntp_Word(CTL_DEF_PU_GAMMA_STANDARD, g_Ygamma[i], wX2, wY2, gamma), 0, 255); } #else for(i =0; i<16; i++) { if(wSetValue > GammaItem.Def) { wX2 = GammaItem.Max; wY2 = gc_byYgammaMax[i]; } else if (wSetValue < GammaItem.Def) { wX2 = GammaItem.Min; wY2 = gc_byYgammaMin[i]; } else { if (GammaItem.Def == GammaItem.Min) { wX2 = GammaItem.Max; wY2 = gc_byYgammaMax[i]; } else { wX2 = GammaItem.Min; wY2 = gc_byYgammaMin[i]; } } XBYTE[ISP_YGAMMA_P0+i] = ClipWord(LinearIntp_Word(GammaItem.Def, g_Ygamma[i], wX2, wY2, wSetValue), 0, 255); } #endif XBYTE[ISP_YGAMMA_SYNC] = 1; }
10-11
/************************* 下方是硬件宏开关 ****************************** */ //CAMERA_TYPE_MACRO_IS_DEFINED是makefile中定义的宏,面阵和线扫相机型号宏定义被写入到一个sh文件中,makefile读取这个文件中开启的宏开关进行编译 #ifndef CAMERA_TYPE_MACRO_IS_DEFINED /*面阵部分*/ //#define CAM_ZYNQ_200W //#define CAM_ZYNQ_1000W // #define CAM_ZYNQ_1200W #define CAM_ZYNQ_2000W //#define CAM_ZYNQ_1800W //#define CAM_ZYNQ_1200W_V1 /*线扫部分*/ //#define CAM_ZYNQ_4KLINE_S0 //#define CAM_ZYNQ_4KLINE_S1 //#define CAM_ZYNQ_8KLINE_S0 //#define CAM_ZYNQ_8KLINE_S1 //#define CAM_ZYNQ_8KLINE_S0_AF #endif #if (defined CAM_ZYNQ_8KLINE_S0) || (defined CAM_ZYNQ_8KLINE_S1) #define CAM_ZYNQ_8KLINE #endif #if (defined CAM_ZYNQ_4KLINE_S0) || (defined CAM_ZYNQ_4KLINE_S1) #define CAM_ZYNQ_4KLINE #endif #if (defined CAM_ZYNQ_1200W) || (defined CAM_ZYNQ_1000W) || (defined CAM_ZYNQ_200W) || defined(CAM_ZYNQ_4KLINE_S0) || defined(CAM_ZYNQ_8KLINE_S0)||defined(CAM_ZYNQ_8KLINE_S0_AF) #define CCD_VENDOR_E2V #elif (defined CAM_ZYNQ_2000W) || (defined CAM_ZYNQ_1200W_V1) #define CCD_VENDOR_SONY #endif /************************* 下方是应用功能宏开关 ****************************** */ #ifdef CAM_ZYNQ_8KLINE_S0_AF #define CAM_ZYNQ_8KLINE_S0 #define USE_AUTO_FOCUS #endif #ifdef CAM_ZYNQ_8KLINE_S0_AF #define WORK_SLAVE_NET_PORT_SEND_SCANEND #else #define WORK_SLAVE_NET_PORT_SEND_EDGE_SIGNAL #endif #if (defined CAM_ZYNQ_8KLINE) || (defined CAM_ZYNQ_4KLINE) #define CAM_LINE #define EDGE_SIGNAL #endif #if defined(CAM_ZYNQ_8KLINE) || defined(CAM_ZYNQ_2000W) ||defined (CAM_ZYNQ_1200W_V1) || defined (CAM_ZYNQ_4KLINE) || defined (CAM_ZYNQ_1000W) || defined (CAM_ZYNQ_1200W)||defined(CAM_ZYNQ_200W)|| defined(CAM_ZYNQ_1800W) #define PL_BUF_NO_COPY #define PL_NEW_MULTI_BUF_AND_SLICE #endif #if defined(CAM_ZYNQ_2000W) || defined(CAM_ZYNQ_1200W_V1)|| defined(CAM_ZYNQ_1200W)|| defined(CAM_ZYNQ_1000W)|| defined(CAM_ZYNQ_200W) || defined(CAM_ZYNQ_1800W) #define NEW_LED_CTRL_WITH_LIGHT_ADJUST #endif #if (defined(CAM_ZYNQ_8KLINE) && !defined(CAM_ZYNQ_8KLINE_S0_AF))||defined(CAM_ZYNQ_4KLINE_S1) #define NEW_LED_CTRL_WITH_LIGHT_ADJUST #define NOT_SUPPORT_LED_ALWAYS_ON_AND_LIMIT #endif 我需要将硬件宏与功能宏彻底解耦,但又不影响应用层的代码结构。比如功能宏都是依据硬件宏来判断是否打开,外部调用的代码依据功能宏是否打开来决定是否编译。我现在想让功能宏与硬件宏分离,应用层不暴露硬件宏。全部使用接口替换硬件宏的话太麻烦,是否可以将功能宏转移到sh文件中,再让makefile在编译前的预处理阶段获取硬件宏并判断是否开启某个或者某几个功能宏,工程不变依旧使用功能宏开关来决定是否打开某段代码?如果可以具体如何操作,以我发的示例代码为例展示说明。如果不行,那给我一个可以满足我需求的方案。
最新发布
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值