91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

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

出出 ? 來源:出出 ? 作者:出出 ? 2022-06-10 10:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

經(jīng)過這半年的實踐考驗,筆者還是相信 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` 。這是一處小改進。
除此之外,沒啥可說的了。

已實現(xiàn)的功能有:

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

AB32VG1

這個是 RISC-V 架構的 CPU。

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

       // 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 的底層驅動寫法也就不一樣了,多了一個判斷是否處于發(fā)送流程中的 api。start_tx stop_tx 也不僅僅是開關中斷那么簡單了,需要改變 intTxing 這個 flag 標識發(fā)送流程狀態(tài)。

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

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

另外,發(fā)送寄存器也沒有空狀態(tài),`putc` 函數(shù)倒是可以判斷發(fā)送完成標志,但是這樣就不能在中斷里調用 `putc` 了;不加發(fā)送完成判斷,就不能在輪詢發(fā)送中調用它??傊?,輪詢發(fā)送和中斷發(fā)送不用用一樣的 `putc` 函數(shù)了。

已實現(xiàn)的功能有:

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


RA6M4

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

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

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

已實現(xiàn)的功能有:

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

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

GD32F4

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

已實現(xiàn)的功能有:

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

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

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

結束語

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

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

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

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

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

審核編輯:湯梓紅

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

    關注

    135

    文章

    9552

    瀏覽量

    391856
  • N32
    N32
    +關注

    關注

    0

    文章

    18

    瀏覽量

    7596
  • STM32F4
    +關注

    關注

    3

    文章

    204

    瀏覽量

    30131
  • RT-Thread
    +關注

    關注

    32

    文章

    1613

    瀏覽量

    44869
  • serialX
    +關注

    關注

    0

    文章

    7

    瀏覽量

    875
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    恩智浦亮相RT-Thread 20周年開發(fā)者大會

    日前,“開源向實·生產(chǎn)力進化啟示錄”全球峰會暨RT-Thread 20周年開發(fā)者大會在上海成功舉辦,恩智浦作為RT-Thread的緊密合作伙伴,在活動中重磅亮相,展示雙方在共建RT-Thread OS開發(fā)生態(tài)方面的新成果、新方案
    的頭像 發(fā)表于 01-26 09:07 ?552次閱讀

    智能門鎖:基于RT-Thread與FRDM-MCXA156的外設嵌入式實踐 | 技術集結

    本項目為RT-Thread嵌入式大賽獲獎作品,基于恩智浦MCXA156系列微控制器構建了一款多功能智能門鎖控制系統(tǒng)。目前,恩智浦已有多款產(chǎn)品對RT-Thread完成了適配。近期,MCXA系列產(chǎn)品
    的頭像 發(fā)表于 01-23 11:06 ?6399次閱讀
    智能門鎖:基于<b class='flag-5'>RT-Thread</b>與FRDM-MCXA156的<b class='flag-5'>多</b>外設嵌入式實踐 | 技術集結

    RT-Thread×玄鐵 | 硬核直播】RISC-V新核E901發(fā)布!RT-Thread手把手帶你玩轉玄鐵生態(tài)! | 博觀講堂

    、更靈活架構設計,為嵌入式領域帶來全新處理器方案。RT-Thread作為國內領先的嵌入式操作系統(tǒng),與玄鐵團隊在技術適配、生態(tài)共建方面已建立長期緊密的合作關系。目前,R
    的頭像 發(fā)表于 10-21 19:47 ?567次閱讀
    【<b class='flag-5'>RT-Thread</b>×玄鐵 | 硬核直播】RISC-V新核E901發(fā)布!<b class='flag-5'>RT-Thread</b>手把手帶你玩轉玄鐵生態(tài)! | 博觀講堂

    使用RT-Thread studio 開發(fā)RT-Thread Nano項目的時候 串口的驅動是要自己寫嗎?

    剛入坑。使用RT-Thread studio 開發(fā)RT-Thread 標準板項目的時候直接使用里邊的串口uart_dev=rt_device_find(“uart5”);然后操作設備,在開發(fā)R
    發(fā)表于 09-26 08:14

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以為修改index_all.json,發(fā)現(xiàn)聯(lián)網(wǎng)的時候,會自動覆蓋 另lastet版本
    發(fā)表于 09-16 06:06

    【好書推薦】RT-Thread第20本相關書籍!《嵌入式實時操作系統(tǒng)RT-Thread原理與應用》| 技術集結

    01內容簡介ContentSummary本書為讀者提供了一個全面、系統(tǒng)的RT-Thread學習指南,旨在幫助初學者及有經(jīng)驗的開發(fā)者掌握RT-Thread實時操作系統(tǒng)和STM32嵌入式微控制器的核心
    的頭像 發(fā)表于 08-24 10:05 ?1023次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>第20本相關書籍!《嵌入式實時操作系統(tǒng)<b class='flag-5'>RT-Thread</b>原理與應用》| 技術集結

    RT-Thread 遇上 Rust:安全內核 RusT-Thread 的誕生

    大家好,我們是中國科學技術大學操作系統(tǒng)原理與設計(H)課oooooS小組。這個項目是我們的課程大作業(yè):參考RT-Thread架構,使用Rust搭建一個原生的嵌入式操作系統(tǒng)內核。初識Rust是因為xk
    的頭像 發(fā)表于 08-02 11:03 ?3538次閱讀
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全內核 RusT-<b class='flag-5'>Thread</b> 的誕生

    RT-Thread Nano硬核移植指南:手把手實現(xiàn)VGLite圖形驅動適配 | 技術集結

    VGLite是NXP提供的輕量級2D圖形API,本文將手把手帶你實現(xiàn)VGLite圖形驅動適配RT-Thread。文章分為上、下兩,將手把手教您移植。上篇對
    的頭像 發(fā)表于 07-17 14:40 ?3388次閱讀
    <b class='flag-5'>RT-Thread</b> Nano硬核移植指南:手把手實現(xiàn)VGLite圖形<b class='flag-5'>驅動</b><b class='flag-5'>適配</b> | 技術集結

    用SPI玩轉WiFi,RT-Thread ESP-Hosted驅動深度適配指南 | 技術集結

    還在為MCU的WiFi連接方案發(fā)愁?RT-Thread社區(qū)開源ESP-Hosted驅動,通過標準SPI接口即可實現(xiàn),并且該倉庫已整理成RT-Thread軟件包。RT
    的頭像 發(fā)表于 07-09 19:03 ?1648次閱讀
    用SPI玩轉WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted<b class='flag-5'>驅動</b>深度<b class='flag-5'>適配</b>指南 | 技術集結

    RT-Thread榮獲2025優(yōu)秀開源項目 | 新聞速遞

    貢獻,榮獲年度“優(yōu)秀開源項目獎”。RT-Thread睿賽德榮獲2025優(yōu)秀開源項目獎目前,開源已從軟件領域延展至硬件、數(shù)據(jù)、算法、標準、內容等領域。作為國內開源
    的頭像 發(fā)表于 07-04 09:04 ?2642次閱讀
    <b class='flag-5'>RT-Thread</b>榮獲2025優(yōu)秀開源項目 | 新聞速遞

    深度剖析 RT-Thread 線程調度流程

    RT-Thread調度第一個線程的主要流程分如下:rtthread_startup:RTT的啟動函數(shù),主要負責板級驅動,調度器,系統(tǒng)線程初始化,啟動調度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1768次閱讀
    深度剖析 <b class='flag-5'>RT-Thread</b> 線程調度流程

    揭秘RT-Thread上的AUTOSAR CP系統(tǒng)

    本文探討了RT-Thread與AUTOSARCP的融合,解決車載ECU開發(fā)中實時性、安全性與靈活性的平衡問題。通過分層安全內核(rt-safetyos/autoos)和工具鏈整合,兼容AUTOSAR
    的頭像 發(fā)表于 06-23 20:22 ?3222次閱讀
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系統(tǒng)

    玄鐵加入RT-Thread 高級會員合作伙伴 | 戰(zhàn)略新篇

    。深化合作,共建RISC-V生態(tài)RT-Thread作為國內領先的嵌入式操作系統(tǒng),與玄鐵團隊在技術適配、生態(tài)共建方面已建立長期緊密的合作關系。目前,RT-Thread
    的頭像 發(fā)表于 06-23 20:22 ?1107次閱讀
    玄鐵加入<b class='flag-5'>RT-Thread</b> 高級會員合作伙伴 | 戰(zhàn)略新篇

    【直播預告】《實時操作系統(tǒng)應用技術—基于RT-Thread與ARM的編程實踐》教學脈絡及資源簡介

    直播預告直播主題:《實時操作系統(tǒng)應用技術—基于RT-Thread與ARM的編程實踐》教學脈絡及資源簡介開放時間:2025年5月29日(周)20:00主講老師:王宜懷課程類型:視頻直播觀看平臺
    的頭像 發(fā)表于 05-26 17:50 ?1258次閱讀
    【直播預告】《實時操作系統(tǒng)應用技術—基于<b class='flag-5'>RT-Thread</b>與ARM的編程實踐》教學脈絡及資源簡介

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

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