哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

分享關(guān)于嵌入式軟件中的串口收發(fā)隊列設(shè)計方法

FPGA之家 ? 來源:嵌入式案例Show ? 作者:嵌入式案例Show ? 2021-05-08 09:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01前言

嵌入式軟件的開發(fā)中,串口是十分常用且基礎(chǔ)的功能。在需要批量發(fā)送數(shù)據(jù)的場合,可以使用while循環(huán)等待發(fā)送完成標(biāo)志位的方式,但是這種方式會占據(jù)主循環(huán),影響效率。也可以采用dma的方式,但是dma在發(fā)送數(shù)據(jù)時非常高效,但是批量接收數(shù)據(jù)時,就很不靈活,特別是一些在串口數(shù)據(jù)中解析某種協(xié)議格式時,很不方便。下面介紹一種利用串口中斷結(jié)合FIFO隊列的串口數(shù)據(jù)收發(fā)方法,結(jié)合了不阻塞批量發(fā)與靈活接收的優(yōu)點,特別適用于串口協(xié)議收發(fā)的使用場景。

02FIFO隊列

FIFO是英文First In First Out 的縮寫,是一種先進(jìn)先出的數(shù)據(jù)緩存器,順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動加1完成。相比于一個同等緩存大小的數(shù)值,F(xiàn)IFO就是多管理了一個先進(jìn)先出的功能,方便串口數(shù)據(jù)的存入和讀出。

Fifo在帶操作系統(tǒng)嵌入式軟件中都有現(xiàn)成的實現(xiàn),但是在基礎(chǔ)的嵌入軟件中,我們可以自己實現(xiàn)一個。

#define UART1_IN_FIFO_SIZE 100 //接收串口隊列的深度#define UART1_OUT_FIFO_SIZE 250 //發(fā)送串口隊列的深度

//頭文件函數(shù)列表FIFO_EXT u8 uart1infifo_data[UART1_IN_FIFO_SIZE];#define uart1infifo_count (uart1infifo_GetCount())FIFO_EXT u16 uart1infifo_front;FIFO_EXT u16 uart1infifo_rear;FIFO_EXT void uart1infifo_Clear(void);FIFO_EXT void uart1infifo_DataIn(u8 d);FIFO_EXT u8 uart1infifo_DataOut(void);FIFO_EXT u16 uart1infifo_GetSpace(void);FIFO_EXT u16 uart1infifo_GetCount(void);

//獲取串口1接收隊列緩存數(shù)u16 uart1infifo_GetCount(void){ u16 countR,countF; countR = uart1infifo_rear; countF = uart1infifo_front; if (countR 》= countF) { return(countR - countF); } else { return(UART1_IN_FIFO_SIZE + countR - countF); }}//清空串口1接收隊列void uart1infifo_Clear(void){ uart1infifo_front = UART1_IN_FIFO_SIZE -1; uart1infifo_rear = uart1infifo_front;// uart1infifo_count = 0;}//串口1接收隊列入數(shù)據(jù)void uart1infifo_DataIn(u8 d){ if (uart1infifo_count 《 UART1_IN_FIFO_SIZE) { uart1infifo_rear = (uart1infifo_rear +1) % UART1_IN_FIFO_SIZE; uart1infifo_data[uart1infifo_rear] = d; }}//串口1接收隊列出數(shù)據(jù)u8 uart1infifo_DataOut(void){ if (uart1infifo_rear != uart1infifo_front) { uart1infifo_front = (uart1infifo_front +1) % UART1_IN_FIFO_SIZE; return(uart1infifo_data[uart1infifo_front]); } else { return(0xff); }}

為了節(jié)省篇幅,串口1發(fā)送隊列就不詳細(xì)描述了,在接收隊列的基礎(chǔ)上稍加修改即可。

03中斷收發(fā)串口

//串口發(fā)送函數(shù) void SendDataToUart1(u8 * pData, u16 len){ u8 i; //串口發(fā)送隊列將慢,等待一下數(shù)據(jù)發(fā)送 while (1) { if (uart1outfifo_GetSpace() 》 len+5) { break; } else { i = 0; } } USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //關(guān)閉中斷,防止隊列的進(jìn)出會同時進(jìn)行 while (len --) { uart1outfifo_DataIn(*pData); pData ++; } USART_ITConfig(USART1, USART_IT_TXE, ENABLE);}

//串口處理函數(shù)void USART1_IRQHandler(void){ if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { uart1infifo_DataIn(USART_ReceiveData(USART1));//接收數(shù)據(jù)并放入串口接收隊列 //串口數(shù)據(jù)處理flag } else if (USART_GetFlagStatus(USART1, USART_FLAG_TXE)) { if (uart1outfifo_count 》 0) { USART_SendData(USART1, uart1outfifo_DataOut());//發(fā)隊列取出數(shù)據(jù)放入串口發(fā)送寄存器 } else { USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } }}

