<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/69935/fds-and-write-erase-flash-cycles</link><description>Hi! I&amp;#39;ve read a bit about the limitation of write/read cycles with the nRF52840. I the ~10,000 write/read cycles limit means after this many erases, the flash is no longer guaranteed to &amp;#39;work properly&amp;#39;. I have a few questions regarding this: 
 1. What</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 02 Feb 2021 12:50:02 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/69935/fds-and-write-erase-flash-cycles" /><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/292472?ContentTypeID=1</link><pubDate>Tue, 02 Feb 2021 12:50:02 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:477591d1-2efe-4fd9-9bc2-6ee9c0ccc2bd</guid><dc:creator>dgerman</dc:creator><description>&lt;p&gt;A.P. Thank you. This is exactly what I wanted. Please check back in a day or so and I&amp;#39;ll open to piece together something. Maybe even a &amp;quot;stand alone&amp;quot; that others could use to add to contribute data on this.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/292430?ContentTypeID=1</link><pubDate>Tue, 02 Feb 2021 10:23:49 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8b243a07-6c0b-476d-8814-74041cd2dfd1</guid><dc:creator>A.P</dc:creator><description>&lt;p&gt;Hi dgerman!&lt;br /&gt;Not sure why, I wasn&amp;#39;t able to answer you directly before, but now I am.&lt;br /&gt;1. We first tested using FDS, but realized it was slowing us down, we moved to a lower level and used nrf_fstorage_read/write/erase functions. &lt;br /&gt;2. All subsequent reads returned an incorrect value, yes. However, I suspect that if you happen to write a &amp;#39;1&amp;#39; to the bit that is stuck as &amp;#39;1&amp;#39;, you&amp;#39;ll get a correct value read back to you. so you&amp;#39;ve got a 50% chance to be ok ;)&lt;br /&gt;3. I&amp;#39;ve added a skeletal structure of our tests in a separate comment. Hope it helps.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/292428?ContentTypeID=1</link><pubDate>Tue, 02 Feb 2021 10:21:07 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:363c1c5c-c197-475c-a0fa-4c9d56ddefae</guid><dc:creator>A.P</dc:creator><description>&lt;p&gt;Hi dgerman!&lt;br /&gt;&lt;br /&gt;I&amp;#39;m afraid I haven&amp;#39;t quite understood how to replay to specific messages, so I&amp;quot;m just pressing anywhere that says &amp;#39;reply&amp;#39;. I hope we can be able to piece together the message flow postmortem.&lt;br /&gt;At any rate, I&amp;#39;ve pieced together the portions of the test which are relevant to the Flash test as best I could. I&amp;#39;m not able to share our code as is, since it belongs to the company etc.&lt;br /&gt;We first tested using FDS, but realised it was slowing us down, we moved to a lower level and used nrf_fstorage_read/write/erase functions. &lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;#define IMG_SIZE 4096

__ALIGN(32) uint8_t img[IMG_SIZE] = {0};
__ALIGN(32) uint8_t img_copy[IMG_SIZE];

#define FLASH_START_ADDR 0x30000
bool write_finished = false, erase_finished = false;
void callback(nrf_fstorage_evt_t *p_evt)
{
    if (p_evt-&amp;gt;id == NRF_FSTORAGE_EVT_WRITE_RESULT) {
        NRFX_LOG_INFO(&amp;quot;flash write result event&amp;quot;);
        write_finished = true;
    }
    if (p_evt-&amp;gt;id == NRF_FSTORAGE_EVT_ERASE_RESULT) {
        NRFX_LOG_INFO(&amp;quot;erase write result event&amp;quot;);
        erase_finished = true;
    }
}
NRF_FSTORAGE_DEF(nrf_fstorage_t my_instance) = {
    .evt_handler = callback,
    .start_addr  = FLASH_START_ADDR,
    .end_addr    = FLASH_START_ADDR + 4096,
};


