實(shí)驗(yàn)室項(xiàng)目小結(jié)

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):

  1. 移植性好肄梨;
  2. 屏蔽硬件阻荒,不要求對(duì)硬件資源的熟悉性;
  3. 多任務(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í)行了,則不允許任何中斷打斷

    1. 實(shí)現(xiàn)資源共享
    2. 處理臨界段代碼是需要關(guān)中斷吏垮,處理完畢后再打開中斷障涯,系統(tǒng)定義了兩個(gè)宏(macros)來開關(guān)中斷
    OS_ENTER_CRITICAL()
    OS_EXIT_CRITCAL()
    //宏定義的具體實(shí)現(xiàn)取決于移植所用的微處理器,每種微處理器都要自己的OS_CPU.H文件
    
  • 任務(wù):

    1. 任務(wù)通常是無限循環(huán)
    2. 系統(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ù)
    3. 用戶可使用多達(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í)的。
    4. OS_LOWEST_PRO 該變量可以在中OS_CFG.H 中定義晴音,說明應(yīng)用程序中任務(wù)優(yōu)先級(jí)別的數(shù)目
  • 中斷處理:

    1. 中斷服務(wù)子程序框架:保存全部CPU寄存器 -- 調(diào)用OSIntEnter或者OSIntNesting直接加1 -- 執(zhí)行用戶代碼中斷服務(wù)(匯編或者C編譯器支持在線匯編) -- 調(diào)用OSIntExit -- 恢復(fù)CPU寄存器 -- 執(zhí)行中斷返回命令
    2. 注意:中斷服務(wù)子程序運(yùn)行結(jié)束后會(huì)發(fā)生一次任務(wù)調(diào)度柔纵,所以并不一定會(huì)繼續(xù)運(yùn)行被中斷的任務(wù)
  • 時(shí)鐘節(jié)拍:

    1. 時(shí)鐘節(jié)拍是一種特殊得中斷,操作系統(tǒng)的心臟锤躁,對(duì)任務(wù)列表進(jìn)行掃描搁料,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),進(jìn)行上下文切換,也就是切換任務(wù)
    2. μC/OS-II系統(tǒng)需要用戶提供周期性信號(hào)源郭计,系統(tǒng)在多任務(wù)系統(tǒng)啟動(dòng)以后再開啟時(shí)鐘節(jié)拍器
    3. 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í)行中斷返回指令
    
    1. 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)初始化

    1. OSInit():建立空閑任務(wù)idle task,這個(gè)任務(wù)總是處于就緒態(tài)灵份,空閑任務(wù)OSTaskIDLE()的優(yōu)先級(jí)總是設(shè)成最低
    2. 初始化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)
    3. 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)字


    image.png
  • 任務(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è)成員賦值树绩,最后將該塊鏈入鏈表頭部萨脑。
image.png
image.png
  • 任務(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):

    1. 搶占式多任務(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ù))
    2. 任務(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ù)壹将。
    3. 系統(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ù)
      image.png
  • 任務(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;
  1. 信號(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)的問題
  2. 消息郵箱:OS_EVENT_TYPE_MBOX:在兩個(gè)需要通信的任務(wù)之間通過傳遞數(shù)據(jù)緩沖區(qū)指針的方法來通信
  3. 消息隊(duì)列:OS_EVENT_TYPE_Q:相當(dāng)于是共用一個(gè)任務(wù)等待列表的消息郵箱數(shù)組
  4. 信號(hào)量集

2.7 移植 μC/OS-II系統(tǒng)

  • 移植的條件
    1. 處理器的C編譯器能產(chǎn)生并可重入代碼
    2. 在程序中可以打開或者關(guān)閉中斷
    3. 處理器支持定時(shí)中斷(10-1000Hz)
    4. 處理器能夠容納一定量的數(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ǔ)副硅。
    5. 處理器有將堆棧指針和其他CPU寄存器存儲(chǔ)或者獨(dú)處到堆棧/內(nèi)存的指令
  • 移植文件

    1. 設(shè)置OS_CPU.H與處理器和編譯器相關(guān)的代碼:包括定義數(shù)據(jù)類型INT8U姥宝,INT8S等,使用OS_ENTER_CRITICAL等宏開啟中斷關(guān)閉中斷等恐疲,定義堆棧增長(zhǎng)方向(要注意)

    2. 用C語言編寫與操作系統(tǒng)相關(guān)的函數(shù) OS_CPU_C.C:OSTaskStkInit(初始化任務(wù)堆棧)腊满,OSTaskCreateHook,OSTaskDelHook培己,OSTaskSwHoOK碳蛋,OSTaskStatHook,OSTimeTickHooK,比較重要的是第一個(gè)漱凝,后面五個(gè)一般可置空

    3. 用匯編語言編寫四個(gè)與處理器相關(guān)的函數(shù) OS_CPU.ASM:OSStartHighRdy疮蹦,OSCtxSw(上下文切換)OSIntCtxSw(中斷級(jí)任務(wù)切換),OSTickISR

  • 系統(tǒng)體系: OS_CFG.H 系統(tǒng)配置

image.png

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 總線組成:

    1. 傳輸線:雙絞線积锅,兩條導(dǎo)線為CAN-High和CAN-Low線爽彤,減少干擾,差分電壓傳輸缚陷,信號(hào) = CAN_H - CAN_L
    2. 數(shù)據(jù)傳輸終端:傳輸線的兩頭适篙,兩個(gè)終端電阻
    3. 分支線:連接主機(jī)或者通信結(jié)點(diǎn)的分支線,不能太長(zhǎng)箫爷,不超過6m
    4. CAN控制器和CAN收發(fā)器
image.png
  • CAN 總線幀結(jié)構(gòu):


    image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚷节,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虎锚,更是在濱河造成了極大的恐慌硫痰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窜护,死亡現(xiàn)場(chǎng)離奇詭異效斑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柱徙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門缓屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奇昙,“玉大人,你說我怎么就攤上這事敌完〈⒛停” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蠢挡,是天一觀的道長(zhǎng)弧岳。 經(jīng)常有香客問我,道長(zhǎng)业踏,這世上最難降的妖魔是什么禽炬? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮勤家,結(jié)果婚禮上腹尖,老公的妹妹穿的比我還像新娘。我一直安慰自己伐脖,他們只是感情好热幔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讼庇,像睡著了一般绎巨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠕啄,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天场勤,我揣著相機(jī)與錄音,去河邊找鬼歼跟。 笑死和媳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哈街。 我是一名探鬼主播留瞳,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骚秦!你這毒婦竟也來了她倘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤作箍,失蹤者是張志新(化名)和其女友劉穎帝牡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒙揣,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年开瞭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懒震。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩息。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖个扰,靈堂內(nèi)的尸體忽然破棺而出瓷炮,到底是詐尸還是另有隱情,我是刑警寧澤递宅,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布娘香,位于F島的核電站,受9級(jí)特大地震影響办龄,放射性物質(zhì)發(fā)生泄漏烘绽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一俐填、第九天 我趴在偏房一處隱蔽的房頂上張望安接。 院中可真熱鬧,春花似錦英融、人聲如沸盏檐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胡野。三九已至,卻和暖如春痕鳍,著一層夾襖步出監(jiān)牢的瞬間硫豆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工额获, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留够庙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓抄邀,卻偏偏與公主長(zhǎng)得像耘眨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境肾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容