實時操作系統(tǒng)應用技術 課件 第8、9章-基于WiFi通信的物聯(lián)網應用開發(fā)、初步理解RT-Thread的調度原理_第1頁
實時操作系統(tǒng)應用技術 課件 第8、9章-基于WiFi通信的物聯(lián)網應用開發(fā)、初步理解RT-Thread的調度原理_第2頁
實時操作系統(tǒng)應用技術 課件 第8、9章-基于WiFi通信的物聯(lián)網應用開發(fā)、初步理解RT-Thread的調度原理_第3頁
實時操作系統(tǒng)應用技術 課件 第8、9章-基于WiFi通信的物聯(lián)網應用開發(fā)、初步理解RT-Thread的調度原理_第4頁
實時操作系統(tǒng)應用技術 課件 第8、9章-基于WiFi通信的物聯(lián)網應用開發(fā)、初步理解RT-Thread的調度原理_第5頁
已閱讀5頁,還剩147頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

RTOS本章導引:本章從技術科學角度,把WiFi應用知識體系歸納為終端UE、信息郵局MPO、人機交互系統(tǒng)HCI三部分。針對終端UE,以通用嵌入式計算機GEC概念為基礎,基于給出應用程序模板。針對信息郵局MPO,將其抽象為固定IP地址與端口,給出云偵聽程序模板;針對人機交互系統(tǒng),給出Web網頁及微信小程序模板。這些工作為“照葫蘆畫瓢”地進行具體應用提供共性技術,形成了以GEC為核心,以構件為支撐,以工程模板為基礎的物聯(lián)網應用開發(fā)生態(tài)系統(tǒng),可有效地降低物聯(lián)網應用開發(fā)的技術門檻。第8章基于WiFi通信的物聯(lián)網應用開發(fā)8.1WiFi應用開發(fā)概述RTOS8.2WiFi應用架構及通信基本過程8.3在局域網下驗證WiFi通信過程8.4在公網下驗證WiFi通信過程8.5程序模板簡明解析8.6遠程更新終端UE程序8.7本章小結第1頁共53頁第8章基于WiFi通信的物聯(lián)網應用開發(fā)RTOSWiFi的更正式寫法為Wi-Fi,發(fā)音[?wa?fa?],為編程方便,本書采用多數(shù)通俗寫法WiFi,在中文里常被叫做“移動熱點”。WiFi的起始時間點是1997年,是一種基于IEEE802.11標準的無線局域網技術。從技術指標來看,WiFi通信距離為100m左右,1997年發(fā)布的WiFi0版本,工作頻段為2.4GHz,最高速率2Mbps;2022年發(fā)布WiFi7版本,工作頻段為2.4GHz、5GHz、6GHz,最高速率30Mbps;WiFi模塊發(fā)射功率一般在18dbm左右。8.1WiFi應用開發(fā)概述第2頁共53頁8.1.1WiFi概述RTOS8.1.2WiFi通信過程與應用開發(fā)相關的基本概念進行基于WiFi通信的物聯(lián)網應用開發(fā),需要了解幾個與終端UE、信息郵局MPO、人機交互系統(tǒng)HCI直接相關的基本概念。1.與終端UE相關的基本概念1)使用媒體訪問控制地址MAC作為終端UE的唯一標識。終端UE需要一個唯一的標識,以便區(qū)別不同的終端UE,可使用媒體訪問控制地址(MediaAccessControladdress,MAC)來作為終端UE的唯一標識。每個WiFi模塊都有這樣一個唯一的標識,就像手機中的SIM卡號一樣。2)WiFi熱點WiFi熱點,即無線接入點(AccessPoint,AP),是一種可以把互聯(lián)網轉換為WiFi無線信號的設備,使附近WiFi用戶能夠通過該熱點接入互聯(lián)網。第3頁共53頁RTOS1.與終端UE相關的基本概念3)服務集標識當WiFi終端UE的無線信號打開時,終端UE會與附近的熱點連接。終端UE可以通過AT指令獲取接入點的服務集標識(ServiceSetIdentifier,SSID),根據服務集標識,UE可以知道自己接入了哪個熱點。4)WiFi熱點給終端分配的IP地址當WiFi終端UE成功連接到一個熱點時(即附著到核心網時),該熱點通過動態(tài)主機配置協(xié)議DHCP(DynamicHostConfigurationProtocol)向終端分配一個IP地址,使其能夠在核心網上進行通信。第4頁共53頁RTOS2.與信息郵局MPO相關的基本概念1)IP地址Internet上的每臺主機都有一個唯一的IP地址。IP地址由網絡號(Network

ID)和主機號(HostID)兩部分組成。2)端口號一臺擁有IP地址的主機可以提供許多服務,比如Web服務、FTP服務、SMTP服務等,這些服務可以通過1個IP地址實現(xiàn)。好比一座大樓里有許多不同房間,每個房間的功能不同,大樓名字相對于IP地址,房間號相當于端口號。3)互聯(lián)網互聯(lián)網是一個全球性的計算機網絡系統(tǒng),由多個物理網絡、路由器、服務器和終端設備組成,它們之間通過標準的互聯(lián)網協(xié)議TCP/IP(TransmissionControlProtocol/InternetProtocol)實現(xiàn)數(shù)據的傳輸和交換。第5頁共53頁RTOS3.與人機交互系統(tǒng)HCI相關的基本概念1)偵聽程序與云服務器終端UE主動向(固定IP地址:端口)發(fā)送數(shù)據,可以把具有固定IP地址且負責接收數(shù)據的計算機器稱為云服務器或云平臺。2)數(shù)據庫數(shù)據庫是駐留在云服務器上的存儲數(shù)據的地方。數(shù)據庫由若干張表組成,每張表又由若干個字段組成,對數(shù)據庫的操作大多是對表的操作,而對于表的基本操作有:增、刪、改、查。3)客戶端客戶端或稱用戶端,指與服務器相對應,為客戶提供本地服務的程序。一般安裝在普通的用戶計算機(或稱客戶機)上,需要與服務端互相配合運行。第6頁共53頁RTOS1.物聯(lián)網應用開發(fā)所面臨的問題在相當長的一段時間內,物聯(lián)網智能制造系統(tǒng)已經受到許多實體行業(yè)的廣泛重視。進行物聯(lián)網智能系統(tǒng)的軟硬件設計往往具有較高的技術門檻,主要表現(xiàn)在:需要軟硬件協(xié)同設計,涉及軟件、硬件及行業(yè)領域知識;一些系統(tǒng)具有較高的實時性要求;物聯(lián)網智能產品必須具有較強的抗干擾性與穩(wěn)定性;開發(fā)過程中需要不斷的軟硬聯(lián)合測試。因此開發(fā)物聯(lián)網智能產品會出現(xiàn)成本高、周期長、穩(wěn)定性難以保證等困擾,對技術人員的綜合開發(fā)能力提出了更高的要求,這些問題是許多中小型終端產品企業(yè)技術轉型的重要瓶頸之一。第7頁共53頁8.1.3物聯(lián)網應用開發(fā)所面臨的問題及解決思路RTOS2.解決物聯(lián)網應用開發(fā)所面臨難題的基本思路從技術科學層面,研究抽象物聯(lián)網應用系統(tǒng)的技術共性,加以凝練分析,形成可復用、可移植的構件、類、框架,實現(xiàn)整體建模,合理分層,達到軟硬可復用與可移植的目的。本章給出物聯(lián)網智能系統(tǒng)的應用架構及應用方法,依照軟硬件模板(“葫蘆”),使技術人員可以在此模板基礎上,進行特定應用的開發(fā)(“照葫蘆畫瓢”)。架構抽象物聯(lián)網智能系統(tǒng)的共性技術、理清共性與個性的銜接關系、封裝軟硬件構件、實現(xiàn)軟件分層與復用。以此來有效降低技術門檻、縮短開發(fā)周期、降低開發(fā)成本、明確人員職責定位、減少重復勞動、提高開發(fā)效率。從形式上說,可以把這些內容稱為“中間件”,它不是終端產品,但為終端產品服務,有了它,可以較大地降低技術門檻。第8頁共53頁RTOS1.金葫蘆WiFi開發(fā)套件的設計思想金葫蘆WiFi開發(fā)套件關鍵特點在于完全從實際產品可用角度設計終端UE板,一般“評估板”與“學習板”,僅為學習而用,并不能應用于實際產品。該套件的軟件部分給出了各組成要素的較為規(guī)范的模板,且注重文檔撰寫。設計思想及基本特點:立即檢驗WiFi通信狀況、透明理解WiFi通信流程、實現(xiàn)復雜問題簡單化、兼顧物聯(lián)網應用系統(tǒng)的完整性、考慮組件的可增加性及環(huán)境多樣性、考慮“照葫蘆畫瓢”的可操作性。第9頁共53頁8.1.4金葫蘆WiFi開發(fā)套件簡介RTOS2.金葫蘆WiFi開發(fā)套件的硬件資源金葫蘆WiFi開發(fā)套件的硬件部分由ST的STM32L431RCT6微控制器與上海慶科的EMW3072的WiFi模塊組成,AHL-STM32L431正面集成了最小系統(tǒng),反面添加了WiFi外設模塊,構成了AHL-STM32L431-WiFi硬件型號,見下圖。再有一根標準的Type-C線即可進行基于WiFi通信的物聯(lián)網實踐。第10頁共53頁RTOS3.金葫蘆WiFi開發(fā)套件的軟件資源第11頁共53頁RTOS8.2WiFi應用架構及通信基本過程(重點,難點)8.2.1建立WiFi應用架構的基本原則本節(jié)將遵循人的認識過程由個別到一般,再由一般到個別的哲學原理,從技術科學范疇,以面向應用的視角,抽取WiFi應用開發(fā)的技術共性,建立起能涵蓋WiFi應用開發(fā)知識要素的應用架構,為實現(xiàn)快速規(guī)范的應用開發(fā)提供理論基礎。從個別到一般,就是要把WiFi應用開發(fā)所涉及的軟件硬件體系的共性抽象出來,概括好、梳理好,建立與其知識要素相適應的抽象模型,為具體的WiFi應用開發(fā)提供模板(“葫蘆”),為“照葫蘆畫瓢”提供技術基礎。從一般到個別,就是要理清共性與個性的關系,充分利用模板(“葫蘆”),依據“照葫蘆畫瓢”方法,快速實現(xiàn)具體應用的開發(fā)。第12頁共53頁RTOS8.2.2終端UE、信息郵局MPO與人機交互系統(tǒng)HCI的基本定義WiFi應用架構可以抽象為WiFi終端UE、WiFi信息郵局MPO、WiFi人機交互系統(tǒng)HCI三個組成部分,如右圖所示,這種抽象為深入理解WiFi的應用層面開發(fā)共性提供理論基礎。第13頁共53頁RTOS1.WiFi終端UE終端UE是一種以微控制器MCU為核心,具有數(shù)據采集、控制、運算等功能,帶有WiFi通信功能,甚至包含機械結構,用于實現(xiàn)特定功能的軟硬件實體。2.WiFi信息郵局MPOWiFi信息郵局(MssagePostOffice,MPO)是一種基于WiFi協(xié)議的信息傳送系統(tǒng),運行云偵聽程序。在WiFi終端UE與WiFi人機交互系統(tǒng)HCI之間起信息傳送的橋梁作用,由信息運行商負責建立與維護。3.WiFi人機交互系統(tǒng)HCI人機交互系統(tǒng)HCI是實現(xiàn)人與WiFi信息郵局之間信息交互、信息處理與信息服務的軟硬件系統(tǒng)。從應用開發(fā)角度來看,人機交互系統(tǒng)HCI就是與信息郵局MPO的固定IP地址與端口打交道,通過這個固定IP地址與端口,實現(xiàn)與終端UE的信息傳輸。第14頁共53頁RTOS8.2.3基于信息郵局初略了解基本通信過程在有了WiFi應用架構之后,類比通過郵局寄信的過程,來理解WiFi的通信過程。雖然流程不完全一樣,但仍然可以做一定的對比理解。下圖給出了基于信息郵局MPO的WiFi通信流程,分為上行過程與下行過程。第15頁共53頁RTOS1.數(shù)據上行過程UE有個唯一標識——NIC卡號,即MAC地址(自身地址,即寄件人地址);對方地址是個中轉站(這就是收件人地址了),即固定IP地址與端口;信息郵局MPO把通過接入點AP傳來的“信件”送到固定IP地址與端口這個中轉站;人機交互系統(tǒng)HCI“偵聽”著這個固定IP地址與端口,一旦來“信”,則把“信件”取走。2.數(shù)據下行過程把標有收件人地址(UE的NIC卡號)“信件”送到固定IP地址與端口,信息郵局MPO會根據收件人地址送到相應的終端。當然這個過程的實際工作要復雜得多,但從應用開發(fā)角度這樣理解就可以了,信息傳送過程由信息郵局MPO負責,WiFi應用產品開發(fā)人員只需專注于終端UE的軟硬件設計,以及人機交互系統(tǒng)HCI的軟件開發(fā)。第16頁共53頁RTOS8.3在局域網下驗證WiFi通信過程8.3.1筆記本電腦方的設置1.打開移動熱點在屏幕左下方的搜索欄目中,輸入“移動熱點設置”后,然后按回車鍵,進行移動熱點設置。2.編輯移動熱點信息在該界面下,編輯“網絡名稱、網絡密碼、網絡頻帶,網絡頻帶設為2.4GHz,如右圖所示;這是由AHL-STM32L431-WiFi開發(fā)套件使用的WiFi模塊EMW3072決定的。第17頁共53頁RTOS3.獲取本機IP地址在屏幕左下方的搜索欄目中,鍵入DOS三個字母,然后按回車鍵,進入DOS命令界面。在DOS命令行下輸入命令“ipconfig”獲取本機IP地址,如下圖所示。本實驗使用Ipv4地址,請記下這個地址,以便在終端程序中設置這個地址,方可進行通信。第18頁共53頁RTOS8.3.2修改終端程序并下載運行第19頁共53頁1.修改終端程序的服務器及WiFi配置復制電子資源下“..\03-Software\CH08-WiFi-IoT”文件夾中的User-WiFi程序(注意文件名中有芯片型號)復制為User-WiFi-Test1,修改這個程序進行測試使用。利用AHL-GEC-IDE打開這個工程,修改“\07_AppPrg\includes.h”中的flashInit數(shù)組,如圖所示,IP地址改為:6,端口號可設為32225,同時將WiFi名稱、WiFi密碼分別修改WiFiTest、12345678。RTOS2.編譯下載運行修改后的終端程序刪除工程中原Debug文件夾,重新編譯工程,下載到GEC中,正常情況如圖所示。此時,在屏幕左下方的搜索欄目中,輸入“移動熱點設置”后,按回車鍵,進入移動熱點界面,可以看到已連接的設備1臺,這說明我們的WiFi終端已經通過WiFi通信的方式連接的筆記本電腦的移動熱點了。第20頁共53頁RTOS8.3.3修改并運行CS-Monitor程序1.修改CS-Monitor程序中的端口號復制電子資源下“..\03-Software\CH08-WiFi-IoT”文件夾中的CS-Monitor程序復制為CS-Monitor-Test1,修改這個程序進行測試使用。雙擊該文件夾下解決方案文件AHL-IoT.sln,打開工程,修改04_Resource\AHL.xml中的本地端口號與終端設置的一致即可,例如本例面向終端的端口號為32225,面向人機交互系統(tǒng)HCI(網頁、手機APP、微信小程序)的端口號為32226。面向終端的IP地址使用local,面向HCI的IP地址使用ws://,如下圖所示。第21頁共53頁RTOS2.修改CS-Monitor程序中的端口號每隔30秒CS-Monitor將會收到來自WiFi終端的數(shù)據,正常顯示如下圖所示。在收到數(shù)據后的短時間內可以更改上傳間隔,例如改為10秒,單擊【回發(fā)】按鈕,再單擊【清空】按鈕,下次上來的數(shù)據時間間隔已經改變。第22頁共53頁RTOS3.查看數(shù)據庫與表的簡單方法數(shù)據存放在數(shù)據庫文件AHL-IoT.mdf中,該文件處于工程文件夾的“..\04_Resource\DataBase”文件夾內,該文件夾內還有另一文件AHL-IoT_log.ldf,它是自動生成的日志文件。AHL-IoT.mdf內含幾張數(shù)據表,每張數(shù)據表都由行和列組成,每一列稱為一個字段,每一行稱為一個記錄,在C#開發(fā)環(huán)境中簡單地查看數(shù)據庫與表的內容的步驟如下:1)打開CS-Monitor工程,利用“解決方案資源管理器”查看程序。2)查看數(shù)據庫。3)查看數(shù)據內的表。第23頁共53頁RTOS8.3.4

