1. 程式人生 > >ucos系統中串列埠驅動

ucos系統中串列埠驅動

目的:編寫串列埠驅動檔案,包括串列埠初始化、串列埠收、串列埠傳送、(串列埠傳送緩衝區空、串列埠接收緩衝區滿)

最終實現的目的是各個應用程式不必關心串列埠的實現,僅僅分別向傳送緩衝區完整的寫入資料;同時讓串列埠裝置自行從傳送緩衝區中取數,並從串列埠發出;串列埠接收到的資料自行存入接收緩衝區中,每收到一個位元組,向等待接收緩衝區資料的應用程式發訊號,各個應用程式執行。

應用程式從串列埠傳送命令後,依靠串列埠接收發送訊息掛起本身,等待資料到達,若有資料且正確,繼續進行應用程式;若有資料但不正確,傳送訊息表明資料錯誤,結束任務;若無資料,傳送訊息表明超時,結束任務。或者串列埠資料到達,傳送訊息到資料處理任務。

模型建立:

簡述

1、預設使用串列埠進行資料採集的應用程式處於掛起態,等待訊息郵箱並進入執行態;

各個任務被一個專屬於串列埠採集的訊息郵箱掛起,依據訊息郵箱中的值決定哪個任務進入執行態;訊息郵箱的值來源於定時器或者網路資料或者GUI任務;進入執行態後,分別呼叫資料封裝函式,將封裝後的資料寫入傳送緩衝區中;任務被接收快取區的訊息郵箱阻塞,並設定超時時間。

struct TxBufType
{
u8 buf[200];//資料儲存空間或者是一個地址
OS_EVENT *mutex; //本儲存空間的互斥鎖
u8 base;//資料起始地址,儲存資料時,從這裡開始;當儲存的資料長度大於200-base時,並且下邊的 size大於資料長度,表明一部分資料儲存在資料末端,另一部分儲存在頂端
u8 size;//空閒區長度
};

2、寫入傳送緩衝區的過程:各個應用程式在封裝資料完畢後,被髮送緩衝區的互斥鎖阻塞;當傳送緩衝區空閒,檢查是否有足夠的空間。

有,將資料複製base開始的資料區;當到了陣列末尾,將資料剩餘部分儲存在資料區首端,重置base和size後釋放互斥鎖,將之前的base和資料長度作為訊息發到到串列埠傳送任務的訊息佇列中。

無,則繼續被互斥鎖阻塞,重複進行N次,N次還不行,則報錯退出,回到被訊息郵箱阻塞位置。

3、串列埠傳送任務被訊息佇列阻塞;當訊息佇列中有資料,提取其中的base和size,需要從傳送緩衝區中提取從base開始,size長度的資料,並使用串列埠傳送。在從傳送緩衝區提取的時候,需要得到傳送緩衝區的互斥鎖,確保緩衝區沒有被鎖(可能被其他任務加鎖);這裡需要一直等待得到鎖,得到鎖後,從串列埠傳送資料,將資料傳送後,重置傳送緩衝區的base和size,釋放互斥鎖;延時N後,繼續被訊息佇列阻塞,延時的作用是多個裝置從一個串列埠進行資料收發,要增加延時,避免識別包錯誤。

4、串列埠接收函式被接收緩衝區的互斥鎖阻塞;當有串列埠資料後

接收緩衝區空閒:直接將資料儲存至緩衝區,更新base和size;傳送訊息郵箱,應用任務恢復,檢查資料是否完整正確,正確,則完成了整個流程;當任務超時或者資料不正確,報錯退出。

接收緩衝區不空閒:暫存資料,等待釋放互斥鎖;

重點:多個任務併發的對傳送緩衝區操作,緩衝區較大,偶爾可以允許多個任務將資料寫入傳送緩衝區,需要注意的是當多個任務將資料寫入後,串列埠傳送任務執行的比較慢,傳送完一個任務的資料,鎖定傳送緩衝區,釋放傳送緩衝區的相應空間,解鎖;等待一個時間間隔(依據協議而定);進行下一次傳送