04串口數(shù)據(jù)處理

不定長數(shù)據(jù)包超時處理

在上節(jié)的“串口數(shù)據(jù)處理flag”處,加入超時的標(biāo)記g_uartTimeOut = n;并在定時器中斷中倒計時g_uartTimeOut,減到0后,產(chǎn)生數(shù)據(jù)包處理標(biāo)志gb_needDealUartPkg = 1。主循環(huán)掃到gb_needDealUartPkg是1后,讀出uart1infifo中的全部數(shù)據(jù)進(jìn)行解包處理。

不定長數(shù)據(jù)包按內(nèi)容格式處理

在上節(jié)的“串口數(shù)據(jù)處理flag”處,加入比對數(shù)據(jù)包格式的函數(shù),當(dāng)格式滿足要求時,將整個數(shù)據(jù)包存入數(shù)據(jù)包隊列(參照前面的串口數(shù)據(jù)接收函數(shù),寫一個接收隊列,接收的數(shù)據(jù)為數(shù)據(jù)包結(jié)構(gòu)體)。主循環(huán)掃描數(shù)據(jù)包隊列的緩存數(shù),有就去處理。

定長數(shù)據(jù)包處理

主循環(huán)中掃描uart1infifo_count,當(dāng)達(dá)到定長后,讀出uart1infifo中的定長數(shù)據(jù)進(jìn)行解包處理。

編輯:jq

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

    關(guān)注

    5208

    文章

    20620

    瀏覽量

    336718
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4421

    瀏覽量

    67816
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    270

    瀏覽量

    25655
  • 串口數(shù)據(jù)
    +關(guān)注

    關(guān)注

    1

    文章

    34

    瀏覽量

    14289
  • 緩存器
    +關(guān)注

    關(guān)注

    0

    文章

    63

    瀏覽量

    12087