修改并運行Web程序1.修改Web程序中的IP地址及端口號復制電子資源下“..\03-Software\CH08-WiFi-IoT”文件夾中的Web程序為Web-Test1,修改這個程序進行測試使用。雙擊該文件夾下解決方案文件US-Web.sln,打開工程,修改Web.config中的IP地址及端口號,與CS-Monitor設置的一致即可,例如本例面向人機交互系統(tǒng)HCI(如網頁)的端口號為32226,IP地址使用ws://6,如下圖所示。第24頁共53頁RTOS2.運行Web程序在CS-Monitor正確運行及Web.config中的IP地址及端口號正確設置的前提下,雙擊“IISExpress(瀏覽器)”進入金葫蘆WiFi網頁,點擊實時數(shù)據,每隔30秒Web將會收到來自CS-Monitor的數(shù)據,正常顯示如下圖所示。第25頁共53頁RTOS8.3.3

如何新增一個物理量首先將電子資源下“..\03-Software\CH08-WiFi-IoT”文件夾中的User-WiFi-Test1程序(注意芯片型號)復制為User-WiFi-Test2,修改這個程序進行測試使用,然后按照下面的步驟完成User-WiFi-Test2的“照葫蘆畫瓢”,以實現(xiàn)對藍燈狀態(tài)的控制。1.修改終端程序1)添加變量。打開User-WiFi-Test2樣例工程,找到07_AppPrg文件夾下的includes.h頭文件,在UserData結構體的注釋“【畫瓢處】-用戶自定義添加數(shù)據”下添加變量。2)初始化藍燈。在thread_init.c的初始化處,初始化藍燈。第26頁共53頁RTOS1.修改終端程序3)控制紅燈閃爍。在thread_send.c文件中的注釋“【畫瓢處】-控制藍燈”處,添加根據接收到的狀態(tài)變量控制藍燈語句。4)編譯并下載修改后的終端程序。刪除工程中的原Debug文件夾,重新編譯修改后的終端程序,下載到GEC中運行即可。第27頁共53頁RTOS2.修改CS-Monitor將“..\03-Software\CH08-WiFi-IoT”文件夾中的CS-Monitor-Test1程序復制為CS-Monitor-Test2,修改這個程序進行測試,通過在CS-Monitor的AHL.xml文件中增加一個可寫類型的小燈控制字段,達到控制小燈狀態(tài)的目的。利用VisualStudio2022打開CS-Monitor-Test2的模板程序,按照以下步驟進行修改。1)添加變量名和顯示名。為了更具有直觀性,在CS-Monitor中新增一欄,用于存儲小燈信息的變量及顯示名,可以在AHL.xml文件中搜索“畫瓢處”,確認“畫瓢處”的位置。2)添加該變量至命令“U0”中。在“AHL.xml”文件中,將新增變量light_state添加至命令“U0”中??梢栽贏HL.xml文件中搜索“【畫瓢處】-【新增小燈】添加變量至命令“U0””進行畫瓢處的確認。第28頁共53頁RTOS3.運行CS-Monitor測試控制藍燈添加完成后運行CS-Monitor,出現(xiàn)下圖所示的結果,界面中自動增加了一個藍燈狀態(tài)欄目。在藍燈狀態(tài)輸入框中輸入0,單擊回發(fā)按鈕,發(fā)開發(fā)板上的藍燈會亮起;等下輪數(shù)據上來后,若輸入1再回發(fā),則可關閉藍燈。由此體會到如何增加一個物理量,以及數(shù)據的雙向通信。第29頁共53頁RTOS8.4在公網下驗證WiFi通信過程8.4.1內網穿透1.FRP內網穿透基本原理FRP服務端軟件將內網的CS-Monitor服務器映射到云服務器的公網IP上,接入外網的讀者計算機和云服務器一起組成了新的“信息郵局MPO”,為終端UE與人機交互系統(tǒng)HCI提供服務。此時,客戶端程序CS-Client、Web網頁程序、微信小程序、終端UE都可以像訪問公網IP那樣,訪問讀者計算機上運行的CS-Monitor服務器了。第30頁共53頁RTOS2.利用蘇大云服務器搭建讀者的臨時服務器CS-Monitor的運行需要兩個端口,一個服務于UE,另一個服務于HCI。設面向終端UE的映射名稱為“UE_map”,端口為32225,則映射到公網的UE端口為32225,這兩個端口號(32225)必須相同;面向人機交互系統(tǒng)HCI各客戶端的映射名稱為“HCI_map”,本機服務偵聽的HCI端口為32226,映射到公網的HCI端口為32226,這兩個端口號(32226)必須相同。1)復制FRP文件夾。2)修改客戶端配置文件frpc.ini。3)啟動FRP客戶端。第31頁共53頁RTOS8.4.2修改終端程序并下載運行復制電子資源下“..\03-Software\CH08-WiFi-IoT”文件夾中的User-WiFi-Test1程序(注意芯片型號)拷貝為User-WiFi-Test3,設固定IP地址為64,按照8.3.2中的方法修改服務器地址為“64”,刪除工程中的原Debug文件夾,重新編譯工程,下載到GEC中運行即可。在完成上節(jié)工作并啟動了FRP客戶端后,此時,讀者已經擁有了自己的臨時云服務器,形象地說,擁有了“一朵臨時云”,它是運行CS-Monitor程序的基礎。在本機運行CS-Monitor,就如在云服務器上運行CS-Monitor。特別提示:此時運行CS-Monitor若沒有數(shù)據,檢測一下FRP的端口設置是否與云偵聽的一致。第32頁共53頁RTOS8.4.3修改并運行Web程序復制電子資源下“..\03-Software\CH08-WiFi-IoT”文件夾中的Web程序為Web-Test2,修改這個程序進行測試使用。參照8.3.4小節(jié),修改Web.config文件IP地址為:64端口號為:32226即可。第33頁共53頁RTOS8.4.4修改并運行微信小程序微信小程序的開發(fā)環(huán)境可從網上下載,方法如下:打開瀏覽器搜索“微信官方文檔”,點擊“小程序→工具→下載→穩(wěn)定版StableBuild”,選擇對應的計算機系統(tǒng)版本進行下載安裝即可。1.修改微信小程序中的端口號。2.運行微信小程序。3.數(shù)據回發(fā)。第34頁共53頁RTOS8.4.5直接在云服務器上運行CS-Monitor若有自己的服務器,在運行8.4.2的終端程序情況下,不需要內網穿透,可直接在服務器上運行CS-Monitor,則終端數(shù)據通過WiFi通信進入公網,送向云偵聽程序,如下圖所示。第35頁共53頁RTOS8.5程序模板簡明解析(重點)8.5.1終端UE模板終端UE模板工程在“User_WiFi”文件夾。終端UE的運行過程,包括主線程啟動和分線程運行。1.UE硬件接口描述:第36頁共53頁RTOS2.UE程序功能1)初始化部分。上電啟動后初始化工作主要包括:①

