<?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>topic Re: The need for RTOS Drivers in Kinetis Software Development Kit</title>
    <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/The-need-for-RTOS-Drivers/m-p/667091#M7322</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, Pedro,&lt;/P&gt;&lt;P&gt;Regarding your question, I think there are several&amp;nbsp; examples for the uart:&lt;/P&gt;&lt;P&gt;1)Polling_transfer: the example uses polling mode to read/write the uart data register, in other words, it polls the uart status register to check if the transmit register is empty or the receiver register is full.&lt;/P&gt;&lt;P&gt;2)interrupt example: it uses interrupt mechanism to write/read uart data register, in detail, in the ISR of uart transmitter, it write data register.&lt;/P&gt;&lt;P&gt;2)interrupt_transfer example: Firstly, it uses interrupt mechanism to write/read uart data registers, but it defines a structure&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uart_transfer_t sendXfer;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uart_transfer_t receiveXfer;&lt;/P&gt;&lt;P&gt;when the block of data has been transfered completely, a callback function is called.&lt;/P&gt;&lt;P&gt;3)the interrupt_ring_buffer_transfer uses ring buffer, the other is the same as interrupt_transfer example, the edma_interrupt uses edma to transfer data.&lt;/P&gt;&lt;P&gt;4)there is an example located at:C:\DriverE\Freescale\SDK2.0_K22FProcessor\boards\twrk21f120m\rtos_examples\freertos_uart&lt;/P&gt;&lt;P&gt;The example is based on interrupt_transfer example, it create a task, in the task, the code is blocked at&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 &amp;gt; UART_RTOS_Send(&amp;amp;handle, (uint8_t *)to_send, strlen(to_send)))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINTF("Error during UART send.\r\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vTaskSuspend(NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;especially the line ev = xEventGroupWaitBits(handle-&amp;gt;tx_event, RTOS_UART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);&lt;/P&gt;&lt;P&gt;when the block of data has been tranfered and the callback is called, the callback function will post the handle-&amp;gt;tx_event, following code is running.&lt;/P&gt;&lt;P&gt;Hope it can help you&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;Xiangjun Rong&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;int UART_RTOS_Send(uart_rtos_handle_t *handle, const uint8_t *buffer, uint32_t length)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventBits_t ev;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int retval = kStatus_Success;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == handle-&amp;gt;base)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Invalid handle. */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 == length)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == buffer)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_InvalidArgument;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pdFALSE == xSemaphoreTake(handle-&amp;gt;tx_sem, 0))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We could not take the semaphore, exit with 0 data received */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle-&amp;gt;tx_xfer.data = (uint8_t *)buffer;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle-&amp;gt;tx_xfer.dataSize = (uint32_t)length;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xEventGroupClearBits(handle-&amp;gt;tx_event, RTOS_UART_COMPLETE);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Non-blocking call */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART_TransferSendNonBlocking(handle-&amp;gt;base, handle-&amp;gt;t_state, &amp;amp;handle-&amp;gt;tx_xfer);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ev = xEventGroupWaitBits(handle-&amp;gt;tx_event, RTOS_UART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(ev &amp;amp; RTOS_UART_COMPLETE))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pdFALSE == xSemaphoreGive(handle-&amp;gt;tx_sem))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We could not post the semaphore, exit with error */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return retval;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;callback function,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;C:\DriverE\Freescale\SDK2.0_K22FProcessor\boards\twrk21f120m\driver_examples\uart&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="pastedImage_1.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/24330i7074B49FFCF7CAF8/image-size/large?v=v2&amp;amp;px=999" role="button" title="pastedImage_1.png" alt="pastedImage_1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 30 Jun 2017 06:51:45 GMT</pubDate>
    <dc:creator>xiangjun_rong</dc:creator>
    <dc:date>2017-06-30T06:51:45Z</dc:date>
    <item>
      <title>The need for RTOS Drivers</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/The-need-for-RTOS-Drivers/m-p/667090#M7321</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello everybody,&lt;/P&gt;&lt;P&gt;I am working on examples from the kinetis SDK 2.0 for the processor KV31F specifically the UART driver at the moment. Looking at the examples and the API, there are three drivers I could use: the UART Driver, the one using DMA and finally the UART FreeRTOS Driver. Since I would like to use the freeRTOS I was wondering why is there a need for an specific driver just to use with an RTOS. Why couldn't I just call the regular UART API inside an RTOS Task? Besides, is it possible or advisible to use the DMA Driver with the FreeRTOS?&lt;BR /&gt;I know my question is more theoretical than usual, but still I think it is a good point for discussion!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 21 Jun 2017 01:16:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/The-need-for-RTOS-Drivers/m-p/667090#M7321</guid>
      <dc:creator>PedroCastro</dc:creator>
      <dc:date>2017-06-21T01:16:05Z</dc:date>
    </item>
    <item>
      <title>Re: The need for RTOS Drivers</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/The-need-for-RTOS-Drivers/m-p/667091#M7322</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, Pedro,&lt;/P&gt;&lt;P&gt;Regarding your question, I think there are several&amp;nbsp; examples for the uart:&lt;/P&gt;&lt;P&gt;1)Polling_transfer: the example uses polling mode to read/write the uart data register, in other words, it polls the uart status register to check if the transmit register is empty or the receiver register is full.&lt;/P&gt;&lt;P&gt;2)interrupt example: it uses interrupt mechanism to write/read uart data register, in detail, in the ISR of uart transmitter, it write data register.&lt;/P&gt;&lt;P&gt;2)interrupt_transfer example: Firstly, it uses interrupt mechanism to write/read uart data registers, but it defines a structure&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uart_transfer_t sendXfer;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uart_transfer_t receiveXfer;&lt;/P&gt;&lt;P&gt;when the block of data has been transfered completely, a callback function is called.&lt;/P&gt;&lt;P&gt;3)the interrupt_ring_buffer_transfer uses ring buffer, the other is the same as interrupt_transfer example, the edma_interrupt uses edma to transfer data.&lt;/P&gt;&lt;P&gt;4)there is an example located at:C:\DriverE\Freescale\SDK2.0_K22FProcessor\boards\twrk21f120m\rtos_examples\freertos_uart&lt;/P&gt;&lt;P&gt;The example is based on interrupt_transfer example, it create a task, in the task, the code is blocked at&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 &amp;gt; UART_RTOS_Send(&amp;amp;handle, (uint8_t *)to_send, strlen(to_send)))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINTF("Error during UART send.\r\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vTaskSuspend(NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;especially the line ev = xEventGroupWaitBits(handle-&amp;gt;tx_event, RTOS_UART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);&lt;/P&gt;&lt;P&gt;when the block of data has been tranfered and the callback is called, the callback function will post the handle-&amp;gt;tx_event, following code is running.&lt;/P&gt;&lt;P&gt;Hope it can help you&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;Xiangjun Rong&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;int UART_RTOS_Send(uart_rtos_handle_t *handle, const uint8_t *buffer, uint32_t length)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventBits_t ev;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int retval = kStatus_Success;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == handle-&amp;gt;base)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Invalid handle. */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 == length)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == buffer)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_InvalidArgument;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pdFALSE == xSemaphoreTake(handle-&amp;gt;tx_sem, 0))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We could not take the semaphore, exit with 0 data received */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle-&amp;gt;tx_xfer.data = (uint8_t *)buffer;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle-&amp;gt;tx_xfer.dataSize = (uint32_t)length;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xEventGroupClearBits(handle-&amp;gt;tx_event, RTOS_UART_COMPLETE);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Non-blocking call */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART_TransferSendNonBlocking(handle-&amp;gt;base, handle-&amp;gt;t_state, &amp;amp;handle-&amp;gt;tx_xfer);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ev = xEventGroupWaitBits(handle-&amp;gt;tx_event, RTOS_UART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(ev &amp;amp; RTOS_UART_COMPLETE))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pdFALSE == xSemaphoreGive(handle-&amp;gt;tx_sem))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We could not post the semaphore, exit with error */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = kStatus_Fail;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return retval;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;callback function,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;C:\DriverE\Freescale\SDK2.0_K22FProcessor\boards\twrk21f120m\driver_examples\uart&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="pastedImage_1.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/24330i7074B49FFCF7CAF8/image-size/large?v=v2&amp;amp;px=999" role="button" title="pastedImage_1.png" alt="pastedImage_1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Jun 2017 06:51:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/The-need-for-RTOS-Drivers/m-p/667091#M7322</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2017-06-30T06:51:45Z</dc:date>
    </item>
  </channel>
</rss>