原文標(biāo)題:嵌入式軟件中的串口收發(fā)隊列設(shè)計方法

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    2025嵌入式開發(fā)教程|遠(yuǎn)航哥

    https://www.bilibili.com/opus/1178756596191199237 嵌入式通信協(xié)議三劍客:串口、I2C與SPI的深度解析 在嵌入式系統(tǒng)開發(fā),通信協(xié)議是
    的頭像 發(fā)表于 03-20 17:35 ?1305次閱讀
    2025<b class='flag-5'>嵌入式</b>開發(fā)教程|遠(yuǎn)航哥

    什么是嵌入式應(yīng)用開發(fā)?

    設(shè)計、實現(xiàn)和部署,還包括硬件選擇、軟件設(shè)計、測試、集成和維護(hù)等流程?。 定義和背景 嵌入式應(yīng)用開發(fā)是指將軟件部署到嵌入式系統(tǒng),這些系統(tǒng)
    發(fā)表于 01-12 16:13

    嵌入式軟件測試找bug的常見方法和秘訣

    嵌入式軟件開發(fā)過程中,一般來說,花在測試比花在編碼的時間要多很多,通常為3:1(甚至更多)。這個比例隨著你的編程和測試水平的提高而不斷下降,但不論怎樣,軟件測試對一般人來講很重要。 很多年前,一位
    發(fā)表于 01-12 07:07

    軟件到硬件的轉(zhuǎn)場:一場由OceanOS-CM0啟發(fā)的嵌入式思考

    軟件開發(fā)者而言,這種理解方式尤為重要。我們在多線程編程早已熟悉這些概念,現(xiàn)在需要做的,只是理解它們在資源受限的嵌入式環(huán)境下的具體實現(xiàn)和約束。 2. ****互斥鎖與臨界區(qū)的深層思考 第八章關(guān)
    發(fā)表于 01-04 15:52

    C語言單元測試在嵌入式軟件開發(fā)的作用及專業(yè)工具的應(yīng)用

    方面: ?早期缺陷發(fā)現(xiàn)****?:單元測試可以在開發(fā)早期發(fā)現(xiàn)代碼的邏輯錯誤和邊界條件問題,降低后期修復(fù)成本 ?硬件交互驗證****?:嵌入式軟件通常需要直接與硬件交互,單元測試可以驗證底層驅(qū)動和硬件
    發(fā)表于 12-18 11:46

    一個面向單片機(jī)、事件驅(qū)動的嵌入式開發(fā)平臺介紹

    要求較高的嵌入式場景。 EventOS主張的編程思想 1、事件驅(qū)動與事件總線 事件驅(qū)動和事件總線,是EventOS的核心,也是EventOS的核心。事件機(jī)制,與RTOS事件概念完全不同,它更像
    發(fā)表于 12-05 06:26

    分享一個嵌入式開發(fā)學(xué)習(xí)路線

    法,這些語法在嵌入式開發(fā)至關(guān)重要。 2. 技能進(jìn)階期(2-3個月) 從51單片機(jī)過渡到主流的ARM Cortex-M系列(嵌入式就業(yè)核心平臺),學(xué)會使用STM32單片機(jī),掌握嵌入式
    發(fā)表于 12-04 11:01

    CW32嵌入式軟件開發(fā)的必備知識

    設(shè)計的原則和方法,能夠設(shè)計出高效、可維護(hù)的軟件系統(tǒng)。 了解嵌入式系統(tǒng)的實時性要求,能夠設(shè)計出滿足實時性要求的軟件系統(tǒng)。 8、 測試與驗證 掌握單元測試、集成測試和系統(tǒng)測試的
    發(fā)表于 11-28 07:48

    基于環(huán)形隊列的UART收發(fā)回顯實驗

    問題。在本實驗,我們使用環(huán)形隊列來實現(xiàn)實驗1的串口收發(fā)回顯,將串口接收到的數(shù)據(jù)暫存在隊列
    的頭像 發(fā)表于 10-27 13:51 ?2119次閱讀
    基于環(huán)形<b class='flag-5'>隊列</b>的UART<b class='flag-5'>收發(fā)</b>回顯實驗

    RT-Thread 2025嵌入式軟件大賽重磅來襲

    為激發(fā)開發(fā)者潛能、促進(jìn)技術(shù)交流,RT-Thread 正式啟動2025年度嵌入式軟件大賽! 本賽道為嵌入式軟件大賽,聚焦嵌入式
    的頭像 發(fā)表于 09-22 16:40 ?3697次閱讀
    RT-Thread 2025<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>大賽重磅來襲

    RT-Thread 2025嵌入式軟件大賽重磅來襲

    為激發(fā)開發(fā)者潛能、促進(jìn)技術(shù)交流,RT-Thread正式啟動2025年度嵌入式軟件大賽!本賽道為嵌入式軟件大賽,聚焦嵌入式
    的頭像 發(fā)表于 09-20 10:06 ?1920次閱讀
    RT-Thread 2025<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>大賽重磅來襲

    新一代嵌入式開發(fā)平臺 AMD嵌入式軟件和工具2025.1版現(xiàn)已推出

    AMD 2025.1 版嵌入式軟件和工具是面向新一代嵌入式系統(tǒng)開發(fā)而打造的綜合平臺,全面加速概念構(gòu)想到部署落地。 2025.1 版嵌入式軟件
    的頭像 發(fā)表于 08-20 09:15 ?4184次閱讀

    AMD 2025.1版嵌入式軟件和工具的新增功能

    AMD 2025.1 版嵌入式軟件和工具是面向新一代嵌入式系統(tǒng)開發(fā)而打造的綜合平臺,全面加速概念構(gòu)想到部署落地。
    的頭像 發(fā)表于 08-15 15:32 ?1415次閱讀

    嵌入式軟件行業(yè)增長驅(qū)動因素

    嵌入式軟件在物聯(lián)網(wǎng)應(yīng)用至關(guān)重要,因為它管理設(shè)備操作、控制傳感器、支持連接并確保數(shù)據(jù)安全。例如,在智能家居中,恒溫器、安全攝像頭和燈光等設(shè)備使用嵌入式系統(tǒng)獨立運行,并通過云平臺或本地網(wǎng)
    的頭像 發(fā)表于 05-09 11:26 ?924次閱讀

    嵌入式適合自學(xué)嗎?

    構(gòu)、時鐘系統(tǒng)、電源管理、存儲映射等。 嵌入式必學(xué)技術(shù)點↓↓↓ 1硬件與軟件的結(jié)合 2實時性要求與資源限制 3跨領(lǐng)域知識整合 4調(diào)試與測試?yán)щy 二)缺乏專業(yè)指導(dǎo) 1)容易走彎路:自學(xué)嵌入式的過程
    發(fā)表于 04-27 09:54
    平陆县| 尉犁县| 平凉市| 卫辉市| 巴彦县| 普兰店市| 阿克苏市| 札达县| 香港| 克山县| 乌拉特前旗| 湘潭县| 揭东县| 安义县| 漳平市| 海伦市| 新巴尔虎左旗| 亚东县| 廉江市| 兴业县| 唐河县| 平阴县| 镶黄旗| 满城县| 水富县| 光山县| 台北市| 英德市| 凉山| 迁安市| 南陵县| 霍山县| 花莲县| 紫金县| 龙泉市| 彰化市| 苗栗市| 白城市| 民乐县| 瑞丽市| 来宾市|