1 嵌入式操作系統(tǒng)
- 為什么要用嵌入式操作系統(tǒng)
普通的單片機(jī)編程:程序(軟件)——單片機(jī)硬件房午;
嵌入式操作系統(tǒng)開發(fā):程序(軟件)——操作系統(tǒng)——嵌入式硬件(包括單片機(jī)等);
我們平時(shí)普通所學(xué)的單片機(jī)編程開發(fā),一般情況下都需要對(duì)單片機(jī)的片載資源進(jìn)行了解,了解IO口、PWM發(fā)生器、中斷、定時(shí)器、串口等常用的內(nèi)部資源于样,然后一般采用C編程的面向過程編程,程序的運(yùn)行過程從進(jìn)入入口函數(shù)開始運(yùn)行吱抚,是順序執(zhí)行的。單片機(jī)的開發(fā)秘豹,相對(duì)來說比較簡(jiǎn)單携御,但是不同的單片機(jī),要實(shí)現(xiàn)相同的功能既绕,其內(nèi)部程序必然存在差別啄刹,也就是所說的移植性較差,另外在開發(fā)單片機(jī)時(shí)凄贩,必然要閱讀芯片手冊(cè)誓军,對(duì)可用的資源有一定的硬件上的了解。在事件的執(zhí)行上也不如嵌入式開發(fā)來得效率高疲扎。
嵌入式開發(fā)昵时,也就是在已有的硬件基礎(chǔ)上移植操作系統(tǒng),開發(fā)者所寫的軟件程序運(yùn)行在操作系統(tǒng)中椒丧,通過調(diào)用操作系統(tǒng)提供的 API 接口等調(diào)用硬件資源壹甥,實(shí)現(xiàn)想要實(shí)現(xiàn)的功能。操作系統(tǒng)某種程度上屏蔽了底層的硬件壶熏,可以暫時(shí)不去考慮操作系統(tǒng)是如何調(diào)用硬件資源問題句柠,這其中涉及到驅(qū)動(dòng)等知識(shí)。
當(dāng)然,想要實(shí)現(xiàn)移植操作系統(tǒng)的單片機(jī)溯职,相對(duì)來說其性能就要求高一些精盅,像普通的51芯片,即使移植剪裁到很小的Linux系統(tǒng)谜酒,運(yùn)行起來也很吃力叹俏。
開發(fā)者所寫的程序是與操作系統(tǒng)相關(guān),與硬件無關(guān)甚带,只要運(yùn)行在相同的操作系統(tǒng)中即可她肯,因此嵌入式開發(fā)具有較好的移植性佳头,對(duì)底層硬件也不強(qiáng)制要求熟悉鹰贵,此外嵌入式系統(tǒng)通常是并發(fā)式執(zhí)行任務(wù),因此執(zhí)行效率要好康嘉。比如要說得us/Os II 可同時(shí)管理64個(gè)任務(wù)碉输,多個(gè)任務(wù)的處理在同時(shí)間段內(nèi)同步完成。(這里涉及到多線程以及CPU時(shí)間片的概念)亭珍。
總結(jié)來說敷钾,與單片機(jī)開發(fā)相比,嵌入式開發(fā)有如下優(yōu)點(diǎn):
- 移植性好肄梨;
- 屏蔽硬件阻荒,不要求對(duì)硬件資源的熟悉性;
- 多任務(wù)實(shí)時(shí)性高众羡,效率高侨赡;
除此之外,嵌入式操作系統(tǒng)還具備很多優(yōu)越性:精簡(jiǎn)的內(nèi)核粱侣,高實(shí)時(shí)性羊壹,多任務(wù)的操作系統(tǒng);高可靠性齐婴;可裁剪性好油猫;
百度百科的解釋還是很有道理的:
嵌入式操作系統(tǒng)(Embedded Operating System,簡(jiǎn)稱:EOS)是指用于嵌入式系統(tǒng)的操作系統(tǒng)柠偶。嵌入式操作系統(tǒng)是一種用途廣泛的系統(tǒng)軟件情妖,通常包括與硬件相關(guān)的底層驅(qū)動(dòng)軟件、系統(tǒng)內(nèi)核诱担、設(shè)備驅(qū)動(dòng)接口毡证、通信協(xié)議、圖形界面该肴、標(biāo)準(zhǔn)化瀏覽器等情竹。嵌入式操作系統(tǒng)負(fù)責(zé)嵌入式系統(tǒng)的全部軟、硬件資源的分配、任務(wù)調(diào)度秦效,控制雏蛮、協(xié)調(diào)并發(fā)活動(dòng)。它必須體現(xiàn)其所在系統(tǒng)的特征阱州,能夠通過裝卸某些模塊來達(dá)到系統(tǒng)所要求的功能挑秉。目前在嵌入式領(lǐng)域廣泛使用的操作系統(tǒng)有:嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II、嵌入式Linux苔货、Windows Embedded犀概、VxWorks等,以及應(yīng)用在智能手機(jī)和平板電腦的Android夜惭、iOS等姻灶。
2 μC/OS-II系統(tǒng)
2.1 μC/OS-II特點(diǎn)
- 小巧的實(shí)時(shí)操作系統(tǒng),整個(gè)代碼分為內(nèi)核層和移植層诈茧,方便移植和裁剪
- 搶占式調(diào)度策略产喉,保證任務(wù)的實(shí)時(shí)性
- 可管理多達(dá)64個(gè)任務(wù)
- 提供了用于任務(wù)通信的事件(信號(hào)量,消息隊(duì)列敢会,郵箱等)管理曾沈,內(nèi)存管理,時(shí)間管理等系統(tǒng)服務(wù)
2.2 內(nèi)核結(jié)構(gòu)
-
臨界段(Critical Sections):臨界區(qū)鸥昏,指處理是不可分割的代碼塞俱,一旦這部分代碼開始執(zhí)行了,則不允許任何中斷打斷
- 實(shí)現(xiàn)資源共享
- 處理臨界段代碼是需要關(guān)中斷吏垮,處理完畢后再打開中斷障涯,系統(tǒng)定義了兩個(gè)宏(macros)來開關(guān)中斷
OS_ENTER_CRITICAL() OS_EXIT_CRITCAL() //宏定義的具體實(shí)現(xiàn)取決于移植所用的微處理器,每種微處理器都要自己的OS_CPU.H文件
-
任務(wù):
- 任務(wù)通常是無限循環(huán)
- 系統(tǒng)可管理多達(dá)64個(gè)任務(wù)惫皱,但保留了0,1,2,3像樊,OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,OS_LOWEST_PRIO這8個(gè)任務(wù)以備系統(tǒng)使用,其中包括系統(tǒng)空閑任務(wù)旅敷,和系統(tǒng)CPU效率使用計(jì)算等任務(wù)
- 用戶可使用多達(dá)56個(gè)任務(wù)生棍,在創(chuàng)建任務(wù)時(shí)需要給任務(wù)賦予不同的優(yōu)先級(jí),優(yōu)先級(jí)號(hào)越低媳谁,任務(wù)優(yōu)先級(jí)越高涂滴。μC/OS-II系統(tǒng)的任務(wù)調(diào)度是基于優(yōu)先級(jí)的。
- OS_LOWEST_PRO 該變量可以在中OS_CFG.H 中定義晴音,說明應(yīng)用程序中任務(wù)優(yōu)先級(jí)別的數(shù)目
-
中斷處理:
- 中斷服務(wù)子程序框架:保存全部CPU寄存器 -- 調(diào)用OSIntEnter或者OSIntNesting直接加1 -- 執(zhí)行用戶代碼中斷服務(wù)(匯編或者C編譯器支持在線匯編) -- 調(diào)用OSIntExit -- 恢復(fù)CPU寄存器 -- 執(zhí)行中斷返回命令
- 注意:中斷服務(wù)子程序運(yùn)行結(jié)束后會(huì)發(fā)生一次任務(wù)調(diào)度柔纵,所以并不一定會(huì)繼續(xù)運(yùn)行被中斷的任務(wù)
-
時(shí)鐘節(jié)拍:
- 時(shí)鐘節(jié)拍是一種特殊得中斷,操作系統(tǒng)的心臟锤躁,對(duì)任務(wù)列表進(jìn)行掃描搁料,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),進(jìn)行上下文切換,也就是切換任務(wù)
- μC/OS-II系統(tǒng)需要用戶提供周期性信號(hào)源郭计,系統(tǒng)在多任務(wù)系統(tǒng)啟動(dòng)以后再開啟時(shí)鐘節(jié)拍器
- OSTickISR():硬件定時(shí)器以時(shí)鐘節(jié)拍為周期定時(shí)產(chǎn)生中斷霸琴,該中斷服務(wù)程序?yàn)镺STickISR,該函數(shù)中主要調(diào)用了OSTIMETick()函數(shù)來完成系統(tǒng)在每個(gè)時(shí)鐘節(jié)拍需要完成的工作昭伸。
保存處理器寄存器的值 調(diào)用OSIntEnter()或是OSIntNesting加1 調(diào)用OSTimeTick() 調(diào)用OSIntExit() 恢復(fù)處理器寄存器的值 執(zhí)行中斷返回指令
- OSTimeTick():時(shí)鐘節(jié)拍服務(wù)函數(shù)做的工作包括:記錄節(jié)拍樹梧乘,任務(wù)延時(shí)減一,其任務(wù)時(shí)在每個(gè)時(shí)鐘節(jié)拍了解任務(wù)的延時(shí)狀態(tài)庐杨,使得其中延時(shí)結(jié)束的非掛起任務(wù)進(jìn)入就緒狀態(tài)选调。
-
μC/OS-II系統(tǒng)初始化
- OSInit():建立空閑任務(wù)idle task,這個(gè)任務(wù)總是處于就緒態(tài)灵份,空閑任務(wù)OSTaskIDLE()的優(yōu)先級(jí)總是設(shè)成最低
- 初始化4個(gè)空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū):OS_MAX_TASKS(OSTCBFreeList)任務(wù)控制塊鏈表仁堪,OS_MAX_EVENTS(OSEventFreeList)ECB時(shí)間控制塊鏈表,OS_MAX_QS(OSQFreeList),OS_MAX_MEM_PART(OSMemFreeList)
- OSStart()啟動(dòng):開始多任務(wù)執(zhí)行各吨,啟動(dòng)之前枝笨,至少要調(diào)用OSTaskCreate()創(chuàng)建一個(gè)應(yīng)用任務(wù)
2.3 任務(wù)管理
-
任務(wù)狀態(tài):OSTCBStat 任務(wù)狀態(tài)字
- 任務(wù)控制塊OS_TCB:用來記錄任務(wù)的堆棧指針,任務(wù)的當(dāng)前狀態(tài)揭蜒,任務(wù)的優(yōu)先級(jí)等一些與任務(wù)管理有關(guān)的屬性的表,叫做任務(wù)控制塊TCB剔桨。系統(tǒng)初始化時(shí)會(huì)按照用戶提供的任務(wù)數(shù)(OS_MAX_TASKS)為任務(wù)創(chuàng)建相應(yīng)數(shù)量的任務(wù)控制塊鏈表屉更,也就是空任務(wù)塊鏈表,當(dāng)創(chuàng)建一個(gè)任務(wù)后洒缀,會(huì)調(diào)用OSTCBInit來為任務(wù)控制塊進(jìn)行初始化瑰谜,從鏈表中獲取一個(gè)任務(wù)控制塊,并利用屬性對(duì)各個(gè)成員賦值树绩,最后將該塊鏈入鏈表頭部萨脑。
任務(wù)就緒表:ready List:包含兩個(gè)變量,OSRdyGrp和OSRdyTb1[],每個(gè)任務(wù)的就緒標(biāo)志都會(huì)放入就緒表中饺饭,任務(wù)按照優(yōu)先級(jí)分組渤早,8個(gè)任務(wù)為一組(64個(gè)任務(wù)),OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒狀態(tài)的任務(wù)瘫俊。
任務(wù)堆棧:保存CPU寄存器中的內(nèi)容及存儲(chǔ)私有數(shù)據(jù)的需要鹊杖,每個(gè)任務(wù)都應(yīng)該分配有自己的堆棧,任務(wù)堆棧是任務(wù)的重要組成部分扛芽,在應(yīng)用程序中定義任務(wù)堆棧方法為:OS_TSK TaskStk[TASK_STK_SIZE]定義一個(gè)OS_STK類型數(shù)組并在創(chuàng)建一個(gè)任務(wù)時(shí)將數(shù)組地址賦給該任務(wù)骂蓖。
任務(wù)創(chuàng)建:創(chuàng)建函數(shù):OSTaskCreate + 創(chuàng)建函數(shù):OSTaskCreateExt 創(chuàng)建任務(wù)時(shí)傳遞任務(wù)的堆棧指針,任務(wù)的指針川尖,任務(wù)參數(shù)以及任務(wù)優(yōu)先級(jí)等登下,OSTaskCreate()在創(chuàng)建任務(wù)時(shí)會(huì)調(diào)用任務(wù)堆棧初始化函數(shù)OSTaskStkInit()來完成任務(wù)堆棧的初始化工作,這個(gè)函數(shù)在OS_CPU.C根據(jù)處理器移植時(shí)編寫
-
任務(wù)調(diào)度(Task Scheduling):
- 搶占式多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就緒被芳,就擁有CPU的所有權(quán)開始運(yùn)行银酬,uc/OS 不支持時(shí)間片輪轉(zhuǎn),任務(wù)調(diào)度是指:查找準(zhǔn)備就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)行上下文的切換筐钟。(任務(wù)調(diào)度的所花費(fèi)時(shí)間是常數(shù))
- 任務(wù)就緒表:ready List:任務(wù)調(diào)度的依據(jù)揩瞪,包含兩個(gè)變量,OSRdyGrp和OSRdyTb1[],每個(gè)任務(wù)的就緒標(biāo)志都會(huì)放入就緒表中篓冲,任務(wù)按照優(yōu)先級(jí)分組李破,8個(gè)任務(wù)為一組(64個(gè)任務(wù)),OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒狀態(tài)的任務(wù)壹将。
- 系統(tǒng)在RAM中設(shè)立一個(gè)記錄表嗤攻,每個(gè)任務(wù)在表中占據(jù)一個(gè)位置,用這個(gè)位置1/0的狀態(tài)判斷任務(wù)是否處于就緒狀態(tài)诽俯,可使用相關(guān)代碼將相關(guān)任務(wù)設(shè)為就緒狀態(tài)或者脫離就緒狀態(tài)妇菱,以及獲取到優(yōu)先級(jí)別最高的就緒任務(wù)
任務(wù)切換:OS_TASK_SW()任務(wù)切換宏:中止正在運(yùn)行的任務(wù),轉(zhuǎn)而去運(yùn)行另外一個(gè)任務(wù)的操作暴区,這個(gè)任務(wù)時(shí)就緒任務(wù)中優(yōu)先級(jí)別最高的那個(gè)任務(wù)闯团。簡(jiǎn)單說,就是將掛起的任務(wù)寄存器入棧仙粱,將較高優(yōu)先級(jí)任務(wù)的寄存器出棧
2.4 內(nèi)存管理
- μC/OS-II系統(tǒng)中將連續(xù)的大塊的內(nèi)存按分區(qū)來管理房交,每個(gè)分區(qū)包含有整數(shù)個(gè)大小相同的內(nèi)存塊
- 內(nèi)存控制塊OS_MEM: memory control blocks 系統(tǒng)的每個(gè)內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊
- 使用內(nèi)存管理:需要在OS_CFG.H文件中將開關(guān)量OS_MEM_EN 置1
- 創(chuàng)建內(nèi)存分區(qū):OSMEMCreate()
- 分配一個(gè)內(nèi)存塊:OSMemGet()
- 釋放一個(gè)內(nèi)存塊:OSMEMPut()
2.5 時(shí)間管理:系統(tǒng)服務(wù)
- 時(shí)鐘節(jié)拍:定時(shí)中斷來實(shí)現(xiàn)延時(shí)和超時(shí)控制,這個(gè)中斷叫做時(shí)鐘節(jié)拍伐割,每秒發(fā)生10 -100次候味,頻率越高,系統(tǒng)負(fù)荷越重
- OSTimeDlY():系統(tǒng)規(guī)定:除了空閑任務(wù)之外所有任務(wù)必須在任務(wù)中合適位置調(diào)用OSTIMEDly隔心,使得當(dāng)前任務(wù)運(yùn)行延時(shí)一段時(shí)間白群,并進(jìn)行一次任務(wù)調(diào)度,以讓出CPU使用權(quán)硬霍。其中操作包括:取消當(dāng)前任務(wù)就緒狀態(tài)帜慢,延時(shí)節(jié)拍數(shù)存入TCB,調(diào)用調(diào)度函數(shù)须尚。
- OSTimeDlyResume:取消任務(wù)延時(shí)
- OSTimeGet:獲取系統(tǒng)時(shí)間
- OSTimeSet:設(shè)置系統(tǒng)時(shí)間等
2.6 任務(wù)間的通信:數(shù)據(jù)共享與通信
臨界段:臨界資源保護(hù)
操作系統(tǒng)通信方法 -- 事件Event:信號(hào)量崖堤,郵箱,消息隊(duì)列耐床,信號(hào)量集
OSSchedLock() 禁止調(diào)度保護(hù)任務(wù)級(jí)的共享資源
事件(ECB 事件控制塊)OS_EVENT:
typedef struct
{
INT8U OSEventType; //事件的類型
INT16U OSEventCnt; //信號(hào)量計(jì)數(shù)器
void *OSEventPtr; //消息或消息隊(duì)列的指針
INT8U OSEventGrp; //等待事件的任務(wù)組
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任務(wù)等待表
} OS_EVENT;
- 信號(hào)量(Semaphore):控制共享資源的使用權(quán)密幔,標(biāo)志事件的發(fā)生,使得兩個(gè)任務(wù)的行為同步撩轰,信號(hào)量包括信號(hào)量計(jì)數(shù)值和等待該信號(hào)任務(wù)的等待任務(wù)表胯甩,操作:OSSEMCreate(創(chuàng)建一個(gè)信號(hào)量昧廷,這個(gè)時(shí)候系統(tǒng)從空事件控制塊鏈表中獲取一個(gè)控制塊,對(duì)它初始化并描述該事件)偎箫,OSSEemPend(OS_Event *pevent,INT16U timeout,INTU *err)請(qǐng)求信號(hào)量木柬,pevent是被請(qǐng)求信號(hào)量的指針, OSSemPost(OS_EVENT *pevent)釋放信號(hào)量淹办,如果不需要某信號(hào)量了可以調(diào)用OssDel(OS_EVENT *pevent,INT8U opt,INT8U *err),注意互斥信號(hào)量與優(yōu)先級(jí)反轉(zhuǎn)的問題
- 消息郵箱:OS_EVENT_TYPE_MBOX:在兩個(gè)需要通信的任務(wù)之間通過傳遞數(shù)據(jù)緩沖區(qū)指針的方法來通信
- 消息隊(duì)列:OS_EVENT_TYPE_Q:相當(dāng)于是共用一個(gè)任務(wù)等待列表的消息郵箱數(shù)組
- 信號(hào)量集
2.7 移植 μC/OS-II系統(tǒng)
- 移植的條件
- 處理器的C編譯器能產(chǎn)生并可重入代碼
- 在程序中可以打開或者關(guān)閉中斷
- 處理器支持定時(shí)中斷(10-1000Hz)
- 處理器能夠容納一定量的數(shù)據(jù)硬件堆棧眉枕,因?yàn)槊總€(gè)任務(wù)都有自己的任務(wù)堆棧,在調(diào)度時(shí)用于將當(dāng)前任務(wù)的CPU寄存器存放到此任務(wù)的堆棧中怜森,再從另一個(gè)任務(wù)中恢復(fù)原來的工作寄存器速挑,繼續(xù)運(yùn)行另一個(gè)任務(wù),這是多任務(wù)調(diào)度的基礎(chǔ)副硅。
- 處理器有將堆棧指針和其他CPU寄存器存儲(chǔ)或者獨(dú)處到堆棧/內(nèi)存的指令
-
移植文件
設(shè)置OS_CPU.H與處理器和編譯器相關(guān)的代碼:包括定義數(shù)據(jù)類型INT8U姥宝,INT8S等,使用OS_ENTER_CRITICAL等宏開啟中斷關(guān)閉中斷等恐疲,定義堆棧增長(zhǎng)方向(要注意)
用C語言編寫與操作系統(tǒng)相關(guān)的函數(shù) OS_CPU_C.C:OSTaskStkInit(初始化任務(wù)堆棧)腊满,OSTaskCreateHook,OSTaskDelHook培己,OSTaskSwHoOK碳蛋,OSTaskStatHook,OSTimeTickHooK,比較重要的是第一個(gè)漱凝,后面五個(gè)一般可置空
用匯編語言編寫四個(gè)與處理器相關(guān)的函數(shù) OS_CPU.ASM:OSStartHighRdy疮蹦,OSCtxSw(上下文切換)OSIntCtxSw(中斷級(jí)任務(wù)切換),OSTickISR
系統(tǒng)體系: OS_CFG.H 系統(tǒng)配置
3 通信接口:SPI茸炒,SCI,IIC
3.1 SPI:serial peripheral interface
- 串行外圍設(shè)備接口阵苇,Motorola公司推出的一種同步串行接口壁公,SPI總線是一種三線同步總線,硬件功能很強(qiáng)绅项,CPU有更多時(shí)間處理其他事務(wù)
- 同步需要多出一條時(shí)鐘線
- 常用于擴(kuò)展外設(shè):AD紊册,DA,F(xiàn)RAM快耿,DSP等
- SPI總線由三條信號(hào)線組成:串行時(shí)鐘(SCLK/SPSCK)囊陡、串行數(shù)據(jù)輸出(SDO/MOSO)、串行數(shù)據(jù)輸入(SDI/MOSI)掀亥。SPI總線可以實(shí)現(xiàn)多個(gè)SPI設(shè)備互相連接撞反。提供SPI串行時(shí)鐘的SPI設(shè)備為SPI主機(jī)或主設(shè)備(Master),其他設(shè)備為SPI從機(jī)或從設(shè)備(Slave)搪花。主從設(shè)備間可以實(shí)現(xiàn)全雙工通信遏片,當(dāng)有多個(gè)從設(shè)備時(shí)嘹害,還可以增加一條從設(shè)備選擇線(Slave Select)。
- 寄存器:SPI數(shù)據(jù)寄存器吮便,SPI控制寄存器笔呀,狀態(tài)控制寄存器
3.2 SCI:serial communication interface
- 串行通信接口,motorola公司推出的一種通用的異步通信接口UART髓需,異步只需要發(fā)送和接收兩根線
- 常用于串行通信:RS422许师,RS485,RS232
- 波特率:每秒內(nèi)傳送的位數(shù) bps
- MCU內(nèi)引腳的輸入輸出通常采用TTL電平僚匆,適合板內(nèi)數(shù)據(jù)傳輸微渠,為了信號(hào)傳輸更遠(yuǎn),可以轉(zhuǎn)化成RS232白热,RS485總線標(biāo)準(zhǔn)
- 寄存器:SCI數(shù)據(jù)寄存器(接收移位寄存器敛助,發(fā)送移位寄存器),SCI控制寄存器屋确,SCI狀態(tài)寄存器纳击,SCI波特率寄存器
- UART:UART(Universal Asynchronous Receiver & Transmitter)即通用異步收發(fā)器,是串行通信的一種協(xié)議攻臀,它規(guī)定串行通信的波特率焕数、起始/停止位、數(shù)據(jù)位刨啸、校驗(yàn)位等格式堡赔,以及各種異步握手信號(hào)。
3.3 I2C:I2C總線
- Philips公司開發(fā)的一種簡(jiǎn)單的雙向二進(jìn)制同步串行總線设联,只需要兩根線即可連接于總線上的在器件之間傳送信息善已,具備多主機(jī)系統(tǒng)所需要的包括總線裁決和高低速器件同步功能的高性能串行總線
- 兩根線:SDA(串行數(shù)據(jù)線) SCL(串行時(shí)鐘線),連接在總線上的IC數(shù)量受總線最大電容限制离例,兩根線都是雙向數(shù)據(jù)線换团,
- 每個(gè)接到I2C總線上的器件都有唯一地址,I2C有存在總線仲裁機(jī)制宫蛆,以確定哪一臺(tái)主機(jī)控制總線艘包,發(fā)送數(shù)據(jù)到其他器件
4 XGATE
4.1 什么是xgate
飛思卡爾9s12X系列雙核中的協(xié)處理器XGATE
雙核架構(gòu),增加了一個(gè)RISC核的高效協(xié)處理器耀盗,XGATE模塊想虎,專門用于處理中斷任務(wù),可以將主核CPU從執(zhí)行耗時(shí)的中斷處理程序工作中解放出來叛拷,專注于執(zhí)行與應(yīng)用有關(guān)的任務(wù)舌厨,實(shí)現(xiàn)更好的實(shí)時(shí)事件處理,XGATE采用RISC指令核胡诗,代碼高效邓线,主頻運(yùn)行速率可達(dá)到主核的2倍淌友。
4.2 xgate配置與使用
- xgate.cxgate文件為XGATE的主文件,在其中編寫需要的中斷服務(wù)子程序
- xgate.h 是對(duì)XGATE用到的一些聲明
- 在Main.c文件中定義CPU與XGate共享的數(shù)據(jù)
#pragma DATA_SEG_SHARED_DATA
volatile int shared_counter骇陈;// 定義XGATE與主核共享RAM的變量
#pragma DATA_SEG DEFAULT
- 在Main.c 文件中設(shè)置SetupXGATE:定義xgate的中斷向量表的偏移地址震庭,以及中斷權(quán)限的分配,決定是主CPU還是XGATE響應(yīng)中斷
#define ROUTE_INTERRUPT(vec_adr, cfdata) \
INT_CFADDR= (vec_adr) & 0xF0; \
INT_CFDATA_ARR[((vec_adr) & 0x0F) >> 1]= (cfdata)
//channel id 需要到xgate.cxgate文件向量列表中查找
//自定義向量名
#define RTI_VEC 0xF0 /* vector address= 2 * channel id */
#define MSCAN0_VEC 0xB2 /* vector address= 2 * channel id */
#define SCI2_VEC 0x8A /* vector address= 2 * channel id */
#define SCI0_VEC 0xD6
static void SetupXGATE(void)
{
//初始化Xgate向量表模塊并將XGVBR 寄存器設(shè)置到初始地址
XGVBR= (unsigned int)(void*__far)(XGATE_VectorTable - XGATE_VECTOR_OFFSET);
// RTI_VEC 為自定義中斷名 設(shè)置xgate中斷以及中斷優(yōu)先級(jí)
ROUTE_INTERRUPT(RTI_VEC, 0x86); /* RQST=1 and PRIO=1 */ //實(shí)時(shí)時(shí)鐘中斷
ROUTE_INTERRUPT(MSCAN0_VEC, 0x81); /* RQST=1 and PRIO=1 */ //CAN接收中斷
ROUTE_INTERRUPT(SCI2_VEC, 0x84); /* RQST=1 and PRIO=1 */
ROUTE_INTERRUPT(SCI0_VEC, 0x83); /* RQST=1 and PRIO=1 */
XGMCTL= 0xFBC1; /* XGE | XGFRZ | XGIE */
}
- xgate.cxgate中實(shí)現(xiàn)中斷函數(shù)你雌,同時(shí)修改中斷向量表vectorTable
interrupt void SCI2_Handler(void){
}
const XGATE_TableEntry XGATE_VectorTable[] ={
...
{(XGATE_Function)SCI2_Handler}, // Channel 45 - SCI2
...
}
5 CAN總線
5.1 什么是CAN總線:controller Area Network
can總線是一種串行數(shù)據(jù)通信協(xié)議器联,特點(diǎn)包括:多主機(jī)方式工作,任意節(jié)點(diǎn)可以在任意時(shí)刻主動(dòng)向網(wǎng)絡(luò)上其他節(jié)點(diǎn)發(fā)送信息婿崭;串行拨拓,同步,半雙工氓栈,CRC
節(jié)點(diǎn)信息分成不同的優(yōu)先級(jí):仲裁總線結(jié)構(gòu)機(jī)制渣磷,節(jié)點(diǎn)同時(shí)傳送信息時(shí),優(yōu)先級(jí)低的節(jié)點(diǎn)主動(dòng)停止數(shù)據(jù)發(fā)送授瘦,優(yōu)先級(jí)高的節(jié)點(diǎn)不受影響繼續(xù)傳送數(shù)據(jù)醋界。CAN總線系統(tǒng):由多個(gè)電子控制單元EMU同時(shí)控制多個(gè)工作裝置或系統(tǒng),各控制單元ECU的共用信息通過總線互相傳遞提完。
傳輸速度快形纺;相關(guān)控制單元可共用傳感器;更少的線束徒欣,更小的控制單元逐样,節(jié)省了空間。
CAN-BUS系統(tǒng)的組成:CAN收發(fā)器(控制器內(nèi)部打肝,接收和發(fā)送數(shù)據(jù))脂新,數(shù)據(jù)傳輸終端,數(shù)據(jù)傳輸線(雙向數(shù)據(jù)線)
參考:https://wenku.baidu.com/view/bab35fb765ce0508763213cf.html
5.2 CAN總線的特點(diǎn)
- Can總線是一種實(shí)時(shí)應(yīng)用的串行通信協(xié)議總線粗梭,可以使用雙絞線來傳輸信號(hào)戏羽,是應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。
- 實(shí)時(shí)性強(qiáng)楼吃,傳輸距離遠(yuǎn),抗電磁干擾強(qiáng)妄讯,成本低孩锡,通信速度最高可達(dá)40M
- 雙線串行通信,檢錯(cuò)能力強(qiáng)
- 具有優(yōu)先權(quán)和仲裁功能亥贸,多個(gè)模塊通過can控制器掛在can-bus上躬窜,形成多主機(jī)局部網(wǎng)絡(luò)
- 根據(jù)報(bào)文ID決定接收或屏蔽報(bào)文
- 報(bào)文使用標(biāo)識(shí)符來指示功能信息,優(yōu)先級(jí)信息
- 短幀結(jié)構(gòu)炕置,出錯(cuò)時(shí)可自動(dòng)關(guān)閉節(jié)點(diǎn)
5.3 工作原理
當(dāng)CAN總線上的一個(gè)節(jié)點(diǎn)(站)發(fā)送數(shù)據(jù)時(shí)荣挨,它以報(bào)文形式廣播給網(wǎng)絡(luò)中所有節(jié)點(diǎn)男韧。對(duì)每個(gè)節(jié)點(diǎn)來說,無論數(shù)據(jù)是否是發(fā)給自己的默垄,都對(duì)其進(jìn)行接收此虑。
每組報(bào)文開頭的11位字符為標(biāo)識(shí)符,定義了報(bào)文的優(yōu)先級(jí)口锭,這種報(bào)文格式稱為面向內(nèi)容的編址方案朦前。標(biāo)識(shí)符在網(wǎng)絡(luò)中是唯一的,描述了數(shù)據(jù)的特定含義鹃操,也決定報(bào)文優(yōu)先級(jí)(標(biāo)識(shí)符數(shù)值越小韭寸,優(yōu)先級(jí)越高)。注意:最高優(yōu)先級(jí)的報(bào)文獲得總線訪問權(quán)荆隘,低優(yōu)先級(jí)報(bào)文在下一個(gè)總線周期自動(dòng)重發(fā)恩伺。
當(dāng)一個(gè)站要向其它站發(fā)送數(shù)據(jù)時(shí),該站的CPU將要發(fā)送的數(shù)據(jù)和自己的標(biāo)識(shí)符傳送給本站的CAN芯片椰拒,并處于準(zhǔn)備狀態(tài)晶渠;當(dāng)它收到總線分配時(shí),轉(zhuǎn)為發(fā)送報(bào)文狀態(tài)耸三。CAN芯片將數(shù)據(jù)根據(jù)協(xié)議組織成一定的報(bào)文格式發(fā)出乱陡,這時(shí)網(wǎng)上的其它站處于接收狀態(tài)。每個(gè)處于接收狀態(tài)的站對(duì)接收到的報(bào)文進(jìn)行檢測(cè)仪壮,判斷這些報(bào)文是否是發(fā)給自己的憨颠,以確定是否接收它。
-
CAN 總線組成:
- 傳輸線:雙絞線积锅,兩條導(dǎo)線為CAN-High和CAN-Low線爽彤,減少干擾,差分電壓傳輸缚陷,信號(hào) = CAN_H - CAN_L
- 數(shù)據(jù)傳輸終端:傳輸線的兩頭适篙,兩個(gè)終端電阻
- 分支線:連接主機(jī)或者通信結(jié)點(diǎn)的分支線,不能太長(zhǎng)箫爷,不超過6m
- CAN控制器和CAN收發(fā)器
-
CAN 總線幀結(jié)構(gòu):