給通信模組供電;②初始化紅色運行指示燈、Flash模塊,初始化TIMERC定時器為20毫秒中斷;③設置系統(tǒng)時間初值:“年-月-日時:分:秒”;④使能TIMERC中斷。2)周期性循環(huán)功能主要包括:①控制運行指示燈每秒閃爍一次;②根據發(fā)送頻率,定時向CS-Monitor發(fā)送數(shù)據。3)中斷服務例程功能:①在TIMERC中斷服務例程中進行計時;②MCU與通信模組的串口中斷,UE與CS-Monitor通信使用該中斷。第37頁共53頁RTOS3.線程劃分1)初始化線程thread_init,負責完成上電啟動后初始化工作。2)發(fā)送數(shù)據線程thread_send,負責的功能包括:①控制運行指示燈每秒閃爍一次;②每到發(fā)送頻率30秒時,將待發(fā)送數(shù)據組幀發(fā)送給CS-Monitor。第38頁共53頁4.線程和中斷處理程序執(zhí)行流程RTOS各線程執(zhí)行流程中斷處理程序執(zhí)行流程第39頁共53頁RTOS8.5.2云偵聽模板1.界面加載處理程序界面加載過程主要包括:①從Program.cs文件的應用程序主入口點main函數(shù)開始執(zhí)行,創(chuàng)建并啟動主窗體FrmMain;②在主窗體加載事件處理程序FrmMain_Load中初始化數(shù)據庫表結構,然后跳轉至實時數(shù)據界面frmRealtimeData窗體運行;③在frmRealtimeData窗體中,動態(tài)加載界面待顯示數(shù)據的標簽和文本框、偵聽面向終端數(shù)據的端口、將IoT_rec函數(shù)注冊為接收終端UE上行數(shù)據的事件處理程序,最后開啟websocket,服務于UE回發(fā)數(shù)據,以及CS-Monitor與HCI的數(shù)據交互。第40頁共53頁RTOS2.云偵聽事件處理程序云偵聽事件包括接收終端UE數(shù)據的DataReceivedEvent事件和接收人機交互系統(tǒng)HCI數(shù)據的OnMessage事件。DataReceivedEvent事件綁定的處理函數(shù)是IoT_recv,其主要功能包括:①解析并顯示UE的數(shù)據;②將數(shù)據存入數(shù)據庫的上行表中;③向HCI廣播數(shù)據到達信息。OnMessage事件主要功能包括:①接收HCI發(fā)來的數(shù)據;②將數(shù)據回發(fā)給UE。3.控件單擊事件控件單擊事件包括“清空”和“回發(fā)”按鈕事件,以及實時曲線、歷史數(shù)據、歷史曲線、基本參數(shù)、幫助和退出等菜單欄單擊事件?!扒蹇铡卑粹o事件主要功能是清除實時數(shù)據界面的文本框內容,“回發(fā)”按鈕事件主要功能是在指定的回發(fā)時間內將更新后的數(shù)據發(fā)送給UE。第41頁共53頁RTOS8.5.3

