女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

rt-thread 驅動篇(四)serialX 多架構適配

出出 ? 來源:出出 ? 作者:出出 ? 2022-06-10 10:21 ? 次閱讀

前言

自筆者提出 serialX 串口驅動到今天近半年了,當初只在 STM32F4 NUC970 兩個系列芯片上做過理論驗證。一個是 ARM CM4 核心架構,一個是 ARM9。這兩款芯片能完美實現筆者的需求。

經過這半年的實踐考驗,筆者還是相信 serialX 的實力的,最近這幾天筆者嘗試在 N32 AB32 RA6M4 上適配 serialX,下面就向各位匯報一下適配結果。

芯片 STM32F4 NUC970 N32 AB32 RA6M4 GD32F4
架構 CM4 ARM9 CM4 RISC-V CM33 CM4

N32G45

因為這個也是 CM4,和 STM32F4 相較而言,可能差別很小。讓筆者感到欣慰的是用`DMA_GetFlagStatus(uart->dma_tx.dma_flag, uart->dma_tx.dma_module) == SET` 代替了 `uart->dmaTxing` 。這是一處小改進。
除此之外,沒啥可說的了。

已實現的功能有:

  • 輪詢收發
  • 中斷收發(可阻塞可非阻塞)
  • DMA 收發(可阻塞可非阻塞)

AB32VG1

這個是 RISC-V 架構的 CPU

從芯片手冊我們可以看到,它的串口外設只有“接收一個字節完成”和“發送一個字節完成”兩個中斷。
在 serialX 的設計構想里,我們希望有個“發送寄存器空”中斷。因為這樣很容易啟動一次中斷,在中斷里判斷是否有數據需要發送,進而啟動一次發送過程。
假如沒有這個中斷,我們必須通過先寫一個字節引起一次“發送完成中斷”,然后借助這次中斷繼續判斷是否有數據需要發送。在數據所有數據發送完之前,我們還需要有個 flag 標識一下現在處于發送流程中。
因此,serialX 需要進行一些改動:
`_serial_int_tx` 函數

       // TODO: start tx
#if defined (RT_SERIAL_NO_TXEIT)
       if (serial->ops->is_int_txing != RT_NULL && serial->ops->is_int_txing(serial) == RT_FALSE) {
           ch = _serial_fifo_pop_data(tx_fifo);
           serial->ops->start_tx(serial, ch);
       }
#else
       serial->ops->start_tx(serial);
#endif
```
`struct rt_uart_ops`
```
#if defined (RT_SERIAL_NO_TXEIT)
   rt_bool_t (*is_int_txing)(struct rt_serial_device *serial);
   void (*start_tx)(struct rt_serial_device *serial, rt_uint8_t ch);
#else
   void (*start_tx)(struct rt_serial_device *serial);
#endif

因為這些改動,AB32VG1 的底層驅動寫法也就不一樣了,多了一個判斷是否處于發送流程中的 api。start_tx stop_tx 也不僅僅是開關中斷那么簡單了,需要改變 intTxing 這個 flag 標識發送流程狀態。

rt_bool_t ab32_int_txing(struct rt_serial_device *serial)
{
   struct ab32_uart *uart;

   RT_ASSERT(serial != RT_NULL);

   uart = rt_container_of(serial, struct ab32_uart, serial);

   return uart->intTxing;
}

static void ab32_start_tx(struct rt_serial_device *serial, rt_uint8_t ch)
{
   struct ab32_uart *uart;

   RT_ASSERT(serial != RT_NULL);

   uart = rt_container_of(serial, struct ab32_uart, serial);
   uart->intTxing = RT_TRUE;
   hal_uart_control(uart->handle.instance, UART_TXIT_ENABLE, HAL_ENABLE);
   hal_uart_write(uart->handle.instance, ch);
}

static void ab32_stop_tx(struct rt_serial_device *serial)
{
   struct ab32_uart *uart;

   RT_ASSERT(serial != RT_NULL);

   uart = rt_container_of(serial, struct ab32_uart, serial);
   hal_uart_control(uart->handle.instance, UART_TXIT_ENABLE, HAL_DISABLE);
   uart->intTxing = RT_FALSE;
}

為此,我們需要添加個新配置,components/drivers/Kconfig

           config RT_SERIAL_NO_TXEIT
               bool "No TX Empty interrupt"
               default n
               help
                   Useful only if the chip hasn't Transmit Register Empty interrupt
                   Such as: AB32 RA6M4