3、串列埠接收到資料直接寫入接收緩衝區中,接收到每一個位元組,都要發訊息郵箱啟用各個等待此串列埠資料的應用程式;應用程式收到訊息,執行後,檢查接收快取中的資料,是否正確。

重點:應用程式如何實現繼續等待訊號?接收緩衝區中的資料針對應用程式沒有合法的頭和尾,怎麼辦?交給應用程式處理

隨想:

串列埠傳送流程:應用程式(可能是多個)將資料寫到串列埠傳送緩衝區(可被多工共享,注意資料完整性,任務獨佔快取)中;串列埠傳送緩衝區中的資料應該通過一個函式f()(何時通知,是應用程式將所有資料都寫入緩衝區再通知?還是隻要緩衝區中有資料就通知?還是檢測到緩衝區不為空,然後逐個傳送)逐個從串列埠傳送出去(傳送完成再呼叫f());

串列埠接收流程:串列埠中斷中有資料到達,呼叫一個函式g()實現了將資料存入接收緩衝區中;緩衝區非空,通知

相關推薦

ucos系統串列驅動

目的:編寫串列埠驅動檔案,包括串列埠初始化、串列埠收、串列埠傳送、(串列埠傳送緩衝區空、串列埠接收緩衝區滿) 最終實現的目的是各個應用程式不必關心串列埠的實現,僅僅分別向傳送緩衝區完整的寫入資料;同時讓串列埠裝置自行從傳送緩衝區中取數,並從串列埠發出;串列埠接收到的資料自行

[RK3288][Android6.0] 系統除錯串列驅動流程小結

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 rk3288提供了fiq debugger功能, 因此rk將debug uart和普通uart區分開來, debug uart的初始化整合到了fiq debugger程式碼中完成,不過uart的初始化 方法還

linux核心串列驅動註冊過程(tty驅動)

原文轉自:http://m.blog.csdn.net/blog/lushengchu2003/9368031 最近閒來無事情做,想到以前專案中遇到串列埠硬體流控制的問題,藍芽串列埠控制返回錯誤,上層讀寫串列埠buffer溢位的問題等,也折騰了一陣子,雖然 最終證明與串列埠驅動無關,但是排查問題

Linux/Android系統開發 串列驅動原始碼,FIFO模式

該驅動適用於採用linux和android系統平臺的C/C++串列埠開發。 FIFO傳送模式:建立資料傳送FIFO佇列,在多工資料傳送情境下,既能保證資料傳送任務能夠得到執行,又可解決資料傳送衝突問題。 select接收資料:有效監聽串列埠接收資料,提高執行效率,減少出錯

WinCE串列驅動及介面函式介紹

作者:ARM-WinCE 在WinCE中,串列埠驅動實際上就是一個流裝置驅動,具體架構如圖: <shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" pat

WIN7 64位系統 CDC類 虛擬串列驅動無法安裝的解決辦法(2)

(1)最近用STM32使用USB——CDC類出現驅動安裝失敗的情況。 百度了一些網頁,方法很多,大多數是按照如下步驟處理: 首先,確保C:\Windows\System32\drivers\usbser.sys檔案存在; 其次,修改C:\Windows\inf\mdmcpq.inf檔

WIN7 64位系統 CDC類 虛擬串列驅動無法安裝的解決辦法

最近用STM32使用USB——CDC類出現驅動安裝失敗的情況。 百度了一些網頁,方法很多,但是我這裡按如下步驟處理: 首先,確保C:\Windows\System32\drivers\usbser.sys檔案存在; 其次,修改C:\Windows\inf\mdmcpq.inf檔案;

解決WIN10系統下PL2303_USB轉串列驅動相容性問題