Web網頁模板下圖給出了Web網頁模板的樹形工程結構,其物理組織與邏輯組織一致。該模板是在VisualStudio2022(簡稱VS2022)開發(fā)環(huán)境下,基于ASP.NET的Web網頁而制作的。第42頁共53頁RTOS8.5.3微信小程序模板1.工程結構工程結構共有5個文件夾和4個文件,它們的功能如下表所示。第43頁共53頁RTOS2.頁面文件夾pages文件夾下包含多個文件夾,每個文件夾對應一個頁面,每個頁面包含四個文件,其中.wxml文件是頁面文件;.js是事件交互文件,用于實現(xiàn)小程序邏輯交互等功能;.wxss為頁面美化文件,讓頁面顯示的更加美觀;.json為配置文件,用于修改導航欄顯示樣式等。pages文件夾下的實時數(shù)據頁面(data)包含的目錄內容如下表所示。第44頁共53頁RTOS8.6遠程更新終端UE程序(重點、難點)8.6.1遠程更新概述遠程更新是通過網絡連接,將軟件代碼從服務器傳輸?shù)娇蛻舳嗽O備中。主要涉及以下幾個方面的內容:1)客戶端和服務器通信,遠程更新的第一步是建立客戶端和服務器之間的通信??蛻舳送ㄟ^網絡連接服務器,發(fā)送更新請求并接收服務器的響應。2)驗證完整性,在進行遠程更新時,驗證數(shù)據的完整性是非常重要的??蛻舳藭炞C從服務器上接收到的更新文件完整性。3)更新應用和重啟,一旦客戶端完成更新文件的接收和驗證,它會將更新應用到軟件或系統(tǒng)中。根據不同的更新類型,更新可能需要重啟設備或重新啟動相應的應用程序,以使更新生效。第45頁共53頁RTOS8.6.2遠程更新實現(xiàn)過程遠程更新程序軟件為“..\03-Software\CH08-WiFi-IoT\update-pc\updatePC.exe”,可以在服務器上運行,也可以通過內網穿透后在本地計算機上運行,步驟如下。1)若使用內網穿透,需要啟動兩個FRP客戶端,同時開啟“32225”與“23335”兩個端口,其中“23335”為遠程更新固定端口號;2)需要更新程序的一方,上電啟動終端UE模板程序(即“..\03-Software\CH08-WiFi-IoT\User-WiFi”);第46頁共53頁RTOS8.6.2遠程更新實現(xiàn)過程3)打開“updatePC.exe”遠程更新軟件,界面如右圖所示。根據本次更新需求選擇BIOS更新或User更新。需要注意的是,在BIOS更新過程中,WiFi終端UE中的User程序會被擦除,所以在BIOS更新完成后,需要進一步對User程序進行更新。第47頁共53頁RTOS4)輸入服務器的IP地址以及和設備進行通信的端口號。以本書為例,需要在文本框中輸入的IP地址為:64,由上而下分別輸入端口號32225與23335。點擊開啟偵聽按鈕,等待獲取WiFi終端UE的MAC地址。如右圖所示。第48頁共53頁RTOS5)成功獲取到WiFi終端UE的MAC地址后,點擊【連接GEC】,遠程更新軟件會與該WiFi終端UE建立連接,成功連接界面如右圖所示。第49頁共53頁RTOS6)點擊【選擇文件】,導入需要更新的BIOS程序或User程序的.hex文件,點擊【一鍵自動更新】,遠程更新軟件將選定的BIOS程序或User程序更新至WiFi終端UE中,如右圖所示。第50頁共53頁RTOS7)等待數(shù)據檢測,若出現(xiàn)數(shù)據丟失的情況,則進行丟幀補發(fā),直至程序全部更新完成。若進行User更新,則等待更新完成即可;若進行BIOS更新,等待BIOS更新完成后,繼續(xù)執(zhí)行第6步,導入User程序的.hex文件進行更新。更新成功后將進入User程序,如圖所示。第51頁共53頁RTOS14.3.3建立云偵聽程序的運行場景1.FRP內網穿透基本原理FRP服務端軟件將內網的云偵聽CS-Monitor服務器映射到云服務器的公網IP上,接入外網的讀者計算機和云服務器一起組成了新的“信息郵局MPO”,為終端UE與人機交互系統(tǒng)HCI提供服務。此時,客戶端程序CS-Client、Web網頁程序、微信小程序、AndroidApp、終端UE都可以像訪問公網IP那樣,訪問讀者計算機上運行的CS-Monitor服務器。第52頁共53頁RTOS8.7本章小結