意思是說,當芯片沒有“發送寄存器空中斷”支持的時候,我們需要用 `intTxing` 代替實現控制發送過程。

另外,發送寄存器也沒有空狀態,`putc` 函數倒是可以判斷發送完成標志,但是這樣就不能在中斷里調用 `putc` 了;不加發送完成判斷,就不能在輪詢發送中調用它。總之,輪詢發送和中斷發送不用用一樣的 `putc` 函數了。

已實現的功能有:

  • 中斷收發(可阻塞可非阻塞)


RA6M4

RA6M4 是一款 CM33 核 ARM 芯片,本以為它比 CM4 高級可以很容易實現 CM4 上實現的操作。

但是,筆者也沒有從手冊中找到“發送寄存器空中斷”。所以 RA6M4 和 AB32VG1 有一樣的補救處理。
但是,筆者還發現另外一個問題,**如果是中斷發送,每次寫完 TDR 寄存器后,必須重新使能發送中斷**。不這樣做,就不會出現發送完成中斷。

雖然如此,連續發送多個字節仍然會出現發送中斷不觸發(或丟失)的情況,導致發送功能完全癱瘓(這也是 `intTxing` 引入的隱患)。

已實現的功能有:

  • 中斷接收(可阻塞可非阻塞)
  • 中斷發送(未完),暫時可以用輪詢發送代替

多說兩句,RA6M4 的 SCI 好像可以啟用 FIFO ,這樣一來串口收發寄存器就是帶 FIFO 的。遺憾的是筆者不會用啊,有會用的大佬可以嘗試移植一下,用 FIFO 了就相當于用 DMA 了。

GD32F4

這個也可以做到和 STM32F4 一樣的程度,DMA 沒有發送標志,只能繼續用 `dmaTxing` 。

已實現的功能有:

  • 輪詢收發
  • 中斷收發(可阻塞可非阻塞)
  • DMA收發(可阻塞可非阻塞)

注:只分配了 UART0 的 DMA 通道,如果其它的也需要開啟 DMA 請自行修改 `struct gd32_uart uarts` 數組變量分配 DMA 通道。

注:還有一點,rt-studio 里下載的 GD32F4 firmware 庫版本是很多年前的,現在已經改動過好幾次了。筆者使用的 `gd32f4xx_usart.h` 版本是 “2020-09-30, V2.1.0, firmware for GD32F4xx” 。如有編譯錯誤請升級 firmware 庫。

結束語

關于 serialX 理論的部分,之前的文章已經說的夠多了。這次是想在多種平臺上用實踐檢驗一下 serialX 理論的可行性。經過這幾天的投入,最終多多少少有些收獲,還是很欣慰的。

匯總一下,目前可以適配的芯片包括如下幾類
1. 沒有 DMA ,只有串口接收發送中斷
2. 沒有“發送寄存器空”狀態或沒有“發送寄存器空”中斷
3. 帶接收 IDLE 檢測,帶“發送寄存器空”中斷
4. 帶 DMA ,并且至少有 DMA 半傳輸中斷和全傳輸中斷
5. 串口外設自帶收發 FIFO (可認為是 DMA ,但是比 DMA 使用更簡單)

