update/select也可能产生buffer busy waits。

本文通过实验演示了在Oracle数据库中update与select操作如何产生buffer busy waits,并详细解释了其背后的原因,包括查询进程如何处理正在被修改的数据块以及回滚段的争用问题。
update/select也可能产生buffer busy waits。

创建一个表,然后让一个进程去更新,10个进程去查询,也会产生buffer busy wait.
create table bfw_test(id char(1000));
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
insert into bfw_test select ' ' from dba_objects;
COMMIT;
var job_no number
begin
for idx in 1 .. 20 loop
dbms_job.submit(:job_no,'bfw_do_select;');
end loop;
commit;
end;
/
CREATE OR REPLACE PROCEDURE bfw_do_select
IS
BEGIN
FOR x IN ( SELECT t1.id AS id1 ,t2.id AS id2
FROM bfw_test t1,bfw_test t2 WHERE ROWNUM<50000) LOOP
NULL;
END LOOP;
END;
/
CREATE OR REPLACE PROCEDURE bfw_do_update
IS
BEGIN
UPDATE bfw_test SET id=' ';
END;
/

var job_no NUMBER
BEGIN
Dbms_Job.submit(:job_no,'bfw_do_update;');
COMMIT;
FOR idx IN 1 .. 10 LOOP
Dbms_Job.submit(:job_no,'bfw_do_select;');
END LOOP;
COMMIT;
END;
/
ALTER SESSION SET EVENTS '10046 trace name context forever,level 12';
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
EXEC bfw_do_select;
ALTER SESSION SET EVENTS '10046 trace name context off';


grep 'buffer busy waits' crmgsb_ora_28937.trc
WAIT #4: nam='buffer busy waits' ela= 7952 file#=27 block#=177182 class#=70 obj#=0 tim=1291601461099090
WAIT #5: nam='buffer busy waits' ela= 13 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461343589
WAIT #5: nam='buffer busy waits' ela= 19 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461344171
WAIT #5: nam='buffer busy waits' ela= 12 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461345032
WAIT #5: nam='buffer busy waits' ela= 21 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461345321
WAIT #5: nam='buffer busy waits' ela= 12 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461345871
WAIT #5: nam='buffer busy waits' ela= 7 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461346544
WAIT #5: nam='buffer busy waits' ela= 22 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461347506
WAIT #5: nam='buffer busy waits' ela= 11 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461350077
WAIT #5: nam='buffer busy waits' ela= 12 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461353383
WAIT #5: nam='buffer busy waits' ela= 28 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461353833
WAIT #5: nam='buffer busy waits' ela= 9 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461354845
WAIT #5: nam='buffer busy waits' ela= 24 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461355967
WAIT #5: nam='buffer busy waits' ela= 20 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461357634
WAIT #5: nam='buffer busy waits' ela= 8 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461358110
WAIT #5: nam='buffer busy waits' ela= 16 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461358692
WAIT #5: nam='buffer busy waits' ela= 19 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461359301
WAIT #5: nam='buffer busy waits' ela= 14 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461359907
WAIT #5: nam='buffer busy waits' ela= 9 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461362439
WAIT #5: nam='buffer busy waits' ela= 7 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461362856
WAIT #5: nam='buffer busy waits' ela= 9 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461363378
WAIT #5: nam='buffer busy waits' ela= 19 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461363971
WAIT #5: nam='buffer busy waits' ela= 23 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461364313
WAIT #5: nam='buffer busy waits' ela= 7 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461364533
WAIT #5: nam='buffer busy waits' ela= 18 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461366256
WAIT #5: nam='buffer busy waits' ela= 17 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461366781
WAIT #5: nam='buffer busy waits' ela= 21 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461368419
WAIT #5: nam='buffer busy waits' ela= 16 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461368648
WAIT #5: nam='buffer busy waits' ela= 18 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461369445
WAIT #5: nam='buffer busy waits' ela= 16 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461370238
WAIT #5: nam='buffer busy waits' ela= 10 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461372504
WAIT #5: nam='buffer busy waits' ela= 19 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461372831
WAIT #5: nam='buffer busy waits' ela= 13 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461373058
WAIT #5: nam='buffer busy waits' ela= 26 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461373312
WAIT #5: nam='buffer busy waits' ela= 18 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461373845
WAIT #5: nam='buffer busy waits' ela= 17 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461373949
WAIT #5: nam='buffer busy waits' ela= 27 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461374313
WAIT #5: nam='buffer busy waits' ela= 21 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461374828
WAIT #5: nam='buffer busy waits' ela= 18 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461375556
WAIT #5: nam='buffer busy waits' ela= 15 file#=22 block#=40097 class#=69 obj#=0 tim=1291601461375975