出現的問題 -自己安裝完驅動後能正常使用,但是重新插拔之後又不能正常使用了 -所以按照這個思路,我把WIN10的自動更新給關掉了,但是當你接入PL2303,WIN10還是會自動安裝驅

解決win10,64位系統下 PL2303 USB轉串列驅動問題

遇到問題:在win10系統下;在更新某個USB轉串列埠驅動後,出現了黃色歎號,無法識別裝置,遇到提示"該裝置無法啟動(程式碼10)";或者下載安裝USB轉串列埠驅動後,每次插USB轉串列埠線,電腦就會藍屏,終止程式碼:IRQL NOT LESS OR EQUAL解決辦法:  

樹莓派Android系統串列GPS模組驅動

由於方案需要Android系統,安裝了konstakang大神編譯的LineageOS14.1 for RPI3,最新版解決了Wifi連線的問題,點32個贊! TB買了個串列埠GPS模組,相容NMEA協議,但是如何整合到安卓系統呢?一通搜尋後找到了解決方法: 1、到http

windows 系統的 afd 驅動

讀寫 ima key machine spa nbsp 分配 lin 新的 afd 的全稱是 Ancillary Function Driver for WinSock,是 windows 系統網絡部分的核心工具。同 Linux 類似,windows 的 socket 最終

MTK串列驅動開發

MTK串列埠驅動開發 由於最近在工作中需要使用MTK的MT6261進行移動嵌入式裝置的開發,所以將MTK串列埠驅動開發流程貼出來分享給大家。 1.使用串列埠工具配置UART管腳,此處配置的是UART2開啟原始碼目錄下的\custom\drv\Drv_Tool\DrvGen.exe

Linux 串列驅動相關

Linux串列埠驅動相關主要涉及3個重要的結構體,uart_driver,uart_port,uart_ops。本文主要以msm8917平臺分析, 先貼dts相關程式碼 blsp1_uart2: [email protected]78b0000 { compatible

linux使用USB轉串列驅動設定

【一】、驅動相關說明: 如果直接使用串列埠線,而沒有用到USB轉串列埠裝置,就不需要安裝驅動。 如果使用了USB轉串列埠,一般情況下也不需要安裝驅動了,目前linux系統已經包含了該驅動,可以自動識別,亦可通過以下命令檢視以便確認是否支援。 檢視模組裝載的情況: 引用 lsmod |

ubuntu安裝USB轉串列驅動(PL2303)

在Ubuntu下利用minicom進行嵌入式開發時可能會用到USB轉串列埠,這時就會用到USB轉串列埠驅動,以前的Ubuntu是直接將此驅動編譯進核心,但不知道從哪個版本開始Ubuntu將其從核心去掉了,所以要用到Ubuntu的minicom時只能由我們自己安裝USB轉串列埠驅動,方法如下:

ITOP4412裸機程式設計-串列驅動

文章目錄 前言: 原理分析: 原始碼:        修改main.S        修改exynos4412.h    

51微控制器入門_使用keil新建工程以及串列驅動下載和程式燒寫教程

        51微控制器是很簡單的一款微控制器,適合於新手的入門學習,但是也只能作為初學者繼續往上學習的一個墊腳石。這篇部落格我主要的目的是寫給我們學校社團的萌新閱覽的,方便他們入門51,繼續堅持學習下去。假如你有一個51微控

WIN7 CDC類 虛擬串列驅動無法安裝的解決辦法

最近用STM32做了個USB轉虛擬串列埠,但是驅動怎麼也安裝不上。因為曾經用清理工具把系統內不用的驅動清理過,所以關鍵的usbser.sys什麼的都沒有,但是下載後新增到系統內還是不行。 百度一番後,找到了解決辦法。 發一個關於cdc comms interface驅動無

USB轉串列驅動應用於macbook

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

STM32 UART串列驅動程式

文章原始地址: http://feotech.com/?p=56 示例1.通過UART1進行資料傳送 UART 1 的初始化 /** * @brief UART1 Initialise. * @param None. * @retval None. */ void UART