2009年江西省全国知名重点中学排名
1.
江西师范大学附属中学
2.
南昌二中
3.
九江市第一中学
4.
鹰潭一中
5.
高安中学
6.
临川一中
7.
白鹭洲中学
8.
玉山一中
9.
上高二中
10.
金溪县第一中学
江西省九江市同文中学前身为私立同文中学和私立儒励女子中学(分别创办于1867年和1873年),是美国基督教会在中国创办的第一批教会学校。几经历史变迁,解放后人民政府接管两校并于1951年合并为“省立浔阳中学”,后更名“九江市二中”,是
江西省首批被确定的优秀重点中学
。2002年经人民政府批准恢复“同文中学”校名。其南枕甘棠之滨,北邻能仁古刹,前瞻匡庐秀色,后闻长江惊涛,至今已历136年。
电话:0792-8551972
地址:南湖路44号
我写的DS18B20程序,可参考
#include reg52.h
#include intrins.h
#include stdio.h
#define uchar unsigned char
#define uint unsigned int
sbit xssj=P1^0; //显示数据
sbit xssz=P1^1; //显示时钟
sbit control=P1^3;
sbit DQ = P1^4;
bit flag;
uint Temperature;
uint temp[9];
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar id_buff[8];
uchar *p;
uchar crc_data;
uint Temperature_h;
uint Temperature_l;
uchar code Crcontrolable [256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
//uchar code tab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极0-F代码
uchar code tab[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0x40};//共阴极0-F代码
void delay1ms(int t)
{
int i,j,k=0;
for(k=0;kt;k++)
{for(j=0;j=25;j++)
{for(i=0;i255;i++){;}}}
}
/************************************************************
*Funcontrolion:延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TempDelay (uchar us)
{
while(us--);
}
/************************************************************
*Funcontrolion:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{
DQ=1;
_nop_();
DQ=0;
TempDelay(86); //delay 530 uS//80
_nop_();
DQ=1;
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(DQ==0)
{
flag = 1; //detecontrol 1820 success!
TempDelay(20); //delay 530 uS//80
}
else
{
flag = 0; //detecontrol 1820 fail!
}
TempDelay(20); //20
_nop_();
_nop_();
DQ = 1;
}
/************************************************************
*Funcontrolion:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //单字节写入
{
uchar i;
for (i=0;i8;i++)
{
DQ = 0;
_nop_();
DQ=wr0x01;
TempDelay(5); //delay 45 uS //5
_nop_();
_nop_();
DQ=1;
wr = 1;
}
}
/************************************************************
*Funcontrolion:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
uchar ReadByte (void) //读取单字节
{
uchar i,u=0;
for(i=0;i8;i++)
{
DQ = 0;
u = 1;
DQ = 1;
if(DQ==1)
u |= 0x80;
TempDelay (4);
_nop_();
}
return(u);
}
/************************************************************
*Funcontrolion:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes (uchar j)
{
uchar i;
for(i=0;ij;i++)
{
*p = ReadByte();
p++;
}
}
/************************************************************
*Funcontrolion:CRC校验
*parameter:
*Return:
*Modify:
*************************************************************/
uchar CRC (uchar j)
{
uchar i,crc_data=0;
for(i=0;ij;i++) //查表校验
crc_data = Crcontrolable[crc_data^temp_buff[i]];
return (crc_data);
}
/************************************************************
*Funcontrolion:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp (void)
{
read_bytes (9);
if (CRC(9)==0) //校验正确
{
Temperature = temp_buff[1]*0x100 + temp_buff[0];
Temperature /= 16;//17.7;//16;
TempDelay(1);
}
}
/************************************************************
*Funcontrolion:内部配置
*parameter:
*Return:
*Modify:
*************************************************************/
void Config18b20 (void) //重新配置报警限定值和分辨率
{
Init18b20();
WriteByte(0x7f); //set 11 bit (0.125)
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0x48); //保存设定值
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0xb8); //回调设定值
}
/************************************************************
*Funcontrolion:读18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
void ReadID (void)//读取器件 id
{
Init18b20();
if(flag ==1)
{
WriteByte(0xcc);
WriteByte(0x44);
}
}
/************************************************************
*Funcontrolion:18B20ID全处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TemperatuerResult(void)
{
p = id_buff;
ReadID();
Config18b20();
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0x44); //Temperature convert
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
p = temp_buff;
GemTemp();
}
void disp(uchar i)
{
int xssjhc; //显示数据缓冲
uchar a;
xssjhc=tab[i];
for(a=0;a8;a++)
{
xssz=0;
xssj=xssjhc0x80;
xssjhc=1;
xssz=1;
}
}
void panduan()
{
if(Temperature20)
{
control=1;
}
if(Temperature19)
{
control=0;
}
}
void main()
{
while(1)
{
TemperatuerResult();
Temperature_h=Temperature/10;
Temperature_l=Temperature%10;
panduan();
disp(Temperature_h);
delay1ms(50);
disp(Temperature_l);
delay1ms(50);
}
}
出现此现象的原因主要有两个:一个是在年老代被用完之前不能完成对无引用对象的回收;一个是当新空间分配请求在年老代的剩余空间中得到满足。原文如(if theconcurrent collector is unable to finish reclaiming the unreachable objectsbefore the tenured generation fills up, or if an allocation cannot be satisfiedwith the available free space blocks in the tenured generation, then theapplication is paused and the collection is completed with all the applicationthreads stopped)。
出现此现象的具体gc日志如下:
90003.167: [GC 90003.167: [ParNew: 261760K-0K(261952K), 0.0204310secs] 778897K-520196K(1310528K), 0.0207190 secs]
90006.049: [GC 90006.050: [ParNew: 261760K-0K(261952K), 0.0136380 secs]781956K-521446K(1310528K), 0.0138720 secs]
90010.628: [GC 90010.628: [ParNew: 261760K-261760K(261952K), 0.0000350secs]90010.628: [CMS (concurrent mode failure)[Unloadingclass sun.reflect.GeneratedSerializationConstructorAccessor1818]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1816]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1819]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1821]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1817]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1822]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1820]
: 521446K-415777K(1048576K), 2.2550270 secs] 783206K-415777K(1310528K),2.2553820 secs]
90015.099: [GC 90015.099: [ParNew: 261760K-0K(261952K), 0.0198180 secs]677537K-418003K(1310528K), 0.0200650 secs]
90018.670: [GC 90018.670: [ParNew: 261760K-0K(261952K), 0.0131610 secs]679763K-419115K(1310528K), 0.0133750 secs]
90022.254: [GC 90022.254: [ParNew: 261760K-0K(261952K), 0.0151240 secs]680875K-420505K(1310528K), 0.0154180 secs]
当时的JVM参数如下:
-server -Xms1280m -Xmx1280m -Xmn256m -Xss256k -XX:PermSize=128m-XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC-XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled-XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
因为配置了+CMSClassUnloadingEnabled参数,所以出现Unloading classsun.reflect.GeneratedSerializationConstructorAccessor的日志,这是个好习惯,如果空间不够时可以卸载类来释放空间,以进行FULL GC,相反,如果gc日志中出现了此日志,应该检查各代的大小设置是否合理。这里应用从启动到上述现象出现时还没有进行过CMS GC,出现concurrent modefailure现象的原因是年轻代GC(ParNew),年老代所剩下的空间不足以满足年轻代,也就是开头提到的原因二。要避免此现象,方法一是降低触发CMS的阀值,即参数-XX:CMSInitiatingOccupancyFraction的值,默认值是68,所以这里调低到50,让CMS GC尽早执行,以保证有足够的空间,如下:
-server -Xms1280m -Xmx1280m -Xmn256m -Xss256k -XX:PermSize=128m-XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC-XX:CMSFullGCsBeforeCompaction=1 -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=50-XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -verbose:gc-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
调完之后发现还是一样的现象(这里有点不是很明白,年老代空间为1024m(1280m-256m),50%时触发CMS GC,也就是在年老代512m的时候,剩下的堆空间有512m,就算年轻代全部装进去应该也是够的),所以怀疑是年轻代太大,有大的对象,在年老代有碎片的情况下将很难分配,所以有了第二个解决办法,即减少年轻代大小,避免放入年老代时需要分配大的空间,同时调整full gc时压缩碎片的频次,减少持久代大小,以及将触发CMS GC的阀值适当增大(因为年轻代小了,这个调大点没关系,后面可以再调试这个参数),参数如下:
-server -Xms1280m -Xmx1280m -Xmn128m -Xss256k -XX:PermSize=96m -XX:MaxPermSize=96m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=1 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
调整完后没有那个现象了,这里主要起作用的就是调小年轻代大小。在年老代到达826m(触发CMS阀值(1280-128)*0.7=806m)时出现了CMS GC,用时27ms,日志如下:
705.444: [GC 705.445: [ParNew: 130944K-0K(131008K), 0.0197680 secs]954628K-826284K(1310656K), 0.0199720 secs]
705.467:[GC [1 CMS-initial-mark: 826284K(1179648K)] 826744K(1310656K), 0.0271540 secs]
705.494:[CMS-concurrent-mark-start]
706.717:[CMS-concurrent-mark: 1.223/1.223 secs]
706.717:[CMS-concurrent-preclean-start]
706.717:[CMS-concurrent-preclean: 0.000/0.000 secs]
706.742:[CMS-concurrent-abortable-preclean-start]
706.742:[CMS-concurrent-abortable-preclean: 0.000/0.000 secs]
707.067: [GC 707.067: [ParNew: 130944K-0K(131008K), 0.0160200 secs]957228K-827348K(1310656K), 0.0162110 secs]
707.796: [GC[YG occupancy: 66671 K (131008 K)]707.796: [Rescan (parallel) ,0.0278280 secs]707.824: [weak refs processing, 0.0420770 secs] [1 CMS-remark:827348K(1179648K)] 894019K(1310656K), 0.0711970 secs]
707.877: [CMS-concurrent-sweep-start]
708.453: [GC 708.454: [ParNew: 130944K-0K(131008K), 0.0203760 secs]848439K-718796K(1310656K), 0.0205780 secs]
709.833: [GC 709.833: [ParNew: 130944K-0K(131008K), 0.0160170 secs]430484K-301411K(1310656K), 0.0161840 secs]
709.916: [CMS-concurrent-sweep: 1.974/2.040 secs]
709.916: [CMS-concurrent-reset-start]
709.951: [CMS-concurrent-reset: 0.034/0.034 secs]
711.187: [GC 711.187: [ParNew: 130944K-0K(131008K), 0.0130890 secs]413136K-283326K(1310656K), 0.0132600 secs]
观察一段时间的gc情况,gc效率也很高,单次YGCT20ms,FGCT 40ms:
$ jstat -gcutil 31935 1000
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 64.29 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.33 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.41 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.45 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.49 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.58 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.63 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.69 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.72 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.75 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.79 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.84 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.90 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.95 36.47 73.15 1293 19.514 6 0.211 19.725
0.00 0.00 64.99 36.47 73.15 1293 19.514 6 0.211 19.725
这时,想再测试下-XX:CMSInitiatingOccupancyFraction的值,调到80时又出现了上述现象Concurrent ModeFailure,启动后还没进行过CMS GC,在年老代914m时就出现了:
759.994: [GC 759.994: [ParNew: 130944K-0K(131008K), 0.0172910 secs]1040896K-911480K(1310656K), 0.0174730 secs]
760.879: [GC 760.879: [ParNew: 130944K-0K(131008K), 0.0300920 secs]1042424K-914190K(1310656K), 0.0302950 secs]
761.768: [GC 761.769: [ParNew: 130944K-130944K(131008K), 0.0000340secs]761.769: [CMS (concurrent mode failure)[Unloading classsun.reflect.GeneratedMethodAccessor342]edMethodAccessor348]
[Unloading class sun.reflect.GeneratedMethodAccessor411]
[Unloading class sun.reflect.GeneratedMethodAccessor407]
[Unloading class sun.reflect.GeneratedMethodAccessor541]
最后总结下,出现Concurrent ModeFailure现象时,解决办法就是要让年老代留有足够的空间,以保证新对象空间的分配。另外在JVM BUG中有提到,JDK1.5_09版本之前,JVM参数-XX:CMSInitiatingOccupancyFraction是无效的,我这里应用环境的版本是JDK1.5_08,从gc日志来看是可以生效的。
GC时还有一个常见的错误PromotionFailed,解决办法类似,也是调整年轻代和年老代的比例,还有CMSGC的时机。
我来说两句