<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>对影成三人 &#187; c6000</title>
	<atom:link href="http://ichaochao.com/tag/c6000/feed/" rel="self" type="application/rss+xml" />
	<link>http://ichaochao.com</link>
	<description></description>
	<lastBuildDate>Wed, 04 Jan 2012 06:58:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>在TMS320C62x上实现扩展精度的复数基2FFT/IFFT算法</title>
		<link>http://ichaochao.com/2008/07/10/fft_in_c62x/</link>
		<comments>http://ichaochao.com/2008/07/10/fft_in_c62x/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 09:03:44 +0000</pubDate>
		<dc:creator>beethoven</dc:creator>
				<category><![CDATA[假装懂技术]]></category>
		<category><![CDATA[c6000]]></category>
		<category><![CDATA[DSP]]></category>

		<guid isPermaLink="false">http://ichaochao.com/?p=159</guid>
		<description><![CDATA[本文翻译自TI的文档《spra696a_Extended-Precision Complex Radix-2 FFT_IFFT Implemented on TMS320C62x.pdf》。&#8212;&#8212;哎，没过CET4，看E文就是累啊！
&#8212; 文首预览 &#8212;
定点DSP有限的动态范围导致在计算FFT时精度不够。这是因为使用了量化和缩放来防止输出溢出。因此，会需要使用扩展精度来执行计算，特别是对于大尺寸的FFT。高度优化的扩展精度的FFT和IFFT汇编程序，可以在TMS320C62X上，通过适度增加运行时间来提高运算精度。
目录：
1.    快速傅立叶变换FFT
2.    快速傅立叶反变换IFFT
3.    精度扩展的需要
4.    C62x上的扩展精度乘法
5.    FFT的实现
6.     IFFT的实现
7.    比例缩放问题
8.    误差估计
9.    基准（Benchmarks）
10.    输出位反转
11.    代码
12.    参考文档

注：本人E文极差，请慎重考虑是否要下载全文！
全文下载地址
]]></description>
			<content:encoded><![CDATA[<p>本文翻译自TI的文档《spra696a_Extended-Precision Complex Radix-2 FFT_IFFT Implemented on TMS320C62x.pdf》。&#8212;&#8212;哎，没过CET4，看E文就是累啊！</p>
<p class="MsoNormal">&#8212; 文首预览 &#8212;</p>
<p class="MsoNormal"><span style="宋体;">定点</span><span>DSP</span><span style="宋体;">有限的动态范围导致在计算</span><span>FFT</span><span style="宋体;">时精度不够。这是因为使用了量化和缩放来防止输出溢出。因此，会需要使用扩展精度来执行计算，特别是对于大尺寸的</span><span>FFT</span><span style="宋体;">。高度优化的扩展精度的</span><span>FFT</span><span style="宋体;">和</span><span>IFFT</span><span style="宋体;">汇编程序，可以在</span><span>TMS320C62X</span><span style="宋体;">上，通过适度增加运行时间来提高运算精度。</span></p>
<p class="MsoNormal"><span id="more-159"></span>目录：</p>
<p class="MsoNormal">1.    快速傅立叶变换FFT<br />
2.    快速傅立叶反变换IFFT<br />
3.    精度扩展的需要<br />
4.    C62x上的扩展精度乘法<br />
5.    FFT的实现<br />
6.     IFFT的实现<br />
7.    比例缩放问题<br />
8.    误差估计<br />
9.    基准（Benchmarks）<br />
10.    输出位反转<br />
11.    代码<br />
12.    参考文档</p>
<p class="MsoNormal">
<p class="MsoNormal">注：本人E文极差，请慎重考虑是否要下载全文！</p>
<p><a href="http://www.box.net/shared/pbv0rhtcs4" target="_blank">全文下载地址</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ichaochao.com/2008/07/10/fft_in_c62x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FFT在C6000DSP上的仿真</title>
		<link>http://ichaochao.com/2008/07/01/fft_in_dsp/</link>
		<comments>http://ichaochao.com/2008/07/01/fft_in_dsp/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 09:04:00 +0000</pubDate>
		<dc:creator>beethoven</dc:creator>
				<category><![CDATA[假装懂技术]]></category>
		<category><![CDATA[假装爱摄影]]></category>
		<category><![CDATA[c6000]]></category>
		<category><![CDATA[CCS]]></category>
		<category><![CDATA[DSP]]></category>
		<category><![CDATA[fft]]></category>

		<guid isPermaLink="false">http://ichaochao.com/2008/07/01/fft_in_dsp/</guid>
		<description><![CDATA[经过一段时间的学习，今天在CCS内成功仿真了基2频域抽取FFT(radix2 DIF FFT)。
环境：CCS 3.1 + C6201 Device Simulator
仿真结果如下图：

全部代码在下面，为了描述简单，把所有函数写在了一起，实际运用中不应该这样做。另外位反转索引表和旋转因子表都是在里面实时生成的，实际运用时，应该做好表格后嵌入，或在编译时生成而不是运行时生成。
感谢 pacificxu 的教程，他貌似曾经是闻亭的高手。
#include &#8220;math.h&#8221;
/*========================================*/
/* GLOBAL CONSTANTS                                                          */
/*========================================*/
#define PI    3.14159265358979
#define N        2048
/*========================================*/
/* GLOBAL VARIABLES                                                          */
/*========================================*/
static short index1[64], w1[N];
static short x1[N*2];
static int x2[N];
int i;
void DSP_radix2(int n, short *restrict xy, const short *restrict w)
{
short n1,n2,ie,ia,i,j,k,l;
short xt,yt,c,s;
n2 = n;
ie = 1;
for (k=n; k &#62; 1; k = (k &#62;&#62; 1) )
{
n1 = <a href="http://ichaochao.com/2008/07/01/fft_in_dsp/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>经过一段时间的学习，今天在CCS内成功仿真了基2频域抽取FFT(radix2 DIF FFT)。</p>
<p>环境：CCS 3.1 + C6201 Device Simulator</p>
<p>仿真结果如下图：</p>
<p><span id="more-155"></span><a href="http://ichaochao.com/wp-content/uploads/2008/07/fft-timewave.jpg"><img style="0px" src="http://ichaochao.com/wp-content/uploads/2008/07/fft-timewave-thumb.jpg" border="0" alt="fft_timewave" width="244" height="169" /></a><a href="http://ichaochao.com/wp-content/uploads/2008/07/fft-freqwave.jpg"><img style="0px" src="http://ichaochao.com/wp-content/uploads/2008/07/fft-freqwave-thumb.jpg" border="0" alt="fft_freqwave" width="244" height="168" /></a></p>
<p>全部代码在下面，为了描述简单，把所有函数写在了一起，实际运用中不应该这样做。另外位反转索引表和旋转因子表都是在里面实时生成的，实际运用时，应该做好表格后嵌入，或在编译时生成而不是运行时生成。</p>
<p>感谢 pacificxu 的教程，他貌似曾经是闻亭的高手。</p>
<p>#include &#8220;math.h&#8221;<br />
/*========================================*/<br />
/* GLOBAL CONSTANTS                                                          */<br />
/*========================================*/</p>
<p>#define PI    3.14159265358979<br />
#define N        2048</p>
<p>/*========================================*/<br />
/* GLOBAL VARIABLES                                                          */<br />
/*========================================*/<br />
static short index1[64], w1[N];<br />
static short x1[N*2];<br />
static int x2[N];<br />
int i;</p>
<p>void DSP_radix2(int n, short *restrict xy, const short *restrict w)<br />
{<br />
short n1,n2,ie,ia,i,j,k,l;<br />
short xt,yt,c,s;<br />
n2 = n;<br />
ie = 1;<br />
for (k=n; k &gt; 1; k = (k &gt;&gt; 1) )<br />
{<br />
n1 = n2;<br />
n2 = n2&gt;&gt;1;<br />
ia = 0;<br />
for (j=0; j &lt; n2; j++)<br />
{<br />
c = w[2*ia];<br />
s = w[2*ia+1];<br />
ia = ia + ie;<br />
for (i=j; i &lt; n; i += n1)<br />
{<br />
l = i + n2;<br />
xt      = xy[2*l] &#8211; xy[2*i];<br />
xy[2*i] = xy[2*i] + xy[2*l];<br />
yt      = xy[2*l+1] &#8211; xy[2*i+1];<br />
xy[2*i+1] = xy[2*i+1] + xy[2*l+1];<br />
xy[2*l]   = (c*xt + s*yt)&gt;&gt;15;<br />
xy[2*l+1] = (c*yt &#8211; s*xt)&gt;&gt;15;<br />
}<br />
}<br />
ie = ie&lt;&lt;1;<br />
}<br />
}<br />
void DSP_bitrev_cplx(int *x, short *index, int nx)<br />
{<br />
int     i;<br />
short       i0, i1, i3;<br />
short       j0, j1, j3;<br />
int     xi0, xi1, xi3;<br />
int     xj0, xj1, xj3;<br />
short       t;<br />
int     a, b, ia, ib, ibs;<br />
int     mask;<br />
int     nbits, nbot, ntop, ndiff, n2, halfn;<br />
nbits = 0;<br />
i = nx;<br />
while (i &gt; 1)<br />
{<br />
i = i &gt;&gt; 1;<br />
nbits++;<br />
}</p>
<p>nbot    = nbits &gt;&gt; 1;<br />
ndiff   = nbits &amp; 1;<br />
ntop    = nbot + ndiff;<br />
n2      = 1 &lt;&lt; ntop;<br />
mask    = n2 &#8211; 1;<br />
halfn   = nx &gt;&gt; 1;<br />
for (i0 = 0; i0 &lt; halfn; i0 += 2)<br />
{<br />
b   = i0 &amp; mask;<br />
a   = i0 &gt;&gt; nbot;<br />
if (!b) ia  = index[a];<br />
ib  = index[b];<br />
ibs = ib &lt;&lt; nbot;<br />
j0  = ibs + ia;<br />
t   = i0 &lt; j0;<br />
xi0 = x[i0];<br />
xj0 = x[j0];</p>
<p>if (t){x[i0] = xj0;<br />
x[j0] = xi0;}</p>
<p>i1  = i0 + 1;<br />
j1  = j0 + halfn;<br />
xi1 = x[i1];<br />
xj1 = x[j1];<br />
x[i1] = xj1;<br />
x[j1] = xi1;</p>
<p>i3  = i1 + halfn;<br />
j3  = j1 + 1;<br />
xi3 = x[i3];<br />
xj3 = x[j3];<br />
if (t){x[i3] = xj3;<br />
x[j3] = xi3;}<br />
}<br />
}<br />
void bitrev_index(short *index, int n)<br />
{<br />
int   i, j, k, radix = 2;<br />
short nbits, nbot, ntop, ndiff, n2, raddiv2;<br />
nbits = 0;<br />
i = n;<br />
while (i &gt; 1)<br />
{<br />
i = i &gt;&gt; 1;<br />
nbits++;<br />
}<br />
raddiv2 = radix &gt;&gt; 1;<br />
nbot    = nbits &gt;&gt; raddiv2;<br />
nbot    = nbot &lt;&lt; raddiv2 &#8211; 1;<br />
ndiff   = nbits &amp; raddiv2;<br />
ntop    = nbot + ndiff;<br />
n2      = 1 &lt;&lt; ntop;<br />
index[0] = 0;<br />
for ( i = 1, j = n2/radix + 1; i &lt; n2 &#8211; 1; i++)<br />
{<br />
index[i] = j &#8211; 1;<br />
for (k = n2/radix; k*(radix-1) &lt; j; k /= radix)<br />
j -= k*(radix-1);<br />
j += k;<br />
}<br />
index[n2 - 1] = n2 &#8211; 1;<br />
}<br />
/*===================================*/<br />
/* MAIN()                                                                    */<br />
/*===================================*/<br />
void main()</p>
<p>{<br />
double delta;</p>
<p>/*======== init the index table for FFT bitrev =====*/</p>
<p>bitrev_index(index1, N);</p>
<p>/*======== init the FFT coeficients =====*/<br />
delta = 2*PI/N;<br />
for (i=0;i&lt;N/2;i++)<br />
{<br />
w1[2*i] = 32767*(-cos((double)i*delta));<br />
w1[2*i+1] = 32767*(-sin((double)i*delta));<br />
}</p>
<p>/*======== init the input data =====*/<br />
for (i=0;i&lt;N;i++)<br />
{<br />
x1[2*i] = (short)((cos(PI*i/20.0)+cos(PI*i/10.0)+cos(PI*i/5.0))*0&#215;80);<br />
x1[2*i+1] = 0;<br />
}<br />
/*======== implement FFT =====*/</p>
<p>DSP_radix2(N, x1, w1);<br />
for (i=0; i&lt;N; i++)<br />
{<br />
x2[i] = sqrt(x1[2*i]*x1[2*i]+x1[2*i+1]*x1[2*i+1]);  //&#8212;?<br />
}</p>
<p>/*======== bitrev =====*/</p>
<p>DSP_bitrev_cplx(x2, index1, N);<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://ichaochao.com/2008/07/01/fft_in_dsp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于C6000的寻址</title>
		<link>http://ichaochao.com/2008/05/07/c6000_address/</link>
		<comments>http://ichaochao.com/2008/05/07/c6000_address/#comments</comments>
		<pubDate>Wed, 07 May 2008 02:38:59 +0000</pubDate>
		<dc:creator>beethoven</dc:creator>
				<category><![CDATA[假装懂技术]]></category>
		<category><![CDATA[c6000]]></category>
		<category><![CDATA[DSP]]></category>

		<guid isPermaLink="false">http://blog.ichaochao.com/2008/05/07/%e5%85%b3%e4%ba%8ec6000%e7%9a%84%e5%af%bb%e5%9d%80/</guid>
		<description><![CDATA[C6000提供32bit的寻址能力，但是经EMIF直接输出的地址信号只有EA[21:2]，直接使用这个地址可以达到1M word的寻址，EA的最低2位译码后有BEx输出，所以结合BEx可以进行Byte访问，即4M Byte寻址，这是每个CE空间的范围，对于整个CE空间(CE3:0)就是有16M Byte的外部存储器寻址能力。
注意：对于C620X/670X来说，EMIF支持32bit宽度的ASRAM、SDRAM和SBSRAM，只有CE1空间支持16bit和8bit的ROM接口。

遗留问题，为什么会有4位BE(BE3:0)，如何使用？
]]></description>
			<content:encoded><![CDATA[<p>C6000提供32bit的寻址能力，但是经EMIF直接输出的地址信号只有EA[21:2]，直接使用这个地址可以达到1M word的寻址，EA的最低2位译码后有BEx输出，所以结合BEx可以进行Byte访问，即4M Byte寻址，这是每个CE空间的范围，对于整个CE空间(CE3:0)就是有16M Byte的外部存储器寻址能力。<span id="more-12"></span></p>
<p>注意：对于C620X/670X来说，EMIF支持32bit宽度的ASRAM、SDRAM和SBSRAM，只有CE1空间支持16bit和8bit的ROM接口。</p>
<p><a title="寻址能力表" href="http://beethoven.yo2.cn/wp-content/uploads/232/23250/2008/05/spximage11.jpg"><img src="http://beethoven.yo2.cn/wp-content/uploads/232/23250/2008/05/spximage11.thumbnail.jpg" alt="寻址能力表" /></a></p>
<p>遗留问题，为什么会有4位BE(BE3:0)，如何使用？</p>
]]></content:encoded>
			<wfw:commentRss>http://ichaochao.com/2008/05/07/c6000_address/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于 DSP的关键字 volatile</title>
		<link>http://ichaochao.com/2008/05/06/dsp_keyword_volatile/</link>
		<comments>http://ichaochao.com/2008/05/06/dsp_keyword_volatile/#comments</comments>
		<pubDate>Tue, 06 May 2008 02:14:32 +0000</pubDate>
		<dc:creator>beethoven</dc:creator>
				<category><![CDATA[假装懂技术]]></category>
		<category><![CDATA[c6000]]></category>
		<category><![CDATA[DSP]]></category>

		<guid isPermaLink="false">http://blog.ichaochao.com/2008/05/06/%e5%85%b3%e4%ba%8e-%e5%85%b3%e9%94%ae%e5%ad%97-volatile/</guid>
		<description><![CDATA[来自CCS的help:
The compiler analyzes data flow to avoid memory accesses whenever possible. If you have code that depends on memory accesses exactly as written in the C/C++ code you must use the volatile keyword to identify these accesses. A variable qualified with a volatile keyword is allocated to an uninitialized section (as opposed to a register). <a href="http://ichaochao.com/2008/05/06/dsp_keyword_volatile/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>来自CCS的help:<br />
The compiler analyzes data flow to avoid memory accesses whenever possible. If you have code that depends on memory accesses exactly as written in the C/C++ code you must use the volatile keyword to identify these accesses. A variable qualified with a volatile keyword is allocated to an uninitialized section (as opposed to a register). The compiler does not optimize out any references to volatile variables.<span id="more-5"></span></p>
<p>In the following example, the loop waits for a location to be read as 0xFF:</p>
<p>unsigned int *ctrl;<br />
while (*ctrl !=0xFF);</p>
<p>In this example, *ctrl is a loop-invariant expression, so the loop is optimized down to a single memory read. To correct this, define *ctrl as:</p>
<p>volatile unsigned int *ctrl;</p>
<p>Here the *ctrl pointer is intended to reference a hardware location, such as an interrupt flag.</p>
<p>来自<strong><a href="http://www.gcs8.cn/simple/index.php?">软工吧论坛</a></strong><br />
volatile 提醒编译器它后面所定义的变量随时都有可能改变，因此编译后的程序每次需要存储或读取这个变量的时候，都会直接从变量地址中读取数据。如果没有 volatile关键字，则编译器可能优化读取和存储，可能暂时使用寄存器中的值，如果这个变量由别的程序更新了的话，将出现不一致的现象。下面举例说 明。</p>
<p>在DSP开发中，经常需要等待某个事件的触发，所以经常会写出这样的程序：<br />
以下内容为程序代码:<br />
short flag;<br />
void test()<br />
{<br />
do1();<br />
while(flag==0);<br />
do2();<br />
}</p>
<p>这段程序等待内存变量flag的值变为1之后才运行do2()。变量 flag的值由别的程序更改，这个程序可能是某个硬件中断服务程序，例如如果某个按钮按下的话，就会对DSP产生中断，在按键中断程序中修改flag为 1，这样上面的程序就能够得以继续运行。</p>
<p>但 是，编译器并不知道flag的值会被别的程序修改，因此在它进行优化的时候，可能会把flag的值先读入某个寄存器，然后等待那个寄存器变为 1。如果不幸进行了这样的优化，那么while循环就变成了死循环，因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的 值，就需要定义为如下形式：</p>
<p>volatile short flag;</p>
<p>需要注意的是，没有volatile也可能能正常 运行，但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常，但是release版本却不能正常的问题。所以为了安 全起见，只要是等待别的程序修改某个变量的话，就加上volatile关键字。</p>
]]></content:encoded>
			<wfw:commentRss>http://ichaochao.com/2008/05/06/dsp_keyword_volatile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于C6000DSP的引导方式和bootloader</title>
		<link>http://ichaochao.com/2008/05/06/c6000_bootloader/</link>
		<comments>http://ichaochao.com/2008/05/06/c6000_bootloader/#comments</comments>
		<pubDate>Tue, 06 May 2008 02:09:33 +0000</pubDate>
		<dc:creator>beethoven</dc:creator>
				<category><![CDATA[假装懂技术]]></category>
		<category><![CDATA[c6000]]></category>
		<category><![CDATA[DSP]]></category>

		<guid isPermaLink="false">http://blog.ichaochao.com/2008/05/06/%e5%85%b3%e4%ba%8ec6000dsp%e7%9a%84%e5%bc%95%e5%af%bc%e6%96%b9%e5%bc%8f%e5%92%8cbootloader/</guid>
		<description><![CDATA[C6000是TI的高端DSP，它有3种引导方式：㈠无引导； ㈡ROM引导； ㈢主机引导
㈠ &#8211; 无引导：CPU直接从地址0处开始执行代码。
㈡ &#8211; ROM引导，加载过程：
①当CPU的Reset引脚处于低电平状态时，BOOTMODE的引脚状态根据预设设定， RESET信号处于上升沿的时候，相应加载方式启动。
②ROM加载方式是通过DMA控制器，将外部ROM的一段固定大小的代码复制到内部RAM中（加载时CPU处于stall状态），对于不同型号芯片，复制的代码大小不同。
对于C620x/C670x，DMA从CE1空间拷贝64K数据到地址0处
对于C621x/C671x/C64x，EDMA从CE1空间拷贝1K数据到地址0处。
③加载完毕后，CPU开始从0地址执行。
对于上述步骤②的第二种（C621x/C671x/C64x），1K是不能解决问题的，所以，一般在0地址处建立一个叫做“bootloader”的段（代码小于1KB），这一小段程序也叫 “引导程序”，上电或者重启后首先执行它，完成将其余程序（真正完成用户要求算法的程序）加载，然后跳转到主程序入口地址运行。
㈢ &#8211; 主机引导：
对具有不同接口的芯片，分别有以下三种渠道连接：
HPI
XBUS
PCI
关于bootloader的疑问：
bootloader文件如果加入的输出文件中？
参考文档：spru642_TMS320C620xC670x DSP Boot Modes and Configuration Reference Guide.pdf
]]></description>
			<content:encoded><![CDATA[<p>C6000是TI的高端DSP，它有3种引导方式：㈠无引导； ㈡ROM引导； ㈢主机引导</p>
<p>㈠ &#8211; 无引导：CPU直接从地址0处开始执行代码。<span id="more-4"></span></p>
<p>㈡ &#8211; ROM引导，加载过程：<br />
①当CPU的Reset引脚处于低电平状态时，BOOTMODE的引脚状态根据预设设定， RESET信号处于上升沿的时候，相应加载方式启动。</p>
<p>②ROM加载方式是通过DMA控制器，将外部ROM的一段固定大小的代码复制到内部RAM中（加载时CPU处于stall状态），对于不同型号芯片，复制的代码大小不同。<br />
对于C620x/C670x，DMA从CE1空间拷贝64K数据到地址0处<br />
对于C621x/C671x/C64x，EDMA从CE1空间拷贝1K数据到地址0处。</p>
<p>③加载完毕后，CPU开始从0地址执行。<br />
对于上述步骤②的第二种（C621x/C671x/C64x），1K是不能解决问题的，所以，一般在0地址处建立一个叫做“bootloader”的段（代码小于1KB），这一小段程序也叫 “引导程序”，上电或者重启后首先执行它，完成将其余程序（真正完成用户要求算法的程序）加载，然后跳转到主程序入口地址运行。</p>
<p>㈢ &#8211; 主机引导：<br />
对具有不同接口的芯片，分别有以下三种渠道连接：<br />
HPI<br />
XBUS<br />
PCI</p>
<p>关于bootloader的疑问：<br />
bootloader文件如果加入的输出文件中？</p>
<p>参考文档：spru642_TMS320C620xC670x DSP Boot Modes and Configuration Reference Guide.pdf</p>
]]></content:encoded>
			<wfw:commentRss>http://ichaochao.com/2008/05/06/c6000_bootloader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