本章從技術科學角度,把WiFi應用知識體系歸納為終端UE、信息郵局MPO、人機交互系統(tǒng)HCI三個有機組成部分。從應用開發(fā)者視角來看,信息郵局MPO抽象為固定IP地址與端口,從程序上看就是云偵聽程序,人機交互系統(tǒng)HCI通過信息郵局與終端打交道。本章給出了以通用嵌入式計算機GEC為基礎、以RT-Thread實時操作系統(tǒng)為工具的終端應用模板,并給出了云偵聽程序模板、Wed網頁及微信小程序模板,為“照葫蘆畫瓢”地進行具體應用提供共性技術,形成了以GEC為核心,以構件為支撐,以工程模板為基礎的WiFi應用開發(fā)生態(tài)系統(tǒng),為有效地降低WiFi應用開發(fā)的技術門檻提供了基礎。第53頁共53頁RTOS本章導引:俗話說,知其然,還要知其所以然,即不僅要學會在RTOS下進行應用程序的開發(fā),還要理解RTOS的工作原理。若能理解原理,對應用編程肯定有益處,但不能陷入原理,而忽視應用編程?;诒緯繕硕ㄎ辉趹镁幊蹋栽谠韺用?,則把目標確定為“知其然且了解其所以然”,原理服務于應用。這里用一章篇幅,高度概括RT-Thread的基本原理,為應用編程提供理論基礎。第9章

初步理解RT-Thread的調度原理9.1理解RTOS所需要的相關基礎知識RTOS9.2RT-Thread的啟動流程分析9.3RT-Thread中的時鐘嘀嗒剖析9.4RT-Thread中的事件與消息隊列的觸發(fā)過程分析9.5

RT-Thread中的信號量與互斥量的觸發(fā)過程分析第9章

初步理解RT-Thread的調度原理9.6本章小結第55頁共97頁RTOS9.1.1CPU內部寄存器及ARMCortex-M中主要寄存器(重點)9.1理解RTOS所需要的相關基礎知識RTOS在運行過程中需要對CPU的寄存器頻繁進行操作。本書采用的是基于ARMCortex-M系列內核的微控制器,了解其CPU內部主要寄存器的作用是理解RTOS的基本原理的前提條件。計算機所有指令運行均由CPU完成,CPU內部寄存器負責信息暫存,其數(shù)量與處理能力直接影響CPU的性能,這里先從一般意義上闡述寄存器的基本分類,隨后給出ARM

Cortex-M4微處理器內部寄存器。第56頁共97頁RTOS1.CPU內部寄存器的基本分類(1)數(shù)據緩沖類寄存器CPU內數(shù)量最多的寄存器是數(shù)據緩沖用途的寄存器,名字用寄存器英文Register的首字母加數(shù)字組成,如R0、R1、R2等等,不同CPU其種類不同。(2)棧指針類寄存器在計算機的編程中,全局變量具有固定的存儲地址,而局部變量則不同,采用“后進先出”原則使用一段RAM區(qū)域,這段RAM區(qū)域被稱為棧區(qū)。它有個棧底的地址,是一開始就確定的,當有數(shù)據進?;虺鰲r,地址會自動連續(xù)變動,不然就放到同一個存儲地址中了,CPU中需要有個地方保存這個不斷變化的地址,這就是棧指針寄存器(StackPointer,SP)。第57頁共97頁RTOS(3)程序指針類寄存器在許多CPU中,它的名字叫做程序計數(shù)寄存器(ProgramCounter,PC),它負責告訴CPU將要執(zhí)行的指令在存儲器的什么地方。(4)程序運行狀態(tài)類寄存器CPU在進行計算過程中,會出現(xiàn)諸如進位、借位、結果為0、溢出等情況,CPU內需要有個地方把它們保存下來,以便下一條指令結合這些情況進行處理,這類寄存器就是程序運行狀態(tài)類寄存器。(3)其他功能寄存器除了上述寄存器之外,還有表示浮點數(shù)運算、中斷屏蔽等寄存器。第58頁共97頁RTOS2.ArmCortex-M中主要寄存器ARMCortex-M處理器的寄存器主要有R0~R15及3個特殊功能寄存器,如圖9-1所示。其中R0~R12為通用寄存器,R13為堆棧指針(StackPointer,SP),R14是連接寄存器,R15為程序計數(shù)器(ProgramCounter,PC)。特殊功能寄存器有預定義的功能,而且必須通過專用的指令來訪問。第59頁共97頁RTOS(1)通用寄存器R0~R12

R0~R12是最具“通用功能”的32位通用寄存器,用于數(shù)據操作,復位后初始值為隨機值。(2)堆棧指針寄存器R13(SP)R13是堆棧指針(SP)。在ARMCortex-M處理器中共有兩個堆棧指針:主堆棧指針(MSP)和進程堆棧指針(PSP),若用戶用到其中一個,另一個必須用特殊指令(MRS、MSR指令)來訪問,因此任一時刻只能使用其中的一個。第60頁共97頁RTOS(3)連接寄存器R14(LR)當調用一個子程序時,由R14存儲返回地址。在其他情況下,可以將R14作為通用寄存器使用。(4)程序計數(shù)器寄存器R15(PC)R15是程序計數(shù)器(ProgramCounter,PC),其內容為當前正在執(zhí)行指令的地址。如果修改它的值,就能改變程序的執(zhí)行流程(很多高級技巧隱藏其中)。在理解RTOS運行流程時,關鍵點就是要理解PC寄存器值是如何變化的,PC值的變化反映了程序的真實流程。第61頁共97頁RTOS(5)特殊功能寄存器ARMCortex-M內核中有一組特殊功能寄存器,包括程序狀態(tài)字寄存器(xPSR)、中斷屏蔽寄存器(PRIMASK)和控制寄存器(CONTROL)。1)程序狀態(tài)字寄存器在內部分為以下幾個子寄存器:

應用程序狀態(tài)寄存器APSR(ApplicationProgramStatusRegister)

中斷程序狀態(tài)寄存器IPSR(InterruptProgramStatusRegister)

執(zhí)行程序狀態(tài)寄存器EPSR(ExecutionProgramStatusRegister)2)中斷屏蔽寄存器(PRIMASK)3)控制寄存器(CONTROL)第62頁共97頁RTOS9.1.2C語言概述C語言是在70年代初問世的。1978年美國電話電報公司(AT&T)貝爾實驗室正式發(fā)表了C語言。1.基本數(shù)據類型第63頁共97頁RTOSC語言構造類型有數(shù)組、結構、聯(lián)合、枚舉、指針和空類型。結構和聯(lián)合是基本數(shù)據類型的組合。枚舉是一個被命名為整型常量的集合??疹愋妥止?jié)長度為0,主要有兩個用途:一是明確地表示一個函數(shù)不返回任何值;二是產生一個同一類型指針(可根據需要動態(tài)地分配給其內存)。為提高執(zhí)行效率,C語言允許使用關鍵字“register”聲明,將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內存中存取。關于register類型變量的使用需注意:(1)只有局部變量和形式參數(shù)可以使用寄存器變量,其他(如全局變量、靜態(tài)變量)不能使用register類型變量。(2)一個計算機系統(tǒng)中的寄存器數(shù)目是有限的,不能定義任意多個寄存器變量。第64頁共97頁RTOS2.運算符C語言的運算符分為算術、邏輯、關系和位運算及一些特殊的操作符。下表列出了C語言的常用運算符及使用方法舉例。第65頁共97頁RTOS第66頁共97頁RTOS3.流程控制在程序設計中主要有三種基本控制結構:順序結構、選擇結構和循環(huán)結構。(1)順序結構順序結構就是從前向后依次執(zhí)行語句。從整體上看,所有程序的基本結構都是順序結構,中間的某個過程可以是選擇結構或循環(huán)結構。第67頁共97頁RTOS(2)選擇結構在大多數(shù)程序中都會包含選擇結構。其作用是,根據所指定的條件是否滿足,決定執(zhí)行哪些語句。在C語言中主要有if和switch兩種選擇結構。1)if結構if(表達式)語句項;或if(表達式)語句項;else語句項;2)switch(表達式){case常數(shù)1:語句項1;break;case常數(shù)2:語句項2;break;…………default:語句項;}第68頁共97頁RTOS(3)循環(huán)結構