查看块的类别:

1 Data block


2 sort block


3 save undo block


4 segment header


5 save undo header


7
extend map


8 lst level bmb


9 2nd level bmb


10 3rd level bmb


11 bitmap block


12 bitmap index block


13 file header block


14 unused


15+2*r undo header block(r=undo segment的编号)


16+2*r undo block(r=undo segment编号)




等待时间里class的列别都是回滚段的。
那什么时候select /update也会出现buffer busy waits呢?分两种情况:

1)查询进程如果发现数据块正在被修改,那么就会根据回滚段去构造CR块,而不是去产生buffer busy waits.
2)修改进程为了保存前镜像(updte语句),正在修改回滚段头或回滚段块,这个时候查询进程发现块被修改,那么需要去构造CR块,也需要去查询回滚段头和回滚段块。我们知道数据块可以根据回滚段的信息构造出CR块,但是回滚段块呢?,当一个进程正在对回滚段进行修改时候,另一个进程想查询,也会构造CR吗?不会的。这个时候只能等待,因此会产生回滚段争用导致的buffer busy waits。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-681025/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22034023/viewspace-681025/

/***************************************************************************//** * @file AD7190.c * @brief Implementation of AD7190 Driver. * @author DNechita (Dan.Nechita@analog.com) ******************************************************************************** * Copyright 2012(c) Analog Devices, Inc. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * - Neither the name of Analog Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * - The use of this software may or may not infringe the patent rights * of one or more patent holders. This license does not release you * from the requirement that you obtain separate licenses from these * patent holders to use this software. * - Use of the software either in source or binary form, must be run * on or directly connected to an Analog Devices Inc. component. * * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************** * SVN Revision: 903 *******************************************************************************/ /******************************************************************************/ /***************************** Include Files **********************************/ /******************************************************************************/ #include "AD7190.h" #include "bsp_cpu.h" extern void SPI_INS_CS(U1 Enable); static void AD7190_SetRegisterValue( U1 registerAddress, U1* registerValue, U1 bytesNumber); static U4 AD7190_GetRegisterValue(unsigned char registerAddress, unsigned char bytesNumber); /***************************************************************************//** * @brief Checks if the AD7190 part is present. * * @return status - Indicates if the part is present or not. *******************************************************************************/ U1 AD7190_Init(void) { U1 status = 1; U1 regVal = 0; U1 AD_waiting_cnt = 0; U1 registerValue[4]; if(ERR_OK == ad7190_comm_Pend()) { AD7190_Write_byte(0xff); AD7190_Write_byte(0xff); AD7190_Write_byte(0xff); AD7190_Write_byte(0xff); AD7190_Write_byte(0xff); regVal = (U1)AD7190_GetRegisterValue(AD7190_REG_ID, 1); if( (regVal & AD7190_ID_MASK) != ID_AD7190) { status = 0; } registerValue[0] = 0x00; /*斩波使能, REFIN1+与REFIN1-之间施加外部基准*/ registerValue[1] = 0x90; /*选择AIN1(+) 与AIN2(-)和AIN3(+) 与AIN4(-)*/ registerValue[2] = 0x10; /*使能基准电压检测,无输入缓冲,current关闭,gain =1, 双极性 */ AD7190_SetRegisterValue(AD7190_REG_CONF, registerValue, 3); registerValue[0] = 0x88; /*内部0校准,内部时钟*/ registerValue[1] = 0x00; registerValue[2] = 0x01; AD7190_SetRegisterValue(AD7190_REG_MODE, registerValue, 3); registerValue[0] = 0xa8; /*Internal full-scale calibration Model*/ registerValue[1] = 0x00; registerValue[2] = 0x01; AD7190_SetRegisterValue(AD7190_REG_MODE, registerValue, 3); registerValue[0] = 0x18; /*状态一起传,连续转换模式 */ registerValue[1] = 0x00; registerValue[2] = 0x60; /*控制输出数据速率*/ AD7190_SetRegisterValue(AD7190_REG_MODE, registerValue, 3); SPI_INS_CS(0); SPI_INS_CS(0); SPI_INS_CS(0); AD7190_WaitRdyGoLow(); AD7190_GetRegisterValue(AD7190_REG_DATA, 4); #if 0 registerValue[0] = 0x68; /*省电模式 */ registerValue[1] = 0x00; registerValue[2] = 0x60; AD7190_SetRegisterValue(AD7190_REG_MODE, registerValue, 3); #endif ad7190_comm_Post(); } else { /*error*/ } return status ; } void AD7190_SingleTransfer(void) { U1 registerValue[4]; if(ERR_OK == ad7190_comm_Pend()) { OSTimeDly(1); registerValue[0] = 0x38; /*状态一起传,单次转换模式 */ registerValue[1] = 0x00; registerValue[2] = 0x60; /*控制输出数据速率*/ SPI_INS_CS(0); AD7190_SetRegisterValue(AD7190_REG_MODE, registerValue, 3); AD7190_WaitRdyGoLow(); AD7190_GetRegisterValue(AD7190_REG_DATA, 4); SPI_INS_CS(1); ad7190_comm_Post(); } else { } } /***************************************************************************//** * @brief Waits for RDY pin to go low. * * @return none. *******************************************************************************/ void AD7190_WaitRdyGoLow(void) { unsigned long timeOutCnt = 0x1FFF; while((AD7190_RDY_STATE != 0) && timeOutCnt--) { ; } } #if 0 /***************************************************************************//** * @brief Selects the channel to be enabled. * * @param channel - Selects a channel. * * @return none. *******************************************************************************/ void AD7190_ChannelSelect(unsigned short channel) { unsigned long newRegValue = 0x0; newRegValue = AD7190_CONF_CHAN(1 << channel); /*AD7190_SetRegisterValue(AD7190_REG_CONF, newRegValue, 3); */ } /***************************************************************************//** * @brief Performs the given calibration to the specified channel. * * @param mode - Calibration type. * @param channel - Channel to be calibrated. * * @return none. *******************************************************************************/ void AD7190_Calibrate(unsigned char mode, unsigned char channel) { unsigned long oldRegValue = 0x0; unsigned long newRegValue = 0x0; AD7190_ChannelSelect(channel); oldRegValue = AD7190_GetRegisterValue(AD7190_REG_MODE, 3); oldRegValue &= ~(AD7190_MODE_SEL(0x7)); newRegValue = oldRegValue | AD7190_MODE_SEL(mode); /*AD7190_SetRegisterValue(AD7190_REG_MODE, newRegValue, 3);*/ AD7190_WaitRdyGoLow(); } #endif /***************************************************************************//** * @brief Read data from temperature sensor and converts it to Celsius degrees. * * @return temperature - Celsius degrees. *******************************************************************************/ U4 AD7190_AdRead(void) { U4 dataReg = 0xFFFFFFFF; if(ERR_OK == ad7190_comm_Pend()) { SPI_INS_CS(0); AD7190_WaitRdyGoLow(); dataReg = AD7190_GetRegisterValue(AD7190_REG_DATA, 4); SPI_INS_CS(1); ad7190_comm_Post(); if((dataReg & 0xEF) == 0x04) { dataReg = dataReg>>8; } else if((dataReg & 0xEF) == 0x07) { dataReg = (dataReg>>8); dataReg = dataReg+0x80000000; } else { dataReg = 0xFFFFFFFF; } } else { } return dataReg; } /***************************************************************************//** * @brief Writes data into a register. * * @param registerAddress - Address of the register. * @param registerValue - Data value to write. * @param bytesNumber - Number of bytes to be written. * @param modifyCS - Allows Chip Select to be modified. * * @return none. *******************************************************************************/ static void AD7190_SetRegisterValue( U1 registerAddress, U1* registerValue, U1 bytesNumber) { U1 tu1_i = 0; U1 writeCommand[5] = {0, 0, 0, 0, 0}; U1* dataPointer = registerValue + bytesNumber - 1; writeCommand[0] = AD7190_COMM_WRITE | AD7190_COMM_ADDR(registerAddress); for ( tu1_i = 0; tu1_i < bytesNumber; tu1_i++ ) { writeCommand[bytesNumber-tu1_i] = *dataPointer; dataPointer --; } AD7190_Write(AD7190_SLAVE_ID, writeCommand, (U2)bytesNumber+1); } /***************************************************************************//** * @brief Reads the value of a register. * * @param registerAddress - Address of the register. * @param bytesNumber - Number of bytes that will be read. * @param modifyCS - Allows Chip Select to be modified. * * @return buffer - Value of the register. *******************************************************************************/ static U4 AD7190_GetRegisterValue(unsigned char registerAddress, unsigned char bytesNumber) { unsigned char registerWord[5] = {0, 0, 0, 0, 0}; unsigned long buffer = 0x0; unsigned char i = 0; registerWord[0] = AD7190_COMM_READ | AD7190_COMM_ADDR(registerAddress); AD7190_Read(registerWord, bytesNumber); for(i = 0; i < bytesNumber; i++) { buffer = (buffer << 8) + registerWord[i]; } return buffer; } /***************************************************************************//** * @file AD7190.h * @brief Header file of AD7190 Driver. * @author DNechita (Dan.Nechita@analog.com) ******************************************************************************** * Copyright 2012(c) Analog Devices, Inc. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * - Neither the name of Analog Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * - The use of this software may or may not infringe the patent rights * of one or more patent holders. This license does not release you * from the requirement that you obtain separate licenses from these * patent holders to use this software. * - Use of the software either in source or binary form, must be run * on or directly connected to an Analog Devices Inc. component. * * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************** * SVN Revision: 903 *******************************************************************************/ #ifndef __AD7190_H__ #define __AD7190_H__ /******************************************************************************/ /***************************** Include Files **********************************/ /******************************************************************************/ #include "includes.h" #include "bsp_cfg.h" #include "Config.h" /******************************************************************************/ /******************************** AD7190 **************************************/ /******************************************************************************/ /* SPI slave device ID */ #define AD7190_SLAVE_ID 1 #if (APP_HW_VERSION_AB802_0_0 != APP_HW_VERSION) /* AD7190 GPIO */ #define AD7190_RDY_STATE (GPIO_GetVal(PIN_SPI0_MISO)) #else /* AD7190 GPIO */ #define AD7190_RDY_STATE (GPIO_GetVal(PIN_SPI2_MISO)) #endif /* AD7190 Register Map */ #define AD7190_REG_COMM 0 // Communications Register (WO, 8-bit) #define AD7190_REG_STAT 0 // Status Register (RO, 8-bit) #define AD7190_REG_MODE 1 // Mode Register (RW, 24-bit #define AD7190_REG_CONF 2 // Configuration Register (RW, 24-bit) #define AD7190_REG_DATA 3 // Data Register (RO, 24/32-bit) #define AD7190_REG_ID 4 // ID Register (RO, 8-bit) #define AD7190_REG_GPOCON 5 // GPOCON Register (RW, 8-bit) #define AD7190_REG_OFFSET 6 // Offset Register (RW, 24-bit #define AD7190_REG_FULLSCALE 7 // Full-Scale Register (RW, 24-bit) /* Communications Register Bit Designations (AD7190_REG_COMM) */ #define AD7190_COMM_WEN (1 << 7) // Write Enable. #define AD7190_COMM_WRITE (0 << 6) // Write Operation. #define AD7190_COMM_READ (1 << 6) // Read Operation. #define AD7190_COMM_ADDR(x) (((x) & 0x7) << 3) // Register Address. #define AD7190_COMM_CREAD (1 << 2) // Continuous Read of Data Register. /* Status Register Bit Designations (AD7190_REG_STAT) */ #define AD7190_STAT_RDY (1 << 7) // Ready. #define AD7190_STAT_ERR (1 << 6) // ADC error bit. #define AD7190_STAT_NOREF (1 << 5) // Error no external reference. #define AD7190_STAT_PARITY (1 << 4) // Parity check of the data register. #define AD7190_STAT_CH2 (1 << 2) // Channel 2. #define AD7190_STAT_CH1 (1 << 1) // Channel 1. #define AD7190_STAT_CH0 (1 << 0) // Channel 0. /* Mode Register Bit Designations (AD7190_REG_MODE) */ #define AD7190_MODE_SEL(x) (((x) & 0x7) << 21) // Operation Mode Select. #define AD7190_MODE_DAT_STA (1 << 20) // Status Register transmission. #define AD7190_MODE_CLKSRC(x) (((x) & 0x3) << 18) // Clock Source Select. #define AD7190_MODE_SINC3 (1 << 15) // SINC3 Filter Select. #define AD7190_MODE_ENPAR (1 << 13) // Parity Enable. #define AD7190_MODE_SCYCLE (1 << 11) // Single cycle conversion. #define AD7190_MODE_REJ60 (1 << 10) // 50/60Hz notch filter. #define AD7190_MODE_RATE(x) ((x) & 0x3FF) // Filter Update Rate Select. /* Mode Register: AD7190_MODE_SEL(x) options */ #define AD7190_MODE_CONT 0 // Continuous Conversion Mode. #define AD7190_MODE_SINGLE 1 // Single Conversion Mode. #define AD7190_MODE_IDLE 2 // Idle Mode. #define AD7190_MODE_PWRDN 3 // Power-Down Mode. #define AD7190_MODE_CAL_INT_ZERO 4 // Internal Zero-Scale Calibration. #define AD7190_MODE_CAL_INT_FULL 5 // Internal Full-Scale Calibration. #define AD7190_MODE_CAL_SYS_ZERO 6 // System Zero-Scale Calibration. #define AD7190_MODE_CAL_SYS_FULL 7 // System Full-Scale Calibration. /* Mode Register: AD7190_MODE_CLKSRC(x) options */ #define AD7190_CLK_EXT_MCLK1_2 0 // External crystal. The external crystal // is connected from MCLK1 to MCLK2. #define AD7190_CLK_EXT_MCLK2 1 // External Clock applied to MCLK2 #define AD7190_CLK_INT 2 // Internal 4.92 MHz clock. // Pin MCLK2 is tristated. #define AD7190_CLK_INT_CO 3 // Internal 4.92 MHz clock. The internal // clock is available on MCLK2. /* Configuration Register Bit Designations (AD7190_REG_CONF) */ #define AD7190_CONF_CHOP (1 << 23) // CHOP enable. #define AD7190_CONF_REFSEL (1 << 20) // REFIN1/REFIN2 Reference Select. #define AD7190_CONF_CHAN(x) (((x) & 0xFF) << 8) // Channel select. #define AD7190_CONF_BURN (1 << 7) // Burnout current enable. #define AD7190_CONF_REFDET (1 << 6) // Reference detect enable. #define AD7190_CONF_BUF (1 << 4) // Buffered Mode Enable. #define AD7190_CONF_UNIPOLAR (1 << 3) // Unipolar/Bipolar Enable. #define AD7190_CONF_GAIN(x) ((x) & 0x7) // Gain Select. /* Configuration Register: AD7190_CONF_CHAN(x) options */ #define AD7190_CH_AIN1P_AIN2M 0 // AIN1(+) - AIN2(-) #define AD7190_CH_AIN3P_AIN4M 1 // AIN3(+) - AIN4(-) #define AD7190_CH_TEMP_SENSOR 2 // Temperature sensor #define AD7190_CH_AIN2P_AIN2M 3 // AIN2(+) - AIN2(-) #define AD7190_CH_AIN1P_AINCOM 4 // AIN1(+) - AINCOM #define AD7190_CH_AIN2P_AINCOM 5 // AIN2(+) - AINCOM #define AD7190_CH_AIN3P_AINCOM 6 // AIN3(+) - AINCOM #define AD7190_CH_AIN4P_AINCOM 7 // AIN4(+) - AINCOM /* Configuration Register: AD7190_CONF_GAIN(x) options */ // ADC Input Range (5 V Reference) #define AD7190_CONF_GAIN_1 0 // Gain 1 +-5 V #define AD7190_CONF_GAIN_8 3 // Gain 8 +-625 mV #define AD7190_CONF_GAIN_16 4 // Gain 16 +-312.5 mV #define AD7190_CONF_GAIN_32 5 // Gain 32 +-156.2 mV #define AD7190_CONF_GAIN_64 6 // Gain 64 +-78.125 mV #define AD7190_CONF_GAIN_128 7 // Gain 128 +-39.06 mV /* ID Register Bit Designations (AD7190_REG_ID) */ #define ID_AD7190 0x4 #define AD7190_ID_MASK 0x0F /* GPOCON Register Bit Designations (AD7190_REG_GPOCON) */ #define AD7190_GPOCON_BPDSW (1 << 6) // Bridge power-down switch enable #define AD7190_GPOCON_GP32EN (1 << 5) // Digital Output P3 and P2 enable #define AD7190_GPOCON_GP10EN (1 << 4) // Digital Output P1 and P0 enable #define AD7190_GPOCON_P3DAT (1 << 3) // P3 state #define AD7190_GPOCON_P2DAT (1 << 2) // P2 state #define AD7190_GPOCON_P1DAT (1 << 1) // P1 state #define AD7190_GPOCON_P0DAT (1 << 0) // P0 state /******************************************************************************/ /*********************** Functions Declarations *******************************/ /******************************************************************************/ /*! Checks if the AD7139 part is present. */ extern U1 AD7190_Init(void); /*! Waits for RDY pin to go low. */ extern void AD7190_WaitRdyGoLow(void); #if 0 /*! Selects the channel to be enabled. */ extern void AD7190_ChannelSelect(unsigned short channel); /*! Performs the given calibration to the specified channel. */ extern void AD7190_Calibrate(unsigned char mode, unsigned char channel); #endif /*! Read data from temperature sensor and converts it to Celsius degrees. */ extern U4 AD7190_AdRead(void); #endif /* __AD7190_H__ */ 将上述代码中的ucosii依赖替换为裸机代码
最新发布
12-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值