<?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>CodeWarrior Development Tools中的主题 Re: Pointer to struct for FlexCAN</title>
    <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491552#M4063</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Alice,&lt;/P&gt;&lt;P&gt;I think the pTxMBox pointer is optimized by the compiler.&lt;/P&gt;&lt;P&gt;I added a line just before the pointer usage:&lt;/P&gt;&lt;P&gt;volatile PMBox pTxMBx=(PMBox)&amp;amp;g_pCanReg-&amp;gt;MB[TX_MB_num];&lt;/P&gt;&lt;P&gt;pTxMBx-&amp;gt;CS &amp;amp;= ~(CAN_CS_CODE_MASK); &lt;/P&gt;&lt;P&gt;pTxMBx-&amp;gt;CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That works.&lt;/P&gt;&lt;P&gt;But the question is why the compiler optimized out a volatile pointer?&lt;/P&gt;&lt;P&gt;how to prevent from being optimized out?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 29 Feb 2016 14:53:21 GMT</pubDate>
    <dc:creator>davidzhou</dc:creator>
    <dc:date>2016-02-29T14:53:21Z</dc:date>
    <item>
      <title>Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491549#M4060</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;volatile PMBox pTxMB= (PMBox)&amp;amp;(g_pCanReg-&amp;gt;MB[TX_MB_num]);&lt;/P&gt;&lt;P&gt;while (1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dwTxDLC = (dwTxDlen &amp;lt;&amp;lt; CAN_CS_DLC_SHIFT);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;CS |= CAN_CS_CODE(CAN_TX_MSG_BUFFER_NOT_ACTIVE); &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;WORD0 = dwData0++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;WORD1 = htonl(dwData1++);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_ONCE) | dwTxDLC);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dwRTRBit = pTxMB-&amp;gt;CS; // check for RTR bit&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if ((dwRTRBit &amp;amp; CAN_CS_RTR_MASK) == CAN_CS_RTR_MASK) {&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iRTRNotSetCount++;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;&lt;P&gt;&amp;nbsp; else if ((dwRTRBit &amp;amp; CAN_CS_CODE(CAN_TX_MSG_BUFFER_NOT_ACTIVE))== CAN_CS_CODE(CAN_TX_MSG_BUFFER_NOT_ACTIVE)) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; //Version 1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; g_pCanReg-&amp;gt;MB[TX_MB_num].CS &amp;amp;= ~(CAN_CS_CODE_MASK);&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; g_pCanReg-&amp;gt;MB[TX_MB_num].CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; //Version 2&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; //pTxMB-&amp;gt;CS &amp;amp;= ~(CAN_CS_CODE_MASK); // Reset the code &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; //pTxMB-&amp;gt;CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);&lt;/P&gt;&lt;P&gt;&amp;nbsp; //Version 3&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; //pTxMB-&amp;gt;CS = pTxMB-&amp;gt;CS &amp;amp; ~(CAN_CS_CODE_MASK); // Reset the code &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; //pTxMB-&amp;gt;CS = pTxMB-&amp;gt;CS | (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);&lt;/P&gt;&lt;P&gt;iRTRSetCount++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; // other code omitted ....&lt;/P&gt;&lt;P&gt;} //endof while&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I tried three versions code as above. But only //version 1 works. I don't know why version2 and version 3 behave differently as version 1.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David Zhou&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 26 Feb 2016 21:52:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491549#M4060</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-02-26T21:52:45Z</dc:date>
    </item>
    <item>
      <title>Re: Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491550#M4061</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello David,&lt;/P&gt;&lt;P&gt;About this "volatile PMBox pTxMB= (PMBox)&amp;amp;(g_pCanReg-&amp;gt;MB[TX_MB_num]);"&lt;/P&gt;&lt;P&gt;do you&amp;nbsp; want to forced the "(g_pCanReg-&amp;gt;MB[TX_MB_num])" into "PMBox" ? If yes, here is not&lt;/P&gt;&lt;P&gt;need "&amp;amp;" , i think the right way is&lt;/P&gt;&lt;P&gt;volatile PMBox pTxMB= (PMBox)(g_pCanReg-&amp;gt;MB[TX_MB_num]);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope it helps&lt;/P&gt;&lt;P&gt;Alice&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 29 Feb 2016 03:27:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491550#M4061</guid>
      <dc:creator>Alice_Yang</dc:creator>
      <dc:date>2016-02-29T03:27:11Z</dc:date>
    </item>
    <item>
      <title>Re: Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491551#M4062</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Alice,&lt;/P&gt;&lt;P&gt;Sorry for not making clear with PMBox. It is a pointer to the MB struct. I want to force it to the fixed index of MB[16] array. The pointer assignment to the member of MB array is correct.&lt;/P&gt;&lt;P&gt;volatile PMBox pTxMB= (PMBox)&amp;amp;(g_pCanReg-&amp;gt;MB[TX_MB_num]);&lt;/P&gt;&lt;P&gt;(without &amp;amp; operator, compilation error).&lt;/P&gt;&lt;P&gt;In the Read Thread, I had pRxMB replaced g_pCanReg-&amp;gt;MB[RX_MB_num]. It works.&lt;/P&gt;&lt;P&gt;But in the Write Thread, all pTxMB pointer replaces all g_pCanReg-&amp;gt;MB[TX_MB_num].&lt;/P&gt;&lt;P&gt;except:&lt;/P&gt;&lt;P&gt;g_pCanReg-&amp;gt;MB[TX_MB_num].CS &amp;amp;= ~(CAN_CS_CODE_MASK);&lt;/P&gt;&lt;P&gt;g_pCanReg-&amp;gt;MB[TX_MB_num].CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);&lt;/P&gt;&lt;P&gt;If the above two lines are replaced with pMBox pointer, it has weird behavior.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 29 Feb 2016 13:39:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491551#M4062</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-02-29T13:39:42Z</dc:date>
    </item>
    <item>
      <title>Re: Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491552#M4063</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Alice,&lt;/P&gt;&lt;P&gt;I think the pTxMBox pointer is optimized by the compiler.&lt;/P&gt;&lt;P&gt;I added a line just before the pointer usage:&lt;/P&gt;&lt;P&gt;volatile PMBox pTxMBx=(PMBox)&amp;amp;g_pCanReg-&amp;gt;MB[TX_MB_num];&lt;/P&gt;&lt;P&gt;pTxMBx-&amp;gt;CS &amp;amp;= ~(CAN_CS_CODE_MASK); &lt;/P&gt;&lt;P&gt;pTxMBx-&amp;gt;CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That works.&lt;/P&gt;&lt;P&gt;But the question is why the compiler optimized out a volatile pointer?&lt;/P&gt;&lt;P&gt;how to prevent from being optimized out?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 29 Feb 2016 14:53:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491552#M4063</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-02-29T14:53:21Z</dc:date>
    </item>
    <item>
      <title>Re: Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491553#M4064</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello David,&lt;/P&gt;&lt;P&gt;Sorry i misunderstand it .&lt;/P&gt;&lt;P&gt;And when you define the structure of "PMBox",&amp;nbsp; have you use the "volatile" ?&lt;/P&gt;&lt;P&gt;If not, please try use it . Do you use CodeWarrior IDE?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;Alice&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 01 Mar 2016 03:35:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491553#M4064</guid>
      <dc:creator>Alice_Yang</dc:creator>
      <dc:date>2016-03-01T03:35:17Z</dc:date>
    </item>
    <item>
      <title>Re: Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491554#M4065</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello David&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Arial','sans-serif';"&gt;The pointers to volatile variables are very common, especially with memory-mapped I/O registers.&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Arial','sans-serif';"&gt;When you define a pointer using volatile keyword like below, the pointer itself is not volatile, but the object it points&amp;nbsp; to (in your case, g_pCanReg-&amp;gt;MB[TX_MB_num]) is volatile. So the compiler may optimize on your pointer. &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.0pt; font-family: 'Arial','sans-serif';"&gt;volatile PMBox pTxMBx=(PMBox)&amp;amp;g_pCanReg-&amp;gt;MB[TX_MB_num];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Arial','sans-serif';"&gt;If you want to define a volatile pointer, it should be: &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.0pt; font-family: 'Arial','sans-serif';"&gt;PMBox volatile pTxMBx=(PMBox)&amp;amp;g_pCanReg-&amp;gt;MB[TX_MB_num];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.0pt; font-family: 'Arial','sans-serif';"&gt;However, volatile pointers to non-volatile data are rare in common use. &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.0pt; font-family: 'Arial','sans-serif';"&gt;For details, please refer to this link:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.0pt; font-family: 'Arial','sans-serif';"&gt;&lt;A href="http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword"&gt;http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards&lt;/P&gt;&lt;P&gt;Fiona Kuang&lt;/P&gt;&lt;P&gt;Technical Information &amp;amp; Commercial Support&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 01 Mar 2016 06:50:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491554#M4065</guid>
      <dc:creator>TICS_Fiona</dc:creator>
      <dc:date>2016-03-01T06:50:37Z</dc:date>
    </item>
    <item>
      <title>Re: Pointer to struct for FlexCAN</title>
      <link>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491555#M4066</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Fiona &amp;amp; Alice,&lt;/P&gt;&lt;P&gt;This is a weird problem, I added volatile to many places, it still doesn't work. Let me explain here:&lt;/P&gt;&lt;P&gt;The Can Mem Map structure is redefined as:&lt;/P&gt;&lt;P&gt;typedef struct { &lt;/P&gt;&lt;P&gt;&amp;nbsp; volatile uint32_t CS; &lt;/P&gt;&lt;P&gt;&amp;nbsp; volatile uint32_t ID; &lt;/P&gt;&lt;P&gt;&amp;nbsp; volatile uint32_t WORD0; &lt;/P&gt;&lt;P&gt;&amp;nbsp; volatile uint32_t WORD1; &lt;/P&gt;&lt;P&gt;} MBox, *PMBox;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;typedef struct CanMemMap {&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t MCR; &lt;/P&gt;&lt;P&gt;&amp;nbsp; //omitted...&lt;/P&gt;&lt;P&gt;&amp;nbsp; volatile MBox MB[16];&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint8_t RESERVED_3[1792];&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t RXIMR[16]; &lt;/P&gt;&lt;P&gt;} volatile *CanMemMapPtr;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//for CanReadTask: -I replaced MB[index] with a pointer. It works OK.&lt;/P&gt;&lt;P&gt;void CanRead_Task(uint32_t param) {&lt;/P&gt;&lt;P&gt;PMBox pMB= (PMBox)&amp;amp;(g_pCanReg-&amp;gt;MB[RX_MB_num]);&amp;nbsp; //not even use volatile&lt;/P&gt;&lt;P&gt;while (1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (_lwevent_wait_ticks(&amp;amp;lwEvent, 1 &amp;lt;&amp;lt; RX_MB_num, FALSE, 0) != MQX_OK) { &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMB-&amp;gt;CS;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwID = -1; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwDLen = pMB-&amp;gt;CS &amp;amp; CAN_CS_DLC_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwDLC = dwDLen &amp;gt;&amp;gt; CAN_CS_DLC_SHIFT;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (dwFormat == FLEXCAN_STANDARD) {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwID = ((pMB-&amp;gt;ID &amp;amp; CAN_ID_STD_MASK) &amp;gt;&amp;gt; CAN_ID_STD_SHIFT);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bCode = (uint8_t) (pMB-&amp;gt;CS &amp;gt;&amp;gt; CAN_CS_CODE_SHIFT); &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bCode == CAN_RX_MSG_BUFFER_FULL) {&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData0 = pMB-&amp;gt;WORD0 ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData1 = pMB-&amp;gt;WORD1 ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMB-&amp;gt;WORD0 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMB-&amp;gt;WORD1 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMB-&amp;gt;CS &amp;amp;= ~(CAN_CS_CODE_MASK); &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMB-&amp;gt;CS |= (CAN_CS_CODE(CAN_RX_MSG_BUFFER_EMPTY) | dwDLen); &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_pCanReg-&amp;gt;TIMER; //FLEXCAN_Unlock_mailbox(CAN_DEVICE);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_Request_message(CAN_DEVICE, RX_remote_MB_num, dwFormat);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _time_delay(1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//for CanTxTask&amp;nbsp; -&lt;/P&gt;&lt;P&gt;void CanWrite_Task(uint32_t param) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; volatile PMBox volatile pTxMB= (PMBox)&amp;amp;(g_pCanReg-&amp;gt;MB[TX_MB_num]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; while (1) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwTxDLC = (dwTxDlen &amp;lt;&amp;lt; CAN_CS_DLC_SHIFT);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;CS |= CAN_CS_CODE(CAN_TX_MSG_BUFFER_NOT_ACTIVE); &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;WORD0 = g_aCanTxBuf[bCanTxBufTail].WORD0; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;WORD1 = g_aCanTxBuf[bCanTxBufTail].WORD1; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_ONCE) | dwTxDLC); &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwRTRBit = pTxMB-&amp;gt;CS; // check for RTR bit&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((dwRTRBit &amp;amp; CAN_CS_CODE(CAN_TX_MSG_BUFFER_NOT_ACTIVE))==&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_CS_CODE(CAN_TX_MSG_BUFFER_NOT_ACTIVE)) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //volatile PMBox pTxMBx= (PMBox)&amp;amp;(g_pCanReg-&amp;gt;MB[TX_MB_num]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;CS &amp;amp;= ~(CAN_CS_CODE_MASK); //LineA&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTxMB-&amp;gt;CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);//LineB&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //g_pCanReg-&amp;gt;MB[TX_MB_num].CS &amp;amp;= ~(CAN_CS_CODE_MASK);//LineC&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //g_pCanReg-&amp;gt;MB[TX_MB_num].CS |= (CAN_CS_CODE(CAN_MESSAGE_TRANSMIT_RESPONED) | dwTxDLC);//LineD&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _time_delay(1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;Note: (both tasks are based on FlexCan/test.c in the example folder. some code is omitted for clearness.) &lt;/P&gt;&lt;P&gt;If pTxMBx is defined, and LineA and LineB are pTxMBx-&amp;gt;, then it transmits CAN messages. (OK)&lt;/P&gt;&lt;P&gt;if use LineC, and LineD to replace LineA and LineB, it also works.&lt;/P&gt;&lt;P&gt;I checked pTxMB address, it points to the right memory. It never changes. But only LineA and LineB can not use pTxMB pointer. Otherwise, it doesn't transmit CAN messages. (or may have one message transmitted).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;David&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 01 Mar 2016 14:23:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/CodeWarrior-Development-Tools/Pointer-to-struct-for-FlexCAN/m-p/491555#M4066</guid>
      <dc:creator>davidzhou</dc:creator>
      <dc:date>2016-03-01T14:23:03Z</dc:date>
    </item>
  </channel>
</rss>