C語言中的循環(huán)結構常用for循環(huán),while循環(huán)與do...while循環(huán)。1)for循環(huán)for(初始化表達式;條件表達式;修正表達式){循環(huán)體}2)while循環(huán)while(條件表達式){循環(huán)體}3)dowhile循環(huán)do{循環(huán)體}while(條件表達式);第69頁共97頁RTOS(4)break和continue語句在循環(huán)中的應用在循環(huán)中常常使用break語句和continue語句,這兩個語句都會改變循環(huán)的執(zhí)行情況。break語句用來從循環(huán)體中強行跳出循環(huán),終止整個循環(huán);continue語句使其后語句不再被執(zhí)行,終止本次循環(huán),進行新的一次循環(huán)(可以形象地理解為返回循環(huán)開始處執(zhí)行)。第70頁共97頁RTOS4.函數(shù)所謂函數(shù),即子程序,也就是“語句的集合”,就是說把經常使用的語句群定義成函數(shù),供其他程序調用,函數(shù)的編寫與使用要遵循軟件工程的基本規(guī)范。使用函數(shù)要注意:函數(shù)定義時要同時聲明其類型;調用函數(shù)前要先聲明該函數(shù);傳給函數(shù)的參數(shù)值,其類型要與函數(shù)原定義一致;接收函數(shù)返回值的變量,其類型也要與函數(shù)類型一致等。函數(shù)的返回值:return表達式;return語句用來立即結束函數(shù),并返回一確定值給調用程序。第71頁共97頁RTOS5.數(shù)組在C語言中,數(shù)組是一個構造類型的數(shù)據,是由基本類型數(shù)據按照一定的規(guī)則組成的。構造類型還包括結構體類型,共用體類型。數(shù)組是有序數(shù)據的集合,數(shù)組中的每一個元素都屬于同一個數(shù)據類型。用一個統(tǒng)一的數(shù)組名和下標唯一地確定數(shù)組中的元素。(1)一維數(shù)組的定義和引用定義方式為:類型說明符數(shù)組名[常量表達式];其中,數(shù)組名的命名規(guī)則和變量相同。定義數(shù)組的時候,需要指定數(shù)組中元素的個數(shù),即常量表達式需要明確設定,不可包含變量。如:

inta[10];//定義一個整型數(shù)組,數(shù)組名為a,有10個元素,下標0-9數(shù)組必須先定義,然后才能使用。而且只能通過下標一個一個的訪問。形如:數(shù)組名[下標]。第72頁共97頁RTOS(2)二維數(shù)組的定義和引用定義方式為:類型說明符數(shù)組名[常量表達式][常量表達式]例如:floata[3][4];//定義3行4列的數(shù)組a,下標0-2,0-3(3)字符數(shù)組用于存放字符數(shù)據(char類型)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個元素存放一個字符。例如:charc[5];

c[0]=‘t’;c[1]=‘a’;c[2]=‘b’;c[3]=‘l’;c[4]=‘e’;(4)動態(tài)數(shù)組動態(tài)數(shù)組是相對于靜態(tài)數(shù)組而言。動態(tài)數(shù)組大小可以隨程序需要而重新指定大小。動態(tài)數(shù)組的內存空間是從堆(heap)上分配(即動態(tài)分配)的,可以通過malloc,calloc函數(shù),進行內存空間的動態(tài)分配。第73頁共97頁RTOS(5)數(shù)組如何模擬指針的效果其實,數(shù)組名就是一個地址,一個指向這個數(shù)組元素集合的首地址。可以通過數(shù)組加位置的方式進行數(shù)組元素的引用。例如:inta[5];//定義了一個整型數(shù)組,數(shù)組名為a,有5個元素,下標0-4訪問到數(shù)組a的第3個元素方式有:方式一:a[2];方式二:*(a+2),關鍵是數(shù)組的名稱本身就可以當做地址看待。第74頁共97頁RTOS6.指針(難點)指針是一種特殊的數(shù)據類型,在其它語言中一般沒有。指針是指向變量的地址,實質上指針就是存儲單元的地址。根據所指的變量類型不同,可以是整型指針(int*)、浮點型指針(float*)、字符型指針(char*)、結構指針(struct*)和聯(lián)合指針(union*)。(1)指針變量的定義其一般形式為:類型說明符*變量名;其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據類型。例如:int*p1;//表示p1是指向整型數(shù)的指針變量,p1的值是整型變量的地址第75頁共97頁RTOS(2)指針變量的賦值指針變量同普通變量一樣,使用之前不僅要進行聲明,而且必須賦予具體的值。未經賦值的指針變量不能使用,否則將造成系統(tǒng)混亂,甚至死機。指針變量的賦值只能賦予地址。例如:inta;//a為整型數(shù)據變量int*p1;//聲明p1是整型指針變量p1=&a;//將a的地址作為p1初值第76頁共97頁RTOS(3)指針的運算1)取地址運算符&:取地址運算符&是單目運算符,其結合性為自右至左,其功能是取變量的地址。2)取內容運算符*:取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之后跟的變量必須是指針變量。例如:inta,b;//a,b為整型數(shù)據變量int*p1;//聲明p1是整型指針變量p1=&a;//將a的地址作為p1初值a=80;b=*p1;//運行結果:b=80,即為a的值3)指針的加減算術運算:對于指向數(shù)組的指針變量,可以加/減一個整數(shù)n(指針變量實質是地址,給地址加/減一個非整數(shù)就錯了)。第77頁共97頁RTOS(4)void指針類型顧名思義,void*為“無類型指針”,即用來定義指針變量,不指定它是指向哪種類型數(shù)據,但可以把它強制轉化成任何類型的指針。如果指針p1和p2的類型相同,那么可以直接在p1和p2間互相賦值;如果p1和p2指向不同的數(shù)據類型,則必須使用強制類型轉換運算符把賦值運算符右邊的指針類型轉換為左邊指針的類型。例如:float*p1;//聲明p1為浮點型指針int*p2;//聲明p2為整型指針p1=(float*)p2;//強制轉換整型指針p2為浮點型指針值給p1賦值而void*則不同,任何類型的指針都可以直接賦值給它,無需進行強制類型轉換void*p1;//聲明p1無類型指針int*p2;//聲明p2為整型指針p1=p2;//用整型指針p2的值給p1直接賦值第78頁共97頁RTOS7.構造類型C語言提供了許多種基本的數(shù)據類型(如int、float、double、char等)供用戶使用,但是由于程序需要處理的問題往往比較復雜,而且呈多樣化,已有的數(shù)據類型顯然不能滿足使用要求。因此C語言允許用戶根據需要自己聲明一些類型,用戶可以自己聲明的類型有結構體類型(structure)、共用體類型(union)、枚舉類型(enumeration)、類類型(class)等,這些類型將不同類型的數(shù)據組合成一個有機的整體,這些數(shù)據之間在整體內是相互聯(lián)系的,這些類型稱為構造類型。本書涉及的構造類型主要為結構體類型和枚舉類型兩種,下面對這兩種類型進行介紹。第79頁共97頁RTOS(1)