bool write_to_flash()
{
    ret_code_t rc = nrf_fstorage_write(&amp;amp;my_instance,     /* The instance to use. */
                                       FLASH_START_ADDR, /* The address in flash where to store the data. */
                                       img,              /* A pointer to the data. */
                                       IMG_SIZE,         /* Lenght of the data, in bytes. */
                                       NULL              /* Optional parameter, backend-dependent. */
    );
    if (rc == NRF_SUCCESS) {
        NRFX_LOG_INFO(&amp;quot;flash write success&amp;quot;);
        return true;
    } else {
        NRFX_LOG_ERROR(&amp;quot;flash write failure&amp;quot;);
        return false;
    }
}

bool read_from_flash()
{
    ret_code_t rc = nrf_fstorage_read(&amp;amp;my_instance,     /* The instance to use. */
                                      FLASH_START_ADDR, /* The address in flash where to read data from. */
                                      img_copy,         /* A buffer to copy the data into. */
                                      IMG_SIZE          /* Lenght of the data, in bytes. */
    );
    if (rc == NRF_SUCCESS) {
        NRFX_LOG_INFO(&amp;quot;flash read success&amp;quot;);
        for (int i = 0; i &amp;lt; IMG_SIZE; i++) {
            if (img[i] != img_copy[i]) {
                NRFX_LOG_ERROR(&amp;quot;flash read unequal at index %d&amp;quot;, i);
                return false;
            }
        }
        return true;
    } else {
        NRFX_LOG_ERROR(&amp;quot;flash read success&amp;quot;);
        return false;
    }
}

bool erase_from_flash()
{
    ret_code_t rc = nrf_fstorage_erase(&amp;amp;my_instance,     /* The instance to use. */
                                       FLASH_START_ADDR, /* The address of the flash pages to erase. */
                                       1,                /* The number of pages to erase. */
                                       NULL              /* Optional parameter, backend-dependent. */
    );
    if (rc == NRF_SUCCESS) {
        NRFX_LOG_INFO(&amp;quot;flash erase success&amp;quot;);
        return true;
    } else {
        NRFX_LOG_ERROR(&amp;quot;flash erase failure&amp;quot;);
        return false;
    }
}


/**@brief Function for application main entry.
 */
