日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

rt-thread 驅(qū)動(dòng)篇(四)serialX 多架構(gòu)適配

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

掃碼添加小助手

加入工程師交流群

前言

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

經(jīng)過(guò)這半年的實(shí)踐考驗(yàn),筆者還是相信 serialX 的實(shí)力的,最近這幾天筆者嘗試在 N32 AB32 RA6M4 上適配 serialX,下面就向各位匯報(bào)一下適配結(jié)果。

芯片 STM32F4 NUC970 N32 AB32 RA6M4 GD32F4
架構(gòu) CM4 ARM9 CM4 RISC-V CM33 CM4

N32G45

因?yàn)檫@個(gè)也是 CM4,和 STM32F4 相較而言,可能差別很小。讓筆者感到欣慰的是用`DMA_GetFlagStatus(uart->dma_tx.dma_flag, uart->dma_tx.dma_module) == SET` 代替了 `uart->dmaTxing` 。這是一處小改進(jìn)。
除此之外,沒(méi)啥可說(shuō)的了。

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

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

AB32VG1

這個(gè)是 RISC-V 架構(gòu)的 CPU

從芯片手冊(cè)我們可以看到,它的串口外設(shè)只有“接收一個(gè)字節(jié)完成”和“發(fā)送一個(gè)字節(jié)完成”兩個(gè)中斷。
在 serialX 的設(shè)計(jì)構(gòu)想里,我們希望有個(gè)“發(fā)送寄存器空”中斷。因?yàn)檫@樣很容易啟動(dòng)一次中斷,在中斷里判斷是否有數(shù)據(jù)需要發(fā)送,進(jìn)而啟動(dòng)一次發(fā)送過(guò)程。
假如沒(méi)有這個(gè)中斷,我們必須通過(guò)先寫(xiě)一個(gè)字節(jié)引起一次“發(fā)送完成中斷”,然后借助這次中斷繼續(xù)判斷是否有數(shù)據(jù)需要發(fā)送。在數(shù)據(jù)所有數(shù)據(jù)發(fā)送完之前,我們還需要有個(gè) flag 標(biāo)識(shí)一下現(xiàn)在處于發(fā)送流程中。
因此,serialX 需要進(jìn)行一些改動(dòng):
`_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

因?yàn)檫@些改動(dòng),AB32VG1 的底層驅(qū)動(dòng)寫(xiě)法也就不一樣了,多了一個(gè)判斷是否處于發(fā)送流程中的 api。start_tx stop_tx 也不僅僅是開(kāi)關(guān)中斷那么簡(jiǎn)單了,需要改變 intTxing 這個(gè) flag 標(biāo)識(shí)發(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;
}

為此,我們需要添加個(gè)新配置,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

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

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

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

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


RA6M4

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

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

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

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

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

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

GD32F4

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

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

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

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

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

結(jié)束語(yǔ)

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

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

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

下期預(yù)告,我們來(lái)扒一扒 serialX 的缺陷,對(duì),它的缺陷。準(zhǔn)確的講是在 RTOS 上引入的坑有哪些以及怎么避免。

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

審核編輯:湯梓紅

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

    關(guān)注

    135

    文章

    9589

    瀏覽量

    393824
  • N32
    N32
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    7619
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    204

    瀏覽量

    30324
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1644

    瀏覽量

    45278
  • serialX
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread 用上 HyperRAM——e2studio 工程配置詳解 | 技術(shù)集結(jié)

    的帖子中介紹如何在e2sutido中結(jié)合RT-Thread的代碼倉(cāng)庫(kù)(使用的是最新的RT-Thread版本),在e2stduio中調(diào)試和下載RT-Thread工程。配
    的頭像 發(fā)表于 04-27 18:07 ?7324次閱讀
    讓 <b class='flag-5'>RT-Thread</b> 用上 HyperRAM——e2studio 工程配置詳解 | 技術(shù)集結(jié)

    RT-Thread 中設(shè)備樹(shù)的適配方法 | 技術(shù)集結(jié)

    本文基于RT-Thread現(xiàn)有的DM(設(shè)備模型)框架,以Rock2F開(kāi)發(fā)板為例,系統(tǒng)梳理了RK3528SoC的快速移植流程,涵蓋了CLK、Pinctrl、ADC、NVMEM、Thermal、RNG等
    的頭像 發(fā)表于 04-04 18:05 ?3229次閱讀
    <b class='flag-5'>RT-Thread</b> 中設(shè)備樹(shù)的<b class='flag-5'>適配</b>方法 | 技術(shù)集結(jié)

    RT-Thread新開(kāi)發(fā)工具支持:e2studio手把手適配教程 | 技術(shù)集結(jié)

    Titan-RA8P1的芯片是Renensas的RA8P1系列芯片,瑞薩官方使用的IDE是e2studio。本文介紹如何在e2studio中創(chuàng)建工程并結(jié)合RT-Thread的源碼,在e2studio
    的頭像 發(fā)表于 04-02 18:06 ?3608次閱讀
    <b class='flag-5'>RT-Thread</b>新開(kāi)發(fā)工具支持:e2studio手把手<b class='flag-5'>適配</b>教程 | 技術(shù)集結(jié)

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

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

    智能門鎖:基于RT-Thread與FRDM-MCXA156的外設(shè)嵌入式實(shí)踐 | 技術(shù)集結(jié)

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

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

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

    使用RT-Thread studio 開(kāi)發(fā)RT-Thread Nano項(xiàng)目的時(shí)候 串口的驅(qū)動(dòng)是要自己寫(xiě)嗎?

    剛?cè)肟?。使?b class='flag-5'>RT-Thread studio 開(kāi)發(fā)RT-Thread 標(biāo)準(zhǔn)板項(xiàng)目的時(shí)候直接使用里邊的串口uart_dev=rt_device_find(“uart5”);然后操作設(shè)備,在開(kāi)發(fā)R
    發(fā)表于 09-26 08:14

    【好書(shū)推薦】RT-Thread第20本相關(guān)書(shū)籍!《嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread原理與應(yīng)用》| 技術(shù)集結(jié)

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

    RT-Thread 遇上 Rust:安全內(nèi)核 RusT-Thread 的誕生

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

    RT-Thread Nano硬核移植指南:手把手實(shí)現(xiàn)VGLite圖形驅(qū)動(dòng)適配 | 技術(shù)集結(jié)

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

    用SPI玩轉(zhuǎn)WiFi,RT-Thread ESP-Hosted驅(qū)動(dòng)深度適配指南 | 技術(shù)集結(jié)

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

    RT-Thread榮獲2025優(yōu)秀開(kāi)源項(xiàng)目 | 新聞速遞

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

    深度剖析 RT-Thread 線程調(diào)度流程

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

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

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

    RT-Thread審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

    全球開(kāi)發(fā)者招募:RT-Thread審核團(tuán)(ReviewTeam)正式開(kāi)放申請(qǐng)!在開(kāi)源的世界里,代碼審查(CodeReview)是保證軟件質(zhì)量、促進(jìn)技術(shù)交流的關(guān)鍵環(huán)節(jié)。RT-Thread作為全球領(lǐng)先
    的頭像 發(fā)表于 05-21 18:02 ?1467次閱讀
    <b class='flag-5'>RT-Thread</b>審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)
    平南县| 饶阳县| 如东县| 苏尼特左旗| 石台县| 松潘县| 长海县| 文成县| 乐至县| 广安市| 永福县| 涡阳县| 南皮县| 焉耆| 彰武县| 珲春市| 寻乌县| 万安县| 客服| 富川| 济阳县| 汤原县| 沽源县| 怀远县| 文水县| 霍山县| 西华县| 儋州市| 诸暨市| 胶州市| 罗山县| 岑溪市| 江永县| 潜江市| 临洮县| 拉孜县| 弋阳县| 隆林| 肥东县| 聂拉木县| 冀州市|