• <noframes id="6fok0"><bdo id="6fok0"><listing id="6fok0"></listing></bdo>
    <ruby id="6fok0"></ruby>

    <progress id="6fok0"></progress>
  • <progress id="6fok0"></progress>
    <ruby id="6fok0"><table id="6fok0"></table></ruby>
  • <progress id="6fok0"><u id="6fok0"><form id="6fok0"></form></u></progress>

    24小時(shí)聯(lián)系電話(huà):18217114652、13661815404

    中文

    您當前的位置:
    首頁(yè)>
    電子資訊>
    行業(yè)資訊>
    帶外部RAM的AVR上的Fr...

    行業(yè)資訊

    帶外部RAM的AVR上的FreeRTOS


    由于片內RAM較低,因此AVR微控制器不是運行FreeRTOS調度程序的最佳選擇。Atmega128僅具有4K RAM,因此這將FreeRTOS功能限制為非?;镜墓δ?。無(wú)論如何,可以通過(guò)添加可能連接到外部存儲器接口的額外RAM來(lái)解決此問(wèn)題。以前我們已經(jīng)構建了8K的外部存儲塊,所以現在我們可以使用FreeRTOS應用程序對其進(jìn)行測試。



      讓我們繼續前面的代碼,該代碼運行一些簡(jiǎn)單的任務(wù)(按鈕狀態(tài)讀取,LCD輸出和LED閃光燈),并且我們可以添加更多內容。我們將建立一個(gè)用于存儲堆的外部RAM。這將允許存儲大型數據緩沖區,而不必過(guò)多擔心堆和棧的重疊。


      首先,我們需要注意鏈接器選項。在A(yíng)VRStudio5項目屬性中,AVR / GNU C鏈接器->其他輸入鏈接器選項:

     
      <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">-Wl,-defsym = __ heap_start = 0x801100,-defsym = __ heap_end = 0x8030ff</font></font>


      這將指示鏈接器僅將0x801100到0x8030ff(整個(gè)外部RAM)的內存區域用于堆。
      第二步是設置微控制器以使用外部存儲器。為了使內容整潔和模塊化,我們將創(chuàng )建單獨的驅動(dòng)程序源文件xmem.c和xmem.h。并編寫(xiě)簡(jiǎn)單的XMEM_init()函數:

      <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">無(wú)效vXMEMInit(void)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      {</font></font><font></font>
        MCUCR |= (1<<SRE);   /* External memory interface enable */<font></font>
        XMCRA = 0;<font></font>
        XMCRB |= (1<<XMM1)|(1<<XMM0);//PC7..PC5 released pins<font></font>
      }
      在主例程的開(kāi)頭,我們簡(jiǎn)單地調用此函數以在使用外部RAM之前對其進(jìn)行初始化。

      編寫(xiě)USART驅動(dòng)程序
      我們將需要USART功能,以方便的方式調試和顯示信息。因此,首先,我們需要可以在任務(wù)中使用的驅動(dòng)程序。使用USART的最方便的方法可能是通過(guò)隊列發(fā)送消息。這樣,任何任務(wù)都可以通過(guò)使用消息傳遞服務(wù)而不是直接訪(fǎng)問(wèn)外圍設備來(lái)與USART通信。因此,我們將實(shí)現兩個(gè)隊列–一個(gè)用于TX,另一個(gè)用于RX通道。

      //receive and transmit queues<font></font>
      <font></font>
      xQueueHandlexRxedChars=NULL;<font></font>
      <font></font>
      xQueueHandlexCharsForTx=NULL;
      然后在USART初始化期間,我們創(chuàng )建隊列。

      xRxedChars=xQueueCreate(uxQueueLength,(signedchar)sizeof(signedchar));<font></font>
      <font></font>
      xCharsForTx=xQueueCreate(uxQueueLength,(signedchar)sizeof(signedchar));
      隊列長(cháng)度是在初始化USART時(shí)給出的(在我們的示例中為30)?,F在,當隊列準備就緒時(shí),就可以使用它們與USART通信。通過(guò)兩個(gè)自定義函數放置和讀取發(fā)送到隊列的消息,這使生活更輕松:
      portBASE_TYPE xUSART0PutChar(unsigned char cOutChar)<font></font>
      {<font></font>
      //Return false if after the block time there is no room on the Tx queue.<font></font>
        if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )<font></font>
        {<font></font>
            return pdFAIL;<font></font>
        }<font></font>
        //enable usart UDRE interrupt to transmit<font></font>
        prvUDRIE0InterruptOn();<font></font>
        return pdPASS;<font></font>
      }<font></font>
      portBASE_TYPE xUSART0GetChar(unsigned char *pcRxedChar)<font></font>
      {<font></font>
      /* Get the next character from the buffer.  Return false if no characters<font></font>
        are available, or arrive before xBlockTime expires. */<font></font>
        if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )<font></font>
        {<font></font>
            return pdTRUE;<font></font>
        }<font></font>
        else<font></font>
        {<font></font>
            return pdFALSE;<font></font>
        }<font></font>
      }
      當接收器隊列中沒(méi)有字符且發(fā)送隊列已滿(mǎn)時(shí),這些功能可提供額外的安全性。您可能會(huì )注意到,在xUSART0PutChar()中調用了一個(gè)私有函數prvUDRIE0InterruptOn()。一旦發(fā)送隊列中至少有一個(gè)字符,這將啟用USART數據就緒中斷。

      通過(guò)中斷例程執行USART發(fā)送和接收。

    請輸入搜索關(guān)鍵字

    確定
    色鲁99热99re超碰精品_91精品一区二区三区无码吞精_亚洲国产欧洲综合997久久_一级a性色生活片久久无
  • <noframes id="6fok0"><bdo id="6fok0"><listing id="6fok0"></listing></bdo>
    <ruby id="6fok0"></ruby>

    <progress id="6fok0"></progress>
  • <progress id="6fok0"></progress>
    <ruby id="6fok0"><table id="6fok0"></table></ruby>
  • <progress id="6fok0"><u id="6fok0"><form id="6fok0"></form></u></progress>