<?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>MQX Software SolutionsのトピックRe: MQX releasing a semaphore in a interrupt handler</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-releasing-a-semaphore-in-a-interrupt-handler/m-p/394132#M13220</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Vivek,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Which exact functions are you calling within interrupts?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please refer to &lt;STRONG&gt;&lt;EM&gt;'MQX RTOS Reference Manual.pdf'&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM&gt; &lt;/EM&gt;located in C:\Freescale\KSDK_1.2.0\doc\rtos\mqx&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note that many of the lwsem functions cannot be called from interrupts.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 04 Sep 2015 00:18:30 GMT</pubDate>
    <dc:creator>Carlos_Musich</dc:creator>
    <dc:date>2015-09-04T00:18:30Z</dc:date>
    <item>
      <title>MQX releasing a semaphore in a interrupt handler</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-releasing-a-semaphore-in-a-interrupt-handler/m-p/394131#M13219</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello everyone,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using KSDK_1.2.0 with twrk65f180m.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Initially I tested the uart_edma_blocking example with bare metal and it worked fine.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then I copied the example under a thread in an application which uses MQX operating system.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Basically I copied the below code into a thread (this is the only thread in that application). I commented out hardware_init() and OSA_Init() since they are already done. I have also disabled BSPCFG_ENABLE_IO_SUBSYSTEM since I want to use the uart_edma_blocking&amp;nbsp; example instead.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t dmaRxChar&amp;nbsp; = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t byteCountBuff = 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Store runtime state structure for the eDMA driver&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; edma_state_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Store runtime state structure for UART driver with EDMA&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uart_edma_state_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uartStateEdma;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Config the eDMA driver&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; edma_user_config_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userConfig = {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .chnArbitration&amp;nbsp; = kEDMAChnArbitrationRoundrobin,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .notHaltOnError&amp;nbsp; = false&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Config the UART driver&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uart_edma_user_config_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uartConfig = {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bitCountPerChar = kUart8BitsPerChar,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .parityMode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = kUartParityDisabled,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .stopBitCount&amp;nbsp;&amp;nbsp;&amp;nbsp; = kUartOneStopBit,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .baudRate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = BOARD_DEBUG_UART_BAUD&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Enable clock for PORTs, setup board clock source, config pin&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //hardware_init();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Call OSA_Init to setup LP Timer for timeout&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //OSA_Init();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;#if defined (TEST_CODE)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; semaphore_t testSemaphore;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSA_SemaCreate(&amp;amp;testSemaphore, 0);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; osa_status_t syncStatus = OSA_SemaWait(&amp;amp;testSemaphore, 1000u);&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize EDMA module for UART&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_DRV_Init(&amp;amp;state, &amp;amp;userConfig);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART_DRV_EdmaInit(BOARD_DEBUG_UART_INSTANCE, &amp;amp;uartStateEdma, &amp;amp;uartConfig);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inform to start dma-uart blocking example&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byteCountBuff = sizeof(buffStart);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART_DRV_EdmaSendDataBlocking(BOARD_DEBUG_UART_INSTANCE, buffStart, byteCountBuff, 0u);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inform user of what to do&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byteCountBuff = sizeof(bufferData1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART_DRV_EdmaSendDataBlocking(BOARD_DEBUG_UART_INSTANCE, bufferData1, byteCountBuff, 0u);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(true)&lt;/P&gt;&lt;P&gt;&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; // Wait to receive input data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (kStatus_UART_Success == UART_DRV_EdmaReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE, &amp;amp;dmaRxChar,1, OSA_WAIT_FOREVER))&lt;/P&gt;&lt;P&gt;&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;&amp;nbsp;&amp;nbsp; // Echo received character&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;&amp;nbsp; UART_DRV_EdmaSendDataBlocking(BOARD_DEBUG_UART_INSTANCE, &amp;amp;dmaRxChar, 1u, 0u);&lt;/P&gt;&lt;P&gt;&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; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It sends the first set of data (buffStart) to the terminal after which it crashes and goes to hardfault handler.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The problem is when I step through the code it does not crash. I can see that the DMA interrupt happens. The call back function (UART_DRV_EdmaCompleteSendData) is called which posts the semaphore (txIrqSync). It continues to send the second set of data (bufferData1).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm not sure if I'm doing something wrong here. If I create, pend and release the semaphore outside an interrupt handler, I don't see this issue happening. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm not sure if I have to do some kind of critical section protection here. Not much information available on the MQX reference manual.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any help is greatly appreciated.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 25 Aug 2015 01:50:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-releasing-a-semaphore-in-a-interrupt-handler/m-p/394131#M13219</guid>
      <dc:creator>viveksrinivasan</dc:creator>
      <dc:date>2015-08-25T01:50:41Z</dc:date>
    </item>
    <item>
      <title>Re: MQX releasing a semaphore in a interrupt handler</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-releasing-a-semaphore-in-a-interrupt-handler/m-p/394132#M13220</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Vivek,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Which exact functions are you calling within interrupts?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please refer to &lt;STRONG&gt;&lt;EM&gt;'MQX RTOS Reference Manual.pdf'&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM&gt; &lt;/EM&gt;located in C:\Freescale\KSDK_1.2.0\doc\rtos\mqx&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note that many of the lwsem functions cannot be called from interrupts.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Sep 2015 00:18:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-releasing-a-semaphore-in-a-interrupt-handler/m-p/394132#M13220</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2015-09-04T00:18:30Z</dc:date>
    </item>
  </channel>
</rss>

