国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

01前言

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

02FIFO隊(duì)列

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

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

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

//頭文件函數(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接收隊(duì)列緩存數(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接收隊(duì)列void uart1infifo_Clear(void){ uart1infifo_front = UART1_IN_FIFO_SIZE -1; uart1infifo_rear = uart1infifo_front;// uart1infifo_count = 0;}//串口1接收隊(duì)列入數(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接收隊(duì)列出數(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ā)送隊(duì)列就不詳細(xì)描述了,在接收隊(duì)列的基礎(chǔ)上稍加修改即可。

03中斷收發(fā)串口

//串口發(fā)送函數(shù) void SendDataToUart1(u8 * pData, u16 len){ u8 i; //串口發(fā)送隊(duì)列將慢,等待一下數(shù)據(jù)發(fā)送 while (1) { if (uart1outfifo_GetSpace() 》 len+5) { break; } else { i = 0; } } USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //關(guān)閉中斷,防止隊(duì)列的進(jìn)出會(huì)同時(shí)進(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ù)并放入串口接收隊(duì)列 //串口數(shù)據(jù)處理flag } else if (USART_GetFlagStatus(USART1, USART_FLAG_TXE)) { if (uart1outfifo_count 》 0) { USART_SendData(USART1, uart1outfifo_DataOut());//發(fā)隊(duì)列取出數(shù)據(jù)放入串口發(fā)送寄存器 } else { USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } }}

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

不定長(zhǎng)數(shù)據(jù)包超時(shí)處理

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

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

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

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

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

編輯:jq

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

    關(guān)注

    5198

    文章

    20449

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

    關(guān)注

    0

    文章

    270

    瀏覽量

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

    關(guān)注

    1

    文章

    34

    瀏覽量

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

    關(guān)注

    0

    文章

    63

    瀏覽量

    12064

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

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

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

    一個(gè)面向單片機(jī)、事件驅(qū)動(dòng)的嵌入式開發(fā)平臺(tái)介紹

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

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

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

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

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

    基于環(huán)形隊(duì)列的UART收發(fā)回顯實(shí)驗(yàn)

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

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

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

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

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

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

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

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

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

    嵌入式軟件行業(yè)增長(zhǎng)驅(qū)動(dòng)因素

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

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

    構(gòu)、時(shí)鐘系統(tǒng)、電源管理、存儲(chǔ)映射等。 嵌入式必學(xué)技術(shù)點(diǎn)↓↓↓ 1硬件與軟件的結(jié)合 2實(shí)時(shí)性要求與資源限制 3跨領(lǐng)域知識(shí)整合 4調(diào)試與測(cè)試?yán)щy 二)缺乏專業(yè)指導(dǎo) 1)容易走彎路:自學(xué)嵌入式的過程
    發(fā)表于 04-27 09:54

    如何成為一名嵌入式軟件工程師?

    、Java等)和軟件開發(fā)工具,還需要對(duì)硬件的工作原理有深入的理解。 在團(tuán)隊(duì)嵌入式軟件工程師往往扮演著核心角色,他們的工作直接關(guān)系到產(chǎn)品的性能、穩(wěn)定性和用戶體驗(yàn)。 02掌握核心技
    發(fā)表于 04-15 14:37

    嵌入式軟件單元測(cè)試的必要性、核心方法及工具深度解析

    一、為什么嵌入式軟件必須重視單元測(cè)試? ?嵌入式系統(tǒng)的特殊性? 在汽車 ECU、醫(yī)療設(shè)備控制器等場(chǎng)景軟件直接操控硬件,?單比特錯(cuò)誤可能導(dǎo)
    的頭像 發(fā)表于 03-21 14:53 ?1429次閱讀