<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC MicrocontrollersのトピックBug in romdiv_11u6x.c, solution but why?</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Bug-in-romdiv-11u6x-c-solution-but-why/m-p/579796#M20121</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by cappo85 on Tue Jul 14 06:45:41 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi to all,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I use lpcopen_2_06_keil_iar_manley_11u68 in IAR EWARM, int file romdiv_11u6x.c this routines:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs IDIV_RETURN_T __aeabi_idivmod(int numerator, int denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return pROMDiv-&amp;gt;sidivmod(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* Redirector of unsigned 32 bit integer divider with reminder to ROM routine */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs UIDIV_RETURN_T __aeabi_uidivmod(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pROMDiv-&amp;gt;uidivmod(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;don't works.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I think that the problem is __value_in_regs, so I have change code as follows:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;solution 1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs UIDIV_RETURN_T __aeabi_uidivmod1(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UIDIV_RETURN_T result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (pROMDiv-&amp;gt;uidivmod(numerator, denominator));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;or&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;UIDIV_RETURN_T __aeabi_uidivmod3(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (pROMDiv-&amp;gt;uidivmod)(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and works perfectly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have an idea but I'd like to have more information from you....&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the original case the function that must return more than argument return a result of a function that can't return more than an argument. So in solution 1 declaring variable result I reserve registers and when "pROMDiv-&amp;gt;uidivmod" return there are register where return the values. But in routine 2&amp;nbsp; isn't so.... and why it works....Why????&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Riccardo Capponi&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 20:18:21 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T20:18:21Z</dc:date>
    <item>
      <title>Bug in romdiv_11u6x.c, solution but why?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Bug-in-romdiv-11u6x-c-solution-but-why/m-p/579796#M20121</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by cappo85 on Tue Jul 14 06:45:41 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi to all,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I use lpcopen_2_06_keil_iar_manley_11u68 in IAR EWARM, int file romdiv_11u6x.c this routines:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs IDIV_RETURN_T __aeabi_idivmod(int numerator, int denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return pROMDiv-&amp;gt;sidivmod(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* Redirector of unsigned 32 bit integer divider with reminder to ROM routine */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs UIDIV_RETURN_T __aeabi_uidivmod(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pROMDiv-&amp;gt;uidivmod(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;don't works.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I think that the problem is __value_in_regs, so I have change code as follows:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;solution 1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs UIDIV_RETURN_T __aeabi_uidivmod1(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UIDIV_RETURN_T result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (pROMDiv-&amp;gt;uidivmod(numerator, denominator));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;or&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;UIDIV_RETURN_T __aeabi_uidivmod3(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (pROMDiv-&amp;gt;uidivmod)(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and works perfectly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have an idea but I'd like to have more information from you....&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the original case the function that must return more than argument return a result of a function that can't return more than an argument. So in solution 1 declaring variable result I reserve registers and when "pROMDiv-&amp;gt;uidivmod" return there are register where return the values. But in routine 2&amp;nbsp; isn't so.... and why it works....Why????&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Riccardo Capponi&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:18:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Bug-in-romdiv-11u6x-c-solution-but-why/m-p/579796#M20121</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:18:21Z</dc:date>
    </item>
    <item>
      <title>Re: Bug in romdiv_11u6x.c, solution but why?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Bug-in-romdiv-11u6x-c-solution-but-why/m-p/579797#M20122</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by cappo85 on Tue Jul 14 07:58:06 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi to all,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;the solution is here:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A _jive_internal="true" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fhttp%3A%2F%2Finfocenter.arm.com%2Fhelp%2Findex.jsp%3Ftopic%3D%2Fcom.arm.doc.dui0348c%2FBABCBHJH.html" rel="nofollow" target="_blank"&gt;ARM Information Center&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;"A C++ function cannot return a __value_in_regs structure if the structure requires copy constructing."&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;in case:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs IDIV_RETURN_T __aeabi_idivmod(int numerator, int denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return pROMDiv-&amp;gt;sidivmod(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;function __aeabi_idivmod can try to return a function that require a copy, where the result is in stack and not in resgister, so the core use the register and destroy the information and DOESN'T WORKS.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;in case :&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__value_in_regs UIDIV_RETURN_T __aeabi_uidivmod1(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;UIDIV_RETURN_T result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;result = (pROMDiv-&amp;gt;uidivmod(numerator, denominator));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;function (pROMDiv-&amp;gt;uidivmod(numerator, denominator)) return values in stack and copy in to result and then __aeabi_uidivmod1 return result in register.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;in case:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;UIDIV_RETURN_T __aeabi_uidivmod3(unsigned numerator, unsigned denominator)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROM_DIV_API_T const *pROMDiv = LPC_ROM_API-&amp;gt;divApiBase;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return (pROMDiv-&amp;gt;uidivmod)(numerator, denominator);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;function __aeabi_uidivmod3 that return a values in stack, return the value form a&amp;nbsp; (pROMDiv-&amp;gt;uidivmod)(numerator, denominator); that returns value in stack!!!!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In attach you can find the correct file.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Riccardo Capponi&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:18:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Bug-in-romdiv-11u6x-c-solution-but-why/m-p/579797#M20122</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:18:21Z</dc:date>
    </item>
  </channel>
</rss>