在此,特別感謝[嚜軒公告](https://club.rt-thread.org/u/7c37fff6229d1ccd)支援的開發板,最終完成了 serialX 在這些平臺上的實現。

下期預告,我們來扒一扒 serialX 的缺陷,對,它的缺陷。準確的講是在 RTOS 上引入的坑有哪些以及怎么避免。

附 [serialX](https://gitee.com/thewon/serialX) 倉庫地址,感興趣的可以下載最新版 serialX 源碼。本文提到的幾種芯片的驅動也都已提交。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9304

    瀏覽量

    374887
  • N32
    N32
    +關注

    關注

    0

    文章

    18

    瀏覽量

    7351
  • STM32F4
    +關注

    關注

    3

    文章

    195

    瀏覽量

    28811
  • RT-Thread
    +關注

    關注

    32

    文章

    1368

    瀏覽量

    41496
  • serialX
    +關注

    關注

    0

    文章

    7

    瀏覽量

    836
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RT-Thread審核團招募: 深度參與開源RTOS社區治理與演進

    全球開發者招募:RT-Thread審核團(ReviewTeam)正式開放申請!在開源的世界里,代碼審查(CodeReview)是保證軟件質量、促進技術交流的關鍵環節。RT-Thread作為全球領先
    的頭像 發表于 05-21 18:02 ?416次閱讀
    <b class='flag-5'>RT-Thread</b>審核團招募: 深度參與開源RTOS社區治理與演進

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內容比較簡單但稍有瑣碎,希望對有需要的小伙伴有所幫助。
    的頭像 發表于 02-13 10:37 ?1716次閱讀
    如何將<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    從開源中來到開源中去-RT-Thread北京社區

    RT-Thread今年全域推行不同區域社區網,通過建立區域社區網,構建更加緊密聯系的開源社區,實現更廣泛的開源資源共享,讓更多的RT-Thread開發者受益。今年8月份RT-Thread正式啟動北京
    的頭像 發表于 11-29 01:05 ?391次閱讀
    從開源中來到開源中去-<b class='flag-5'>RT-Thread</b>北京社區<b class='flag-5'>篇</b>

    【S32K146 RT-Thread】之 使用SFUD組件驅動spi flash

    【S32K146 RT-Thread】之 使用SFUD組件驅動spi flash
    的頭像 發表于 11-21 01:05 ?964次閱讀
    【S32K146 <b class='flag-5'>RT-Thread</b>】之 使用SFUD組件<b class='flag-5'>驅動</b>spi flash

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動
    的頭像 發表于 11-13 01:03 ?1873次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    混合部署 | 在迅為RK3568上同時部署RT-Thread和Linux系統

    RT-Thread介紹 RT-Thread 是一個高安全性、實時性的操作系統,廣泛應用于任務關鍵領域,例如電力、軌道交通、車載系統、工業控制和新能源等。它的加入讓 RK3568 能夠在保證系統實時性
    發表于 11-01 10:31

    【S32K146 RT-thread】之 SPI驅動適配

    概述RT-Thread對SPI總線的驅動,抽象出了spibus的設備驅動,我們基于S32K146的硬件學習spibus設備驅動
    的頭像 發表于 11-01 08:11 ?1148次閱讀
    【S32K146 <b class='flag-5'>RT-thread</b>】之 SPI<b class='flag-5'>驅動</b><b class='flag-5'>適配</b>

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!

    親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發者大會)正式啟動報名!2024RT-Threa
    的頭像 發表于 10-29 08:06 ?851次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024開發者大會報名啟動!

    混合部署 | 在迅為RK3568上同時部署RT-Thread和Linux系統

    RT-Thread介紹 RT-Thread 是一個高安全性、實時性的操作系統,廣泛應用于任務關鍵領域,例如電力、軌道交通、車載系統、工業控制和新能源等。它的加入讓 RK3568 能夠在保證系統實時性
    發表于 09-18 10:54

    新書發布——《RT-Thread嵌入式實時操作系統內核、驅動和應用開發技術》

    我們非常高興地宣布,由鄭苗秀、沈鴻飛和廖建尚編著的《RT-Thread嵌入式實時操作系統內核、驅動和應用開發技術》一書正式發布。本書的編寫團隊由多位在嵌入式和實時操作系統領域有著豐富經驗的專家組
    的頭像 發表于 09-03 08:06 ?1142次閱讀
    新書發布——《<b class='flag-5'>RT-Thread</b>嵌入式實時操作系統內核、<b class='flag-5'>驅動</b>和應用開發技術》

    【QEMU系列】不用開發板運行RT-Thread指南-ARM架構

    簡介在物聯網和嵌入式系統的開發中,RT-Thread操作系統憑借其小巧、高效和靈活的特點,受到了越來越多開發者的青睞。然而,對于很多剛剛接觸RT-Thread的開發者來說,購買和使用開發板可能會
    的頭像 發表于 08-09 08:35 ?1418次閱讀
    【QEMU系列】不用開發板運行<b class='flag-5'>RT-Thread</b>指南-ARM<b class='flag-5'>架構</b>

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入式開發的絕佳機會。
    的頭像 發表于 08-07 08:35 ?2393次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越
    的頭像 發表于 08-01 08:35 ?1148次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://github.com
    的頭像 發表于 07-04 08:35 ?692次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    基于 RT-Thread專業版的EtherCAT主站方案

    (一)方案介紹本方案基于RT-Thread專業版,在RT-Thread端集成EtherCAT主站協議,通過EtherCAT對伺服電機或遠程IO進行實時控制,具備傳輸速度快,實時性高,擴展設備靈活等
    的頭像 發表于 06-19 08:35 ?1667次閱讀
    基于 <b class='flag-5'>RT-Thread</b>專業版的EtherCAT主站方案