結構體類型1)結構體基本概念C語言允許用戶將一些不同類型(當然也可以相同)的元素組合在一起定義成一個新的類型,這種新類型就是結構體。其中的元素稱為結構體的成員或者域。聲明一個結構體類型的一般形式為:struct結構體類型名{成員表列};結構體的成員類型可以是另一個結構體類型,也就是說可以嵌套定義。第80頁共97頁RTOS

2)結構體變量的引用

結構體變量成員引用格式:結構體變量名.成員名

例如:

“.”是成員運算符,它在所有運算符中優(yōu)先級最高。結構體變量成員和結構體變量本身都具有地址,且都可以被引用。第81頁共97頁RTOS

3)結構體指針結構體指針是指存儲一個結構體變量起始地址的指針變量。一旦一個結構體指針變量指向了某個結構體變量,那么就可以通過結構體指針對該結構體變量進行操作。如上例中結構體變量stu1,也可以通過指針變量來進行操作:

第82頁共97頁RTOS(2)枚舉類型

1)枚舉類型基本概念枚舉類型是C語言另一種構造數(shù)據類型,它用于聲明一組命名的常數(shù),當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。所謂“枚舉”是指將變量的可能值一一列舉出來,這些值也稱為“枚舉元素”或“枚舉常量”。

枚舉的基本聲明格式:enum枚舉類型名{枚舉值表};第83頁共97頁RTOS8.編譯預處理C語言允許在程序中使用幾種特殊的命令(它們不是一般的C語句)。在C編譯系統(tǒng)對程序進行通常的編譯(包括語法分析、代碼生成、優(yōu)化等)之前,先對程序中的這些特殊的命令進行“預處理”,然后將預處理的結果和源程序一起再進行常規(guī)的編譯處理,以得到目標代碼。C提供的預處理功能主要有宏定義、條件編譯和文件包含。(1)宏定義#define宏名表達式表達式可以是數(shù)字、字符,也可以是若干條語句。在編譯時,所有引用該宏的地方,都將自動被替換成宏所代表的表達式。(2)撤銷宏定義#undef宏名第84頁共97頁RTOS(3)條件編譯#if表達式#else表達式#endif如果表達式成立,則編譯#if下的程序,否則編譯#else下的程序, #endif為條件編譯的結束標志。#ifdef宏名//如果宏名稱被定義過,則編譯以下程序#ifndef宏名//如果宏名稱未被定義過,則編譯以下程序條件編譯通常用來調試、保留程序(但不編譯),或者在需要對兩種狀況做不同處理時使用。(4)“文件包含”處理所謂“文件包含”是指一個源文件將另一個源文件的全部內容包含進來,其一般形式為:#include“文件名”第85頁共97頁RTOS9.用typedef定義類型C語言允許使用typedef定義新的類型名來代替已有的類型名。例如:typedefunsignedcharuint_8;指定用INT8U代表unsignedchar類型。這樣下面的兩個語句是等價的:unsignedcharn1;等價于uint_8n1;用法說明:1)用typedef可以定義各種類型名,但不能用來定義變量。2)用typedef只是對已經存在的類型增加一個類型別名,而沒有創(chuàng)造新的類型。第86頁共97頁RTOS3)typedef與#define有相似之處,如:typedefunsignedintuint_16;#defineuint_16unsignedint;這兩句的作用都是用uint_16代表unsignedint(注意順序)。但事實上它們二者不同,#define是在預編譯時處理,它只能做簡單的字符串替代,而typedef是在編譯時處理。4)當不同源文件中用到各種類型數(shù)據(尤其是像數(shù)組、指針、結構體、共用體等較復雜數(shù)據類型)時,常用typedef定義一些數(shù)據類型,并把它們單獨存放在一個文件中,然后在需要用到它們時,用#include命令把該文件包含進來。5)使用typedef有利于程序的通用與移植。特別是用typedef定義結構體類型,在嵌入式程序中常用到。第87頁共97頁RTOS9.1.3RTOS內核的常用數(shù)據結構(重點)C語言提供編譯預處理的功能,允許在程序中使用幾種特殊的命令(它們不是一般的C語句),在C編譯系統(tǒng)對程序進行通常的編譯(包括語法分析、代碼生成、優(yōu)化等)之前,先對程序中的這些特殊的命令進行“預處理”,然后將預處理的結果和源程序一起再進行常規(guī)的編譯處理,以得到目標代碼。第88頁共97頁RTOS1.棧與堆在數(shù)據結構中,棧(stack)是一種操作受限的線性表,只允許在表的一端進行插入和刪除操作。在操作系統(tǒng)中,棧是RAM中的存儲單元。如右圖所示。在數(shù)據結構中,堆(heap)是一個特殊的完全二叉樹。在操作系統(tǒng)中,堆是內存中的存儲單元。

9.1.3RTOS內核的常用數(shù)據結構第89頁共97頁RTOS2.隊列和棧相反,隊列(queue)是一種先進先出(FirstInFirstOut,F(xiàn)IFO)的線性表,它只允許在表的一端插入,在另一端刪除。允許插入的一端稱為隊尾(rear),允許刪除的一端稱為隊頭(front),如圖9-3所示。第90頁共97頁RTOS3.鏈表鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數(shù)據元素的邏輯順序是通過鏈表中的指針鏈接次序實現(xiàn)的。鏈表由一系列結點組成,結點可以在運行時動態(tài)生成,每個結點包括兩個部分:一是存儲數(shù)據元素的數(shù)據域,一是存儲后繼結點(也可有存儲前驅結點)地址的指針域。(a)單鏈表結構(b)雙向鏈表結構第91頁共97頁RTOS9.1.4匯編語言概述能夠在MCU內直接執(zhí)行的指令序列是機器語言,用助記符號來表示機器指令便于記憶,這就形成了匯編語言。因此,用匯編語言寫成的程序不能直接放入MCU的程序存儲器中去執(zhí)行,必須先轉為機器語言。把用匯編語言寫成的源程序“翻譯”成機器語言的工具叫匯編程序或匯編器(Assembler),以下統(tǒng)一稱作匯編器。第92頁共97頁RTOS1.匯編語言格式匯編語言源程序以行為單位進行設計,每一行最多可以包含四部分標號:操作碼操作數(shù)注釋(1)標號(Labels)1)如果一個語句有標號,則標號必須書寫在匯編語句的開頭部分。

2)可以用字母、數(shù)字、—、$,但第一個符號不能為數(shù)字和$。3)編譯器對標號中字母的大小寫敏感,但指令不區(qū)分大小。4)標號長度基本不受限制,但實際使用時通常不要超過20個字符。5)標號后必須帶冒號“:”。6)一個標號在一個文件(程序)中只能定義一次,否則重復定義,不能通過編譯。7)一行語句只能有一個標號,編譯器將把當前程序計數(shù)器的值賦給該標號。第93頁共97頁RTOS(2)操作碼(Opcodes)操作碼包括指令碼和偽指令,其中偽指令是指開發(fā)環(huán)境ArmCortex-M4F匯編編譯器可以識別的偽指令。對于有標號的行,必須用至少一個空格或制表符(TAB)將標號與操作碼隔開。對于沒有標號的行,不能從第一列開始寫指令碼,應以空格或制表符(TAB)開頭。編譯器不區(qū)分操作碼中字母的大小寫。第94頁共97頁RTOS(3)操作數(shù)(Operands)操作數(shù)可以是地址、標號或指令碼定義的常數(shù),也可以是由偽運算符構成的表達式。①

常數(shù)標識。②