int main(void)
{
	  // Initialize.
    nrf_fstorage_init(&amp;amp;my_instance,     /* You fstorage instance, previously defined. */
                      &amp;amp;nrf_fstorage_sd, /* Name of the backend. */
                      NULL              /* Optional parameter, backend-dependant. */
    );
  
    log_init();

    // write_to_flash();
    // read_from_flash();
    // erase_from_flash();

    NRFX_LOG_INFO(&amp;quot;%s Starting: %s %s (%s)\n&amp;quot;, __func__, DEVICE_NAME, FIRMWARE_REV, MODEL_NUM);
    NRF_LOG_FLUSH();

	//TODO: write 0 value to whereever you save your results. I&amp;#39;ll just call it LOG from now on.

    bool     write_failed = false, gc_failed = false, read_failed = false;
    uint32_t write_cnt = 0, gc_cnt = 0, read_cnt = 0, fail_run_cnt = 0;

    bool use_170_and_not_85 = true;
	//170 binary is 1010..
	// 85 binary is 0101..

    while (true) {
        // if something has failed, never change it. just write to LOG every once in a long while to make sure it is on
        if (write_failed || gc_failed || read_failed) {
            ++fail_run_cnt;
            if (fail_run_cnt &amp;lt; 3) {
                NRFX_LOG_ERROR(&amp;quot;update fail LOG&amp;quot;);
                //TODO: write to your LOG the reason you&amp;#39;ve failed and the count.
            }
        } else {
            // flip all the bits every flash write-gc-read attempt
            if (use_170_and_not_85) {
                for (uint32_t i = 0; i &amp;lt; IMG_SIZE; i++) {
                    img[i] = 170;
                }
                use_170_and_not_85 = false;
            } else {
                for (uint32_t i = 0; i &amp;lt; IMG_SIZE; i++) {
                    img[i] = 85;
                }
                use_170_and_not_85 = true;
            }
            ++write_cnt;
            write_finished = false;
            bool write_ret = write_to_flash();
            while (nrf_fstorage_is_busy(&amp;amp;my_instance) &amp;amp;&amp;amp; !write_finished)
                ;
            if (write_ret) {
                ++read_cnt;
                bool read_ret = read_from_flash();

                if (read_ret) {
                    ++gc_cnt;
                    erase_finished = false;
                    bool gc_ret    = erase_from_flash();
                    while (nrf_fstorage_is_busy(&amp;amp;my_instance) &amp;amp;&amp;amp; !erase_finished)
                        ;
                    if (gc_ret) {
                    } else {
                        NRFX_LOG_ERROR(&amp;quot;flash gc #%llu failed!&amp;quot;, gc_cnt);
                        gc_failed = true;
                    }
                } else {

                    NRFX_LOG_ERROR(&amp;quot;flash read #%llu failed!&amp;quot;, read_cnt);
                    read_failed = true;
                }

            } else {
                NRFX_LOG_ERROR(&amp;quot;flash write #%llu failed!&amp;quot;, write_cnt);
                write_failed = true;
            }

            if (write_cnt % 256 == 0) {
                //TODO: write to your LOG the the result thus far, as it hasn&amp;#39;t failed yet.
            }
        }

        NRF_LOG_FLUSH();

        idle_state_handle();

        // nrf_delay_ms(10);

    } // end of for loop
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This by no means is bug proof, nor have I tested that it compiles. Its just the skeletal structure of our testing.&lt;br /&gt;I&amp;#39;ve added a &amp;#39;TODO&amp;#39; comment where I saw relevant.&lt;/p&gt;
&lt;p&gt;Please let me know if you find any problems in our logic, and do report on your findings once you have them.&lt;/p&gt;
&lt;p&gt;good luck!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/292320?ContentTypeID=1</link><pubDate>Mon, 01 Feb 2021 16:17:28 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:aeb78fb3-2945-4208-b1f5-7763ca4b82cb</guid><dc:creator>dgerman</dc:creator><description>&lt;p&gt;Was this test done using high level FDS. i.e&amp;nbsp;&lt;a class="code" title="Function for writing a record to flash." href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__fds.html#ga0114083241dc287c7145fe113c9adc2c"&gt;fds_record_write&lt;/a&gt;&amp;nbsp;,&amp;nbsp;&lt;a class="code" title="Function for searching for records with a given record key in a file." href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__fds.html#ga15112e682cc2c4771945fcf5816e3b1b"&gt;fds_record_find&lt;/a&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;a class="code" title="Function for opening a record for reading." href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__fds.html#gab718add23b30b0e663e48a781645879f"&gt;fds_record_open&lt;/a&gt;&amp;nbsp;?&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Does &amp;quot;&lt;span&gt;All subsequent reads returned an incorrect value from the flash.&amp;#39; mean that once a failure&amp;nbsp;&lt;/span&gt;occures &amp;nbsp;no successful WRITES can be performed&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/291778?ContentTypeID=1</link><pubDate>Thu, 28 Jan 2021 12:36:27 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ecbb7cec-a48a-49d7-8bd9-11319902a448</guid><dc:creator>A.P</dc:creator><description>&lt;p&gt;Hi!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
[quote userid="4240" url="~/f/nordic-q-a/69935/fds-and-write-erase-flash-cycles/291774#291774"]Does this correspond to the number of erase cycles on one flash page?[/quote]
&lt;p&gt;Yes it does.&lt;/p&gt;
[quote userid="4240" url="~/f/nordic-q-a/69935/fds-and-write-erase-flash-cycles/291774#291774"]I think you should account for that number when designing your product. E.g. by allocating as many flash pages as possible to improve wear leveling.&amp;nbsp; [/quote]
&lt;p&gt;Will do. In our app, with as many flash pages as possible, and the amount of data we expect to write to the flash, it is not realistic to expect the flash to reach the point of failure before the expected end of life for the product.&lt;br /&gt;Should that change, we will simply verify the CRC on every write to the flash (write --&amp;gt; read --&amp;gt; verify CRC is correct) and notify when the flash has started to fail. &lt;br /&gt;That should be enough for our purposes. &lt;/p&gt;
&lt;p&gt;Thanks for the support!&lt;br /&gt;&lt;br /&gt;BTW, if possible, I think we could benefit from a distribution graph, which I assume will be normal around X erase cycles, for the point at which the flash fails. This way we have both the absolute value (10,000) writes, and the average (X) so that we have a rough idea what to expect from the flash. That would require a few thousand devices to be sacrificed, which is outside the scope of what I&amp;#39;m willing to pay ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/291774?ContentTypeID=1</link><pubDate>Thu, 28 Jan 2021 12:23:01 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:31a885ee-4015-40c4-aed1-43ea8b85665f</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Thanks for the update. Intereseting results!&lt;/p&gt;
[quote user="A.P"]&lt;p&gt;First chip failed after 790,397 cycles.&lt;/p&gt;
&lt;p&gt;Second chip failed after 918,918 cycles.&lt;/p&gt;
&lt;p&gt;Third chip failed after 1,102,080 cycles.&lt;/p&gt;[/quote]
&lt;p&gt;&amp;nbsp;&amp;nbsp;Does this correspond to the number of erase cycles on one flash page?&lt;/p&gt;
[quote user="A.P"]So, it seems we can expect around 900 thousand cycles on each page flash, if my 3 samples are in any way a valid sample pool.&lt;br /&gt;Does Nordic have the distribution graph for flash fails per write-erase cycles anywhere?[/quote]
&lt;p&gt;&amp;nbsp;I am afraid I don&amp;#39;t have much data on this, it&amp;#39;s only that the endurance may be as low as 10 000 cycles as stated in the absoute maxium ratings section of the PS. And I think you should account for that number when designing your product. E.g. by allocating as many flash pages as possible to improve wear leveling.&amp;nbsp; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/291194?ContentTypeID=1</link><pubDate>Tue, 26 Jan 2021 08:42:37 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:29bbc12c-7217-4cf6-aa9f-a441dde873ac</guid><dc:creator>A.P</dc:creator><description>&lt;p&gt;Hi all!&lt;br /&gt;The interesting results are as follows:&lt;br /&gt;&lt;br /&gt;We&amp;#39;ve run a flash write-read-erase test and limited the pages used so that the same page is written to, read from, and then erased. Each cycle wrote to the entire page with the following pattern:&lt;/p&gt;
&lt;p&gt;A. Write 101010... read and compare. Erase.&lt;/p&gt;
&lt;p&gt;B. Write 010101... read and compare. Erase.&lt;/p&gt;
&lt;p&gt;C. Goto A.&lt;/p&gt;
&lt;p&gt;We did this on 3 nRF52840s and found the following:&lt;/p&gt;
&lt;p&gt;First chip failed after 790,397 cycles.&lt;/p&gt;
&lt;p&gt;Second chip failed after 918,918 cycles.&lt;/p&gt;
&lt;p&gt;Third chip failed after 1,102,080 cycles.&lt;br /&gt;&lt;br /&gt;All subsequent reads returned an incorrect value from the flash.&lt;br /&gt;&lt;br /&gt;So, it seems we can expect around 900 thousand cycles on each page flash, if my 3 samples are in any way a valid sample pool.&lt;br /&gt;Does Nordic have the distribution graph for flash fails per write-erase cycles anywhere?&lt;/p&gt;
&lt;p&gt;Is this expected to change in other chips? ex: nRF52833, nRF52820?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/287553?ContentTypeID=1</link><pubDate>Tue, 05 Jan 2021 15:02:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2479e8ca-c916-4f49-ac6c-e843399db2e6</guid><dc:creator>A.P</dc:creator><description>&lt;p&gt;Hi!&lt;br /&gt;&lt;br /&gt;Thank you for the reply!&lt;br /&gt;I&amp;#39;ll set up a test, hopefully in the upcoming days, and see what I get.&lt;br /&gt;If I get interesting results I&amp;#39;ll post them here as a reply.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks again!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/287538?ContentTypeID=1</link><pubDate>Tue, 05 Jan 2021 14:20:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:32c0290d-5bd0-4f59-8a77-e429be44af34</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I would not expect to get checksum failures during normal operation before the flash cells are starting to wear out, so I think any percentage is an indication that the flash is nearing its end of life. Maybe you can set up a stress test with FDS to see what actaully happens when you start exceeding 10 000 erase cycles? &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/287499?ContentTypeID=1</link><pubDate>Tue, 05 Jan 2021 12:10:50 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:68575f87-c1ee-4eed-a29a-c2a17db263bf</guid><dc:creator>A.P</dc:creator><description>&lt;p&gt;Hi Vidar!&lt;br /&gt;&lt;br /&gt;Thank you for the reply!&lt;br /&gt;I understand you can&amp;#39;t sign off on this, but I still would like to get an input from you on the following:&lt;br /&gt;Should I want to get some indication of whether or not a specific device flash is near its end of life, will checking the percentage of &lt;a href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__fds__config.html#ga9a5a098294d7e9699809813f6c2a62c9"&gt;FDS_CRC_CHECK_ON_WRITE&lt;/a&gt;&lt;span&gt;&lt;/span&gt; fails out of the total request be a reasonable indication?&lt;br /&gt;&lt;br /&gt;Meaning that if I write 100 times to the flash, and get 20% CRC write failed responses, that would be reasonable of me to assume that the flash has reached its end of life? Again, I&amp;#39;m not looking for absolutes, but rather some indication of the state of the flash.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: FDS and write/erase flash cycles</title><link>https://devzone.nordicsemi.com/thread/287465?ContentTypeID=1</link><pubDate>Tue, 05 Jan 2021 10:53:10 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:cb8c2099-e32f-4a4b-ba52-4dae10fac7f2</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;1. I&amp;#39;m not an expert on the physics of NOR flash, but I believe the common failure mode after flash cells has worn out is that single bits can get stuck at&amp;nbsp; the value&amp;nbsp; &amp;#39;1&amp;#39;. In other words, data will not get stored correctly if the write operation involves clearing of a stuck bit.&lt;/p&gt;
&lt;p&gt;The read operation should return the value as it was stored in flash.&lt;/p&gt;
&lt;p&gt;2. You can enable the &lt;a href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__fds__config.html#gad8d60841e16cc154e07146cf56215212"&gt;FDS_CRC_CHECK_ON_READ &lt;/a&gt;&lt;span&gt;configuration option to make FDS confirm the integrity of the read data&lt;/span&gt;. It will then return FDS_ERR_CRC_CHECK_FAILED back to the application if the readback is incorrect. But, as mentioned in point 1, I believe it&amp;#39;s more common for the error to occur during the write, and repeating the read operation will not help in that case.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. You can use&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__fds__config.html#ga9a5a098294d7e9699809813f6c2a62c9"&gt;FDS_CRC_CHECK_ON_WRITE&lt;/a&gt;&lt;span&gt;&lt;/span&gt; to check if data is stored correctly, and if not, implement a re-try mechanism (FDS will automatically shift to the next available address on next attempt). The CRC check should only start to fail when you are writing to a section of flash that has started to wear out.&lt;/p&gt;
&lt;p&gt;There is no HW support to keep track of the number write/erase cycles performed on each flash page.&amp;nbsp; Please keep in mind that 10 000 cycles is the minimum value according to spec. The typical value might be considerably higher.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. It provides basic wear leveling by&amp;nbsp; distributing the flash usage across several flash pages. The more flash pages you allocate to FDS, the less often you have to run Garbage collection and erase flash.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Vidar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>