當今社會,心臟疾病已嚴重影響了人們的生命安全,許多突發(fā)患者因得不到及時救治而使生命受到威脅。傳統的心電監(jiān)護設備限制了患者的自由,動態(tài)心電記錄儀(Holter)雖能便攜地記錄患者日?;顒訒r的心電數據,但是沒有實時監(jiān)護功能,對于危及生命的突發(fā)心臟病變幫助不大。
無線通信技術的日漸成熟使便攜式心電實時監(jiān)護成為可能。利用GPRS無線數據通信技術,可將實時監(jiān)護功能與Holter結合起來。患者可以配戴監(jiān)護儀自由活動,同時可隨時隨地得到心電監(jiān)護。緊急情況發(fā)生時,患者掌握著可靠的求生路徑;而醫(yī)生可根據全面的心電數據分析患者心臟狀況,使患者的心臟疾病及時得到預防和救治。
400Hz或500Hz采樣的心電數據是一種帶寬較大的數據源,同時心電監(jiān)護也有實時性要求。本文主要闡述在特定硬件平臺和整體系統設計下的遠程心電實時監(jiān)護儀軟件系統的設計。
1 遠程心電實時監(jiān)護系統概述
遠程心電實時監(jiān)護系統包括四個部分:監(jiān)護儀(病人終端)、PDA(醫(yī)生終端)、監(jiān)護服務器以及心電數據服務器。系統結構如圖1所示。
監(jiān)護儀由患者隨身佩帶,以400Hz或500Hz的采樣頻率對患者心電信號采樣,并把心電數據通過GSM/GPRS網絡發(fā)送給監(jiān)護服務器,數據的實時性由監(jiān)護服務器和監(jiān)護儀之間的控制信息控制。PDA接收來自監(jiān)護服務器的數據,并根據心電分析的結果通過數據服務(GPRS數據服務)和短消息(SMS)通知監(jiān)護儀。監(jiān)護服務器負責接收轉存病人端全部心電數據,實時分析及回放分析;同時向PDA轉發(fā)實時心電數據,利用控制信息來協調實時心電數據的收發(fā)。心電數據服務器存儲所有心電數據、患者信息以及設備信息,除了在監(jiān)護過程中存儲心電數據外,心電數據服務器還負責注冊患者和設備信息及管理數據庫遠程訪問等任務。
2 監(jiān)護儀硬件平臺簡介
監(jiān)護儀硬件主要由單片機、電源模塊、心電信號采集放大模塊、擴展NAND Flash、LCD驅動模塊及GSM/GPRS無線通信模塊組成。
(1) 單片機:PIC18系列單片機,低功耗,通過PLL倍頻指令頻率可達10MHz,自帶ADC采樣頻率最高可達幾十kHz。
(2) 電源模塊:為各模塊提供4V和3.3V兩種直流電壓源。
(3) 心電信號采集放大模塊:微弱心電信號采集并放大800倍,同時可檢測導聯脫落。
(4) 擴展NAND Flash:32M NAND Flash,最多可存儲長達23小時的原始心電數據。
(5) LCD驅動模塊:驅動80×160點陣的LCD。
(6) GSM/GPRS無線通信模塊:內嵌TCP(UDP)/IP協議棧,利用Socket建立網絡連接,在應用GPRS發(fā)送數據的同時,仍可以提供GSM語音、短信(SMS)服務。
3 軟件系統關鍵技術
監(jiān)護儀軟件系統的核心是管理Flash、GPRS網絡、無線模塊的GSM功能及LCD。
3.1 Flash管理
Flash存儲器用于存儲心電數據和控制信息,以保證心電數據在斷電時不遺失及日后查看監(jiān)護過程的相關控制信息。
內存映射(Memory Map)模型把Flash作為一個整體,各種不同數據按照類別預先分配存儲空間。操作Flash數據時,首先把內部索引(譬如數據索引或者消息索引)映射到分區(qū)地址,剔除無效存儲單元,再通過Flash操作函數讀取或寫入相應的數據。
3.1.1 Flash分區(qū)結構
(1) Head Seg:大小為1個塊(Block),用于存儲分區(qū)版本號、壞塊表及其余分區(qū)的基本信息,包括分區(qū)起始地址(BaseAdd)、分區(qū)跨度(以塊為單位)、分區(qū)最高地址、數據區(qū)(Data Seg)中的數據范圍、數據區(qū)中數據的格式(FMT)、消息區(qū)(SMS Seg)所有消息的聯系人列表等,每個分區(qū)的基本信息占一頁(Page)。本分區(qū)占Flash存儲器的第一個塊。根據Flash的技術資料可知,第一塊正常使用時不會出現無效存儲單元,因此許多關鍵數據保存于此。
(2) Data Seg:大小為1000個塊,即1000個連續(xù)的有效塊,用于存儲心電數據。如果采樣頻率為400Hz,采樣位數為8位,數據區(qū)可存儲11.37小時的原始心電數據,所有的心電數據從采樣起始點0開始依次編號即心電數據索引,利用該索引尋址。
(3) SMS Seg:大小為20個塊,即20個連續(xù)的有效塊。每個塊存儲一條消息的位圖,消息的到達時間、發(fā)送者存儲在該Block的第一頁(該塊中相對地址為0的頁)。消息存滿則從頭開始覆蓋已有消息,利用消息的索引號來尋址。
Flash分區(qū)結構示意圖如圖2所示。
3.1.2 Flash接口函數
Flash的讀操作,首先從存儲單元中以頁(page)為單位把數據讀入Flash內部的寄存器中,然后再把數據導入處理器的存儲器。讀操作的操作耗時為幾十微秒,與單片機的指令周期大致匹配。讀操作以頁為基本單元,以讀取整頁數據效率最高。Flash頁讀取操作一般不會產生錯誤,Flash文件系統會有糾錯操作,最簡單的糾錯碼可以把非連續(xù)的單個位錯誤改正。而對于當前處理器上的內存映射模型,糾錯碼的引入將大大降低運行效率,因此不做糾錯處理。
(1) FlashPageRead():首先鎖存起始操作字節(jié)的行列地址,送入Read指令,隨后的每個讀操作時序把當前字節(jié)讀出,當前地址指針加1并把數據存儲到讀操作緩沖區(qū)中,同時調用函數時須給出讀出字節(jié)的總數。
Flash的寫操作,又稱為對Flash的編程,即把數據存儲到Flash存儲單元中。存儲單元事先必須已擦除(Erase)過才能寫入數據。寫操作耗時為幾百微秒,擦除操作耗時最多為幾毫秒,在數量級上已大大超過了RAM的寫操作。利用內存映射模型操作Flash的難點在于合理調度使Flash存儲單個字節(jié)的耗時與處理器的指令周期相匹配。每次寫操作要盡可能多地寫入數據,一般每頁(512B)寫入一次。寫操作與擦除操作可能產生壞塊,因此須通知主程序是否產生壞塊。
(2) FlashProgram():首先鎖存寫入數據起始字節(jié)的行列地址,隨后按照函數調用時給定的寫入數據總數,每個寫操作時序向Flash寄存器存儲一個字節(jié)的數據。當寄存器滿,送入Program操作指令即可把寄存器中的數據存儲進入物理存儲單元中。
(3) FlashECGDMap():根據分區(qū)內頁索引和壞塊列表檢索出實際的操作頁地址。首先把分區(qū)內頁地址換算為理想實際地址,即不考慮壞塊,然后檢索壞塊列表及剔除無效地址并給出實際操作地址。
(4) FlashStoreECGData():在數據分區(qū)中存儲心電數據,首先檢查Flash是否處于繁忙狀態(tài),若空閑則立即占用Flash,把采樣數據導入Flash寫緩沖。如果寫緩沖達到存儲操作條件,則調用FlashECGDMap()獲取實際的操作地址并檢查是否Flash的該操作塊需要擦除。若需要擦除,則調用FlashErase()函數,擦除狀況檢查完畢即調用FlashProgram()保存數據。若所有操作完畢,則釋放Flash的控制權。
(5) FlashLoadECGData():從數據分區(qū)中讀取一定字節(jié)數的心電數據。首先需要在Flash空閑狀態(tài)下獲取Flash的控制權,隨后利用FlashECGDMap()獲取實際操作地址并判斷是否出現跨頁讀操作。如果不需跨頁,則調用FlashPageRead(),讀出相應數據到讀緩沖即可;若跨頁,則分別在兩頁分兩次讀取規(guī)定字節(jié)個數的連續(xù)心電數據。