“#”表示立即數(shù)。③圓點“.”。④偽運算符。第95頁共97頁RTOS4.注釋(Comments)注釋即是說明文字,類似于C語言,多行注釋以“/*”開始,以“*/”結束。這種注釋可以包含多行,也可以獨占一行。在ArmCortex-M處理器匯編語言中,單行注釋以“#”引導或者用“//”引導。用“#”引導,“#”必須為單行的第一個字符。第96頁共97頁RTOS2.常用偽指令簡介偽指令主要有用于常量以及宏的定義、條件判斷、文件包含等偽指令。在這里給出的GNU編譯器環(huán)境中,所有的匯編命令都是以“.”開頭。(1)系統(tǒng)預定義的段C語言程序在經過gcc編譯器最終生成.elf格式的可執(zhí)行文件。.elf可執(zhí)行程序是以段為單位來組織文件的。通常劃分為如下幾個段:.text、.data和.bss,其中,.text是只讀的代碼區(qū),.data是可讀可寫的數(shù)據區(qū),而.bss則是可讀可寫且沒有初始化的數(shù)據區(qū)。.text段開始地址為0x0,接著分別是.data段和.bss段。

第97頁共97頁RTOS(2)常量的定義匯編代碼常用的功能之一為常量的定義。使用常量定義,能夠提高程序代碼的可讀性,并且使代碼維護更加簡單。(3)程序中插入常量第98頁共97頁RTOS(4)條件偽指令.if條件偽指令后面緊跟著一個恒定的表達式(即該表達式的值為真),并且最后要以.endif結尾。中間如果有其他條件,可以用.else填寫匯編語句。.ifdef標號,表示如果標號被定義,執(zhí)行下面的代碼。(5)文件包含偽指令第99頁共97頁RTOS(6)其他常用偽指令除了上述的偽指令外,GNU匯編還有其它常用偽指令:①

.section偽指令:用戶可以通過.section偽指令來自定義一個段。②

.global偽指令:.global偽指令可以用來定義一個全局符號。③

.extern偽指令:.extern偽指令的語法為:.externsymbol,聲明symbol為外部函數(shù),調用的時候可以遍訪所有文件找到該函數(shù)并且使用它。④

.align偽指令:.align偽指令可以通過添加填充字節(jié)使當前位置滿足一定的對齊方式。⑤

.end偽指令:.end偽指令聲明匯編文件的結束。

還有有限循環(huán)偽指令、宏定義和宏調用偽指令等,參見《GNU匯編語法》。第100頁共97頁RTOS

首先要明確,芯片的啟動過程與是否具有實時操作系統(tǒng)無關?;玖鞒炭梢愿攀鰹椋海?)從復位向量處取得上電復位后要執(zhí)行的第一個語句。(2)系統(tǒng)時鐘初始化等工作。(3)跳轉到main處。

尋找第一條被執(zhí)行指令的存放在哪里,是理解芯片啟動的重要一環(huán)。9.2RT-Thread的啟動流程分析(重點、難點)9.2.1預備知識第101頁共97頁RTOS1.源程序生成機器碼的基本過程

要將C語言源程序變成可以下載到MCU中運行的機器碼,需要經過預編譯、編譯、匯編、鏈接等基本過程,這一切都是通過開發(fā)環(huán)境自動完成的,如右圖所示第102頁共97頁RTOS2.鏈接文件(.ld)的作用

鏈接腳本文件(簡稱鏈接文件)為鏈接器提供鏈接腳本,用于控制鏈接的過程。該文件規(guī)定了如何把輸入的中間文件內的段(section)映射到最終目標文件內,并控制了目標文件內各部分的地址分配。在集成開發(fā)環(huán)境中也都會用到一個名為“makefile.txt”的自動編譯、鏈接腳本文件,通過它完成整個編譯鏈接過程,但在集成開發(fā)環(huán)境中一般只以“編譯”菜單指示。第103頁共97頁RTOS1.從鏈接文件STM32L431RCTX_FLASH.ld中得到的信息(1)在鏈接文件中找到中斷向量表存放在Flash中的起始地址;(2)在鏈接文件中確定“.isr_vector”標號值;

2.從芯片啟動文件startup_stm32l431rctx.s得到的信息

(1)在芯片啟動文件使用鏈接文件確定的中斷向量表首地址;

(2)從啟動文件startup_stm32l431rctx.s理解芯片啟動過程;

(3)啟動文件startup_stm32l431rctx.s分析,如下表所示;9.2.2芯片啟動到main函數(shù)之前的運行過程第104頁共97頁RTOS第105頁共97頁RTOS3.芯片啟動流程簡明總結1)從鏈接文件STM32L431RCTX_FLASH.ld中知道堆棧指針SP的初值“_estack=0x2000ffff”和中斷向量表的起始地址“0x0800d000”。2)在芯片啟動文件startup_stm32l431rctx.s中依據MCU的Flash起始地址放入中斷向量表;由硬件保證將中斷向量表第一項“_estack”載入SP寄存器,將第二項復位函數(shù)“Reset_Handler”的地址載入PC寄存器;從而跳轉到第一條被執(zhí)行指令“Reset_Handler:ldrsp,=_estack”,對堆棧指針SP進行設置。3)復位(中斷)服務例程序Reset_Handler中,對變量和系統(tǒng)進行初始化,隨后調用main函數(shù),即跳轉到07_AppPrg文件夾下main.c文件中的main函數(shù)運行,由它完成后續(xù)的實時操作系統(tǒng)的啟動。第106頁共97頁RTOS

RT-Thread啟動流程解析使用樣例工程“..\03-Software\CH09-RT-Analysis\StartAnalysis_A”。1.RT-Thread啟動的總體流程(1)啟動RT-Thread的總入口芯片上電后開始啟動,執(zhí)行到“07_AppPrg\main.c”的main函數(shù)后,接著從main函數(shù)調用OS_start函數(shù)開始RT-Thread的啟動。(2)以實參app_init執(zhí)行OS_start函數(shù)OS_start函數(shù)位于..\05_UserBoard\RT-Thread_Src\OsFunc.c文件中,OsFunc.c是為了收攏啟動相關函數(shù)而由自定義的一個文件。為了方便用戶自主決定主線程函數(shù)的名稱,在該文件中定義了OS_start函數(shù)。線程app_init為創(chuàng)建其他線程而準備的,是用戶要完成的第一個線程,也稱為自啟動線程,首先設法使之被調度運行。9.2.3RT-Thread啟動流程解析第107頁共97頁RTOS(3)實際總啟動函數(shù)

在OS_start函數(shù)中調用了實際的總啟動函數(shù)rtthread_startup,也在OsFunc.c文件中。

由rtthread_startup完成系統(tǒng)的啟動,特別強調在實際調用中rtthread_startup()的實際參數(shù)為指向app_init()的指針,這個指針將在后續(xù)調用中逐級傳遞,在rt_thread_create()創(chuàng)建線程時創(chuàng)建該函數(shù)的TCB,由操作系統(tǒng)根據TCB進行調度,從而完成主線程的運行。第108頁共97頁RTOS(4)RT-Thread啟動流程框圖RT-Thread啟動過程總流程框圖,如下圖所示。第109頁共97頁RTOS2.相關資源初始化工作(1)板級硬件初始化

board.c文件中函數(shù)rt_hw_board_init()來進行板級相關的硬件初始化,具體包括包括系統(tǒng)時鐘Systick初始化及堆空間初始化等。

1)Systick初始化。SysTick是RT-Thread整個系統(tǒng)的時鐘基準,系統(tǒng)通過每次時間“嘀嗒”進入中斷服務例程對任務狀態(tài)進行管理。程序啟動時會調用_SysTick_Config()來初始化Systick,系統(tǒng)Systick調度的頻率初始化被設置為1ms一次。

2)堆空間初始化。堆是操作系統(tǒng)中一種常用的數(shù)據結構,通常用于存放臨時變量,由程序員動態(tài)分配和釋放,它一般采用鏈表的方式來管理變量。在RT-Thread中,系統(tǒng)使用的堆空間是自定義的一個靜態(tài)數(shù)組rt_heap,在內存中屬于bss區(qū)。

3)rt_hw_board_init()源碼剖析。第110頁共97頁RTOS(2)延時

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論