亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dps2spc3.c

?? profibus通信協議
?? C
?? 第 1 頁 / 共 2 頁
字號:

/*********************************************************************

	公司名稱:	 揚州恒春電子
	模塊名	:	 Profibus DP從站接口程序 
	創建人	:	                                         
	日期	:	 2007/03/01	                                         
	功能描述:   利用ATMEG64L對SPC3進行配置,實現Profibus通訊                                
	其它說明:   編譯環境為Keil uVision2                                            
	版本	:	 V1.0

*********************************************************************/

#include "spc3dps2.h"

#define ASS_AUX_BUF    3
/*-- masks for config-data --*/


#define DPS_CFG_IS_BYTE_FORMAT          (UBYTE)0x30
#define DPS_CFG_BF_LENGTH               (UBYTE)0x0f
#define DPS_CFG_LENGTH_IS_WORD_FORMAT   (UBYTE)0x40
#define DPS_CFG_BF_INP_EXIST            (UBYTE)0x10
#define DPS_CFG_BF_OUTP_EXIST           (UBYTE)0x20
#define DPS_CFG_SF_OUTP_EXIST           (UBYTE)0x80
#define DPS_CFG_SF_INP_EXIST            (UBYTE)0x40
#define DPS_CFG_SF_LENGTH               (UBYTE)0x3f

