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