#define SPC3_BUF_START ((UBYTE)(((UWORD)(dps2_base_ptr -\
			 (UBYTE *)&spc3)) >> 3))

   UBYTE _dps2_x;              			 /* dummy-byte */

   static DPS2_BUFINIT dps2_binit;       /* storeage for initialization data */
   static WORD dps2_buf_len = 0;         /* used bufferspace */
   //static UBYTE  *dps2_base_ptr =(UBYTE *)0; /* buffer base address */ 
   /*volatile static */UBYTE  *dps2_base_ptr=(UBYTE *)0;   /****/
   
   static DPS2_IO_DATA_LEN io_data_len;  /* Struct. f. IO-lens */
   UBYTE  OfflineFlag =0;



   /*
   +------------------------------------------------------------------------+
   | Function:   a s s i g n _ a u x _ b u f ( )                            |
   +------------------------------------------------------------------------+
   | Description:                                                           |
   |  Based on a list of bufferlens the best len of the aux-buffers is      |
   |  calculated. The list's lens will be adjusted, the assignment-list     |
   |  will be calculated.                                                   |
   +------------------------------------------------------------------------+
   | Parameters:                                                            |
   | -lens:    Pointer to a list of buffer-lens                             |
   |           The calculated lens are inserted in this list.               |
   | -count:   length of list (2 to ASS_AUX_BUF)                            |
   | -assign:  pointer to an assignment-byte                                |
   |           For each len there is a corresponding bit for the            |
   |           assignment to AUX-buffer 1 or 2. 0 means AUX-buffer 1,       |
   |           1 means AUX-Buffer 2. Bit 0 ist for the first, Bit 7         |
   |           for the 8th length.                                          |
   | -aux_len: pointer to a 2-byte-array for AUX-buffer-lens                |
   |           The calculated lens of AUX-buffer 1 and 2 are stored here.   |
   |                                                                        |
   | Returnvalue: UWORD: total amount of used bytes (0 = error)             |
   +------------------------------------------------------------------------+
   */

   UWORD assign_aux_buf(UBYTE  *lens, UBYTE count, UBYTE
    *assign, WORD  *aux_len)
   {
	  UBYTE pos[ASS_AUX_BUF];     /* storage for former position of lens    */
	  UBYTE lensx[ASS_AUX_BUF];   /* working-array for calculated lens      */
	  UBYTE step;                 /* counter for done step                  */
	  UBYTE lx;                   /* temp-var for lenarray-sorting          */
	  UBYTE px;                   /* temp-var dor position-sorting          */
	  UWORD min_len = 0xffff;     /* calculated min-len                     */
	  UBYTE min_step = 0;         /* step at reached min-len                */
	  BYTE i,j;

	  if((count < 2) || (count > ASS_AUX_BUF))
	  {
		 return 0;
	  }
	  /* init position-array */
	  for(i = 0; i < count; i++)
	  {
		 pos[i] = i;
	  }
	  /* init working-array */
	  for(i = 0; i < count; i++)
	  {
		 lensx[i] = lens[i];
	  }
	  /* round up lens to SPC3-lens (8-byte-granularity) */
	  for(i = 0; i < count; i++)
	  {
		 lensx[i] = (lensx[i] + 7) & 0xf8;
	  }
	  /* sorting of lens: gratest len to index 0 */
	  for(i = 0; i < count-1; i++)
	  {
		 for(j = i+1; j < count; j++)
		 {
			if(lensx[i] < lensx[j])
			{
			   /* greater len found */
			   lx = lensx[i];          /* xchg lens */
			   lensx[i] = lensx[j];
			   lensx[j] = lx;
			   px = pos[i];            /* xchg position */
			   pos[i] = pos[j];
			   pos[j] = px;
			}
		 }
	  }
	  /* remove NULL-lens of list */
	//           
	  for(i = count-1; i >= 0; i--)
	  {
		 if(lensx[i] == 0)
		 {
			count--;
		 }
		 if(!i)       break;
	  }
	  if(count == 0)
	  {
		 min_len = 0;     /* error: no lens specified */
	  }
	  /* stepwise assignment to the AUX-buffers */
	  for(step = 0; step < count; step++)
	  {
		 /* determine total len for AUX-buffer 1 */
		 aux_len[0] = 0;

		 for(i = step; i < count; i++)
		 {
			if(aux_len[0] < lensx[i])
			{
			   aux_len[0] = lensx[i];
			}
		 }
		 aux_len[0] = aux_len[0] * (count - step + 1);
		 /* determine total len for AUX-buffer 2 */
		 aux_len[1] = 0;

		 for(i = 0; i < step; i++)
		 {
			if(aux_len[1] < lensx[i])
			{
			   aux_len[1] = lensx[i];
			}
		 }
		 aux_len[1] = aux_len[1] * (step + 1);

		 if((aux_len[0] + aux_len[1]) < min_len)
		 {
			/* neue Minimal-Laenge gefunden */
			min_len = aux_len[0] + aux_len[1];
			min_step = step;
		 }
	  }

	  /*  calculation of len for AUX-buffer 1 */
	  aux_len[0] = 0;

	  for(i = min_step; i < count; i++)
	  {
		 if(aux_len[0] < lensx[i])
		 {
			aux_len[0] = lensx[i];
		 }
	  }
	  /*  setup lens for AUX-buffer 1 */
	  for(i = min_step; i < count; i++)
	  {
		 lens[pos[i]] = aux_len[0];
	  }
	  /*  calculation of len for AUX-buffer 2 */
	  aux_len[1] = 0;

	  for(i = 0; i < min_step; i++)
	  {
		 if(aux_len[1] < lensx[i])
		 {
			aux_len[1] = lensx[i];
		 }
	  }
	  /*  setup lens for AUX-buffer 2 */
	  /*  setup assignment-list */
	  *assign = 0;    /* initial all buffers assigned to AUX-buffer 1 */

	  for(i = 0; i < min_step; i++)
	  {
		 lens[pos[i]] = aux_len[1];
		 *assign |= 0x1 << pos[i];
	  }
	  return min_len;
   }

   /*
   +------------------------------------------------------------------------+
   | Funktion:  d p s 2 _ c a l c u l a t e _ i n p _ o u t p _ l e n       |
   +------------------------------------------------------------------------+
   | Description:                                                           |
   |  This function calculates the Input/Outputdata-lens based on the       |
   |  specified config-data and returns a pointer to the calculated lens.   |
   |  (original from DPS).                                                  |
   +------------------------------------------------------------------------+
   | parameters:                                                            |
   |  -cfg_ptr: pointer to config-data                                      |
   |  -cfg_len: config-data len                                             |
   |                                                                        |
   | returnvalue:                                                           |
   |  -pointer to lens                                                      |
   +------------------------------------------------------------------------+
   */
   DPS2_IO_DATA_LEN  *dps2_calculate_inp_outp_len (UBYTE
   * cfg_ptr, UWORD cfg_len)
   {
	  UBYTE temp_inp_data_len;
	  UBYTE temp_outp_data_len;
	  UBYTE length;
	  UBYTE count;
	  UBYTE specific_data_length;
	  UBYTE result_ok;

	  result_ok = TRUE;
	  temp_inp_data_len  = 0;
	  temp_outp_data_len = 0;

	  if ((cfg_len >  0) && (cfg_len <= dps2_binit.cfg_buf_len))
	  {
		 for ( ; (cfg_len > 0) && result_ok; cfg_len -= count)
		 {
			count = 0;

			if (*cfg_ptr & DPS_CFG_IS_BYTE_FORMAT)
			{
			   count++;

			   /* cfg_ptr points to ID-byte, CFG_BF means "CFG_IS_BYTE_FORMAT" */
			   length = (UBYTE)( (*cfg_ptr & DPS_CFG_BF_LENGTH) + 1);

			   if (*cfg_ptr & DPS_CFG_LENGTH_IS_WORD_FORMAT)
			   {
				  length *= 2;
			   }
			   if (*cfg_ptr & DPS_CFG_BF_OUTP_EXIST)
			   {
				  temp_outp_data_len = temp_outp_data_len + length;
			   }
			   if (*cfg_ptr & DPS_CFG_BF_INP_EXIST)
			   {
				  temp_inp_data_len = temp_inp_data_len + length;
			   }
			   cfg_ptr++;
			}
			else
			{
			   /* cfg_ptr points to the headerbyte of special ID-format */
			   /* CFG_SF means "CFG_IS_SPECIAL_FORMAT" */
			   if (*cfg_ptr & DPS_CFG_SF_OUTP_EXIST)
			   {
				  count++;                /* next byte contains the length of ou
										  tp_data */
				  length = (UBYTE)((*(cfg_ptr + count) & DPS_CFG_SF_LENGTH) +1
				  );

				  if (*(cfg_ptr + count) & DPS_CFG_LENGTH_IS_WORD_FORMAT)
				  {
					 temp_outp_data_len = temp_outp_data_len + (UBYTE)(2*length
					 );
				  }
				  else
				  {
					 temp_outp_data_len = temp_outp_data_len + length;
				  }
			   }
			   if (*cfg_ptr & DPS_CFG_SF_INP_EXIST)
			   {
				  count++;                /* next byte contains the length of in
										  p_data */
				  length = (UBYTE)((*(cfg_ptr + count) & DPS_CFG_SF_LENGTH) +1
				  );

				  if (*(cfg_ptr + count) & DPS_CFG_LENGTH_IS_WORD_FORMAT)
				  {
					 temp_inp_data_len = temp_inp_data_len + (UBYTE)(2*length);
				  }
				  else
				  {
					 temp_inp_data_len = temp_inp_data_len + length;
				  }
			   }
			   specific_data_length = (UBYTE)(*cfg_ptr & DPS_CFG_BF_LENGTH);

			   if (specific_data_length != 15)
			   {
				  count = (UBYTE)(count + 1 + specific_data_length);
				  cfg_ptr = cfg_ptr + count;
			   }
			   else
			   {
				  result_ok = FALSE;
			   }
			}
		 }

		 if ( (cfg_len != 0) ||
				(
				(((UWORD)temp_inp_data_len + 7) & 0xfff8 +
				((UWORD)temp_outp_data_len + 7) & 0xfff8)
				> dps2_binit.din_dout_buf_len) )
		 {
			result_ok = FALSE;
		 }
	  }
	  else
	  {
		 result_ok = FALSE;
	  }
	  if (result_ok)
	  {
		 io_data_len.inp_data_len  = temp_inp_data_len;
		 io_data_len.outp_data_len = temp_outp_data_len;
		 return (&io_data_len);
	  }
	  else
	  {
		 return ((DPS2_IO_DATA_LEN *) 0);
	  }
   }



   /*
   +------------------------------------------------------------------------+
   | Function:  d p s 2 _ b u f _ i n i t ( )                               |
   +------------------------------------------------------------------------+
   | Description:                                                           |
   |  The specified lens arechecked. If they are ok, the neccesarry         |
   |  memory is calculated. If there is enough memory, the buffers are      |
   |  armed.                                                                |
   |  In dps2_buf_len the amount of used Memory is stored.                  |
   |  The buffers are armed at the begin of the user-area in the following  |
   |  way:                                                                  |
   |   Outputdata    |  total len of the                                    |
   |   Inputdata     |   Input-/Outputbuffers * 3                           |
   |   Diagnosticbuffer (2*)                                                |
   |   Config-buffer                                                        |
   |   Read-Config-buffer                                                   |
   |   Parameterbuffer                                                      |
   |   Aux-buffer 0                                                         |
   |   Aux-buffer 1 (if used)                                               |
   |   Set-Slave-Address-buffer (if used)                                   |
   +------------------------------------------------------------------------+
   | parameters:                                                            |
   |  -b_ptr:     Pointer to start of buffer-area                           |
   |  -dps2_bptr: Pointer to initialisierungs-structure                     |
   |  -fdl_init:  TRUE, if FDL is used                                      |
   |  -spec_prm:  TRUE, if spec param-buffer is used                        |
   |                                                                        |
   | returncode:                                                            |
   |  SPC3_INIT_OK:            SPC3 initialized correctly                   |
   |  SPC3_INITF_LESS_MEM:     not enough memory                            |
   |  SPC3_INITF_NOFF:         SPC3 is not offline                          |
   |  DPS2_INITF_DIN_DOUT_LEN: allowed: 0 - 488                             |
   |  DPS2_INITF_DIAG_LEN:      - " - : 6 - 244                             |
   |  DPS2_INITF_PRM_LEN:       - " - : 7 - 244                             |
   |  DPS2_INITF_CFG_LEN:       - " - : 1 - 244                             |
   |  DPS2_INITF_SSA_LEN:       - " - : 0 bzw. 4 - 244                      |
   +------------------------------------------------------------------------+
   */

   /* position of bits in AUX-buffer-assignment */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品高清亚洲| 国产综合成人久久大片91| 日韩综合小视频| 国产成人午夜电影网| 欧美三级韩国三级日本三斤| 国产亚洲欧洲一区高清在线观看| 亚洲影院在线观看| 99国内精品久久| 久久精品欧美一区二区三区不卡 | 欧美亚洲一区二区在线观看| 久久久亚洲高清| 免费看黄色91| 欧美日韩国产精品成人| 一区二区三区免费网站| 成人一级视频在线观看| 久久综合狠狠综合久久激情 | 91麻豆精品国产91久久久久 | 欧美性视频一区二区三区| 中文无字幕一区二区三区 | 激情图区综合网| 制服视频三区第一页精品| 亚洲美女电影在线| 一本一本大道香蕉久在线精品| 国产精品久久久一本精品| 国产麻豆精品一区二区| 精品国产乱码久久久久久1区2区| 五月天欧美精品| 欧美日本韩国一区二区三区视频| 亚洲黄色av一区| 色丁香久综合在线久综合在线观看| 一色屋精品亚洲香蕉网站| 99久久精品国产观看| 综合网在线视频| 色婷婷亚洲精品| 亚洲国产日韩av| 欧美日韩一本到| 偷拍自拍另类欧美| 91精品黄色片免费大全| 美国欧美日韩国产在线播放 | 欧美伊人精品成人久久综合97| 亚洲男人的天堂在线aⅴ视频| 97久久人人超碰| 一区二区三区在线视频观看58| 色天天综合久久久久综合片| 亚洲成av人片一区二区梦乃| 91精品国产综合久久久久久久 | 男女激情视频一区| 久久久综合精品| a级精品国产片在线观看| 亚洲伦在线观看| 欧美日韩一本到| 激情图片小说一区| 亚洲欧洲日韩一区二区三区| 色88888久久久久久影院野外| 亚洲第一成人在线| 久久亚洲影视婷婷| 99久久精品国产毛片| 亚洲第一福利一区| 久久久无码精品亚洲日韩按摩| 国产69精品久久久久777| 樱花草国产18久久久久| 宅男噜噜噜66一区二区66| 国产精品996| 亚洲综合图片区| 久久久久久9999| 91官网在线免费观看| 国产最新精品精品你懂的| 日韩美女视频一区| 日韩三级精品电影久久久| 成人动漫一区二区在线| 日韩电影一区二区三区| 中文字幕亚洲电影| 欧美大片在线观看一区| 日本精品一级二级| 韩国一区二区在线观看| 一区二区三国产精华液| 久久久一区二区| 在线播放国产精品二区一二区四区| 精品一区二区三区免费| 亚洲激情图片一区| 亚洲国产精品ⅴa在线观看| 日韩一卡二卡三卡四卡| 色婷婷国产精品综合在线观看| 国产一区欧美一区| 日韩专区中文字幕一区二区| 亚洲国产精品激情在线观看| 日韩欧美色电影| 欧美日韩一区在线| 97久久精品人人做人人爽50路| 国产精品影视天天线| 日韩国产高清在线| 伊人开心综合网| 国产精品久久久久久久久久免费看| 日韩一级完整毛片| 337p亚洲精品色噜噜噜| 欧美综合视频在线观看| 99re66热这里只有精品3直播| 国产精品一区二区在线观看网站| 日韩电影一二三区| 午夜精品免费在线观看| 亚洲狠狠爱一区二区三区| 亚洲六月丁香色婷婷综合久久 | 色老头久久综合| 懂色av一区二区三区免费看| 日本欧美加勒比视频| 五月婷婷久久丁香| 亚洲成人av福利| 亚洲综合激情另类小说区| 亚洲欧美日韩久久| 亚洲三级在线播放| 亚洲精品成人a在线观看| 亚洲精品乱码久久久久久黑人 | 欧美无砖专区一中文字| 在线亚洲人成电影网站色www| 91天堂素人约啪| 91丨九色丨国产丨porny| 成人激情黄色小说| 99精品偷自拍| 色综合天天性综合| 精品视频在线免费观看| 欧美日韩不卡一区| 91精品国产综合久久久蜜臀粉嫩| 91精品国产综合久久婷婷香蕉| 日韩一区二区三区在线观看| 欧美白人最猛性xxxxx69交| 久久综合狠狠综合久久综合88| 久久免费视频色| 中文在线免费一区三区高中清不卡| 国产精品久久看| 亚洲一区二区中文在线| 日韩在线一区二区三区| 国内成人精品2018免费看| 国产精品1区2区3区| 色综合视频一区二区三区高清| 色999日韩国产欧美一区二区| 欧美色网一区二区| 精品区一区二区| 国产精品嫩草影院com| 亚洲综合色噜噜狠狠| 日韩影院在线观看| 国产精品99久久久久久久女警| 99国产精品久久久久| 欧美日本在线播放| 久久精品夜色噜噜亚洲aⅴ| 亚洲欧洲av一区二区三区久久| 亚洲综合色区另类av| 激情成人综合网| 日本乱人伦一区| 欧美sm极限捆绑bd| 亚洲婷婷综合色高清在线| 日韩成人精品在线| 国产成人精品午夜视频免费| 欧美亚洲尤物久久| 国产喷白浆一区二区三区| 亚洲欧美日韩在线| 国产最新精品精品你懂的| 在线观看av一区二区| 精品va天堂亚洲国产| 亚洲一区在线播放| 国产精品99精品久久免费| 欧美日本韩国一区二区三区视频| 精品理论电影在线观看| 亚洲精品中文在线| 国产sm精品调教视频网站| 欧美日韩中文精品| 国产精品―色哟哟| 麻豆91在线播放免费| 在线中文字幕不卡| 中文字幕欧美激情| 麻豆极品一区二区三区| 在线视频一区二区免费| 久久精品亚洲乱码伦伦中文| 日韩 欧美一区二区三区| 色综合天天综合网国产成人综合天| 欧美精品一区二区蜜臀亚洲| 天天综合天天综合色| 色综合视频一区二区三区高清| 国产欧美视频在线观看| 看片的网站亚洲| 欧美日韩在线一区二区| 亚洲男人的天堂一区二区| 成人免费av网站| 国产网红主播福利一区二区| 青草av.久久免费一区| 欧美网站大全在线观看| 日韩一区日韩二区| 成人h精品动漫一区二区三区| 精品国产三级电影在线观看| 日韩中文字幕1| 欧美精品久久一区二区三区| 亚洲午夜免费福利视频| 色噜噜夜夜夜综合网| 中文字幕一区二区三区在线观看| 国产高清在线精品| 久久精品视频免费| 国产99久久久国产精品潘金网站| 日韩欧美一级在线播放| 另类小说一区二区三区| 欧美草草影院在线视频| 激情综合网激情|