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

1 嵌入式操作系統(tǒng)

  • 為什么要用嵌入式操作系統(tǒng)

普通的單片機(jī)編程:程序(軟件)——單片機(jī)硬件;

嵌入式操作系統(tǒng)開發(fā):程序(軟件)——操作系統(tǒng)——嵌入式硬件(包括單片機(jī)等);

我們平時(shí)普通所學(xué)的單片機(jī)編程開發(fā),一般情況下都需要對單片機(jī)的片載資源進(jìn)行了解,了解IO口、PWM發(fā)生器、中斷、定時(shí)器、串口等常用的內(nèi)部資源,然后一般采用C編程的面向過程編程,程序的運(yùn)行過程從進(jìn)入入口函數(shù)開始運(yùn)行,是順序執(zhí)行的。單片機(jī)的開發(fā),相對來說比較簡單,但是不同的單片機(jī),要實(shí)現(xiàn)相同的功能,其內(nèi)部程序必然存在差別,也就是所說的移植性較差,另外在開發(fā)單片機(jī)時(shí),必然要閱讀芯片手冊,對可用的資源有一定的硬件上的了解。在事件的執(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í)現(xiàn)移植操作系統(tǒng)的單片機(jī),相對來說其性能就要求高一些,像普通的51芯片,即使移植剪裁到很小的Linux系統(tǒng),運(yùn)行起來也很吃力。

開發(fā)者所寫的程序是與操作系統(tǒng)相關(guān),與硬件無關(guān),只要運(yùn)行在相同的操作系統(tǒng)中即可,因此嵌入式開發(fā)具有較好的移植性,對底層硬件也不強(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. 屏蔽硬件,不要求對硬件資源的熟悉性;
  3. 多任務(wù)實(shí)時(shí)性高,效率高;

除此之外,嵌入式操作系統(tǒng)還具備很多優(yōu)越性:精簡的內(nèi)核,高實(shí)時(shí)性,多任務(wù)的操作系統(tǒng);高可靠性;可裁剪性好;

百度百科的解釋還是很有道理的:

嵌入式操作系統(tǒng)(Embedded Operating System,簡稱:EOS)是指用于嵌入式系統(tǒng)操作系統(tǒng)。嵌入式操作系統(tǒng)是一種用途廣泛的系統(tǒng)軟件,通常包括與硬件相關(guān)的底層驅(qū)動軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議圖形界面、標(biāo)準(zhǔn)化瀏覽器等。嵌入式操作系統(tǒng)負(fù)責(zé)嵌入式系統(tǒng)的全部軟、硬件資源的分配、任務(wù)調(diào)度,控制、協(xié)調(diào)并發(fā)活動。它必須體現(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ù)通信的事件(信號量,消息隊(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)先級,優(yōu)先級號越低,任務(wù)優(yōu)先級越高。μC/OS-II系統(tǒng)的任務(wù)調(diào)度是基于優(yōu)先級的。
    4. OS_LOWEST_PRO 該變量可以在中OS_CFG.H 中定義,說明應(yīng)用程序中任務(wù)優(yōu)先級別的數(shù)目
  • 中斷處理:

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

    1. 時(shí)鐘節(jié)拍是一種特殊得中斷,操作系統(tǒng)的心臟,對任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),進(jìn)行上下文切換,也就是切換任務(wù)
    2. μC/OS-II系統(tǒng)需要用戶提供周期性信號源,系統(tǒng)在多任務(wù)系統(tǒ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)先級總是設(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()啟動:開始多任務(wù)執(zhí)行,啟動之前,至少要調(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)先級等一些與任務(wù)管理有關(guān)的屬性的表,叫做任務(wù)控制塊TCB。系統(tǒng)初始化時(shí)會按照用戶提供的任務(wù)數(shù)(OS_MAX_TASKS)為任務(wù)創(chuàng)建相應(yīng)數(shù)量的任務(wù)控制塊鏈表,也就是空任務(wù)塊鏈表,當(dāng)創(chuàng)建一個(gè)任務(wù)后,會調(diào)用OSTCBInit來為任務(wù)控制塊進(jìn)行初始化,從鏈表中獲取一個(gè)任務(wù)控制塊,并利用屬性對各個(gè)成員賦值,最后將該塊鏈入鏈表頭部。
image.png
image.png
  • 任務(wù)就緒表:ready List:包含兩個(gè)變量,OSRdyGrp和OSRdyTb1[],每個(gè)任務(wù)的就緒標(biāo)志都會放入就緒表中,任務(wù)按照優(yōu)先級分組,8個(gè)任務(wù)為一組(64個(gè)任務(wù)),OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒狀態(tài)的任務(wù)

  • 任務(wù)堆棧:保存CPU寄存器中的內(nèi)容及存儲私有數(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)先級等,OSTaskCreate()在創(chuàng)建任務(wù)時(shí)會調(diào)用任務(wù)堆棧初始化函數(shù)OSTaskStkInit()來完成任務(wù)堆棧的初始化工作,這個(gè)函數(shù)在OS_CPU.C根據(jù)處理器移植時(shí)編寫

  • 任務(wù)調(diào)度(Task Scheduling):

    1. 搶占式多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準(zhǔn)備就緒,就擁有CPU的所有權(quán)開始運(yùn)行,uc/OS 不支持時(shí)間片輪轉(zhuǎn),任務(wù)調(diào)度是指:查找準(zhǔn)備就緒的最高優(yōu)先級的任務(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)志都會放入就緒表中,任務(wù)按照優(yōu)先級分組,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)先級別最高的就緒任務(wù)
      image.png
  • 任務(wù)切換:OS_TASK_SW()任務(wù)切換宏:中止正在運(yùn)行的任務(wù),轉(zhuǎn)而去運(yùn)行另外一個(gè)任務(wù)的操作,這個(gè)任務(wù)時(shí)就緒任務(wù)中優(yōu)先級別最高的那個(gè)任務(wù)。簡單說,就是將掛起的任務(wù)寄存器入棧,將較高優(yōu)先級任務(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:信號量,郵箱,消息隊(duì)列,信號量集

  • OSSchedLock() 禁止調(diào)度保護(hù)任務(wù)級的共享資源

  • 事件(ECB 事件控制塊)OS_EVENT:

typedef struct 
{
   INT8U  OSEventType;            //事件的類型
   INT16U OSEventCnt;            //信號量計(jì)數(shù)器
   void *OSEventPtr;        //消息或消息隊(duì)列的指針
   INT8U  OSEventGrp;        //等待事件的任務(wù)組
   INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任務(wù)等待表
} OS_EVENT;
  1. 信號量(Semaphore):控制共享資源的使用權(quán),標(biāo)志事件的發(fā)生,使得兩個(gè)任務(wù)的行為同步,信號量包括信號量計(jì)數(shù)值和等待該信號任務(wù)的等待任務(wù)表,操作:OSSEMCreate(創(chuàng)建一個(gè)信號量,這個(gè)時(shí)候系統(tǒng)從空事件控制塊鏈表中獲取一個(gè)控制塊,對它初始化并描述該事件),OSSEemPend(OS_Event *pevent,INT16U timeout,INTU *err)請求信號量,pevent是被請求信號量的指針, OSSemPost(OS_EVENT *pevent)釋放信號量,如果不需要某信號量了可以調(diào)用OssDel(OS_EVENT *pevent,INT8U opt,INT8U *err),注意互斥信號量與優(yōu)先級反轉(zhuǎn)的問題
  2. 消息郵箱:OS_EVENT_TYPE_MBOX:在兩個(gè)需要通信的任務(wù)之間通過傳遞數(shù)據(jù)緩沖區(qū)指針的方法來通信
  3. 消息隊(duì)列:OS_EVENT_TYPE_Q:相當(dāng)于是共用一個(gè)任務(wù)等待列表的消息郵箱數(shù)組
  4. 信號量集

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寄存器存儲或者獨(dú)處到堆棧/內(nèi)存的指令
  • 移植文件

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

    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(中斷級任務(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總線由三條信號線組成:串行時(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ù)傳輸,為了信號傳輸更遠(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)位等格式,以及各種異步握手信號。

3.3 I2C:I2C總線

  • Philips公司開發(fā)的一種簡單的雙向二進(jìn)制同步串行總線,只需要兩根線即可連接于總線上的在器件之間傳送信息,具備多主機(jī)系統(tǒng)所需要的包括總線裁決和高低速器件同步功能的高性能串行總線
  • 兩根線:SDA(串行數(shù)據(jù)線) SCL(串行時(shí)鐘線),連接在總線上的IC數(shù)量受總線最大電容限制,兩根線都是雙向數(shù)據(jù)線,
  • 每個(gè)接到I2C總線上的器件都有唯一地址,I2C有存在總線仲裁機(jī)制,以確定哪一臺主機(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 是對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)先級 
    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í)刻主動向網(wǎng)絡(luò)上其他節(jié)點(diǎn)發(fā)送信息;串行,同步,半雙工,CRC
    節(jié)點(diǎn)信息分成不同的優(yōu)先級:仲裁總線結(jié)構(gòu)機(jī)制,節(jié)點(diǎn)同時(shí)傳送信息時(shí),優(yōu)先級低的節(jié)點(diǎn)主動停止數(shù)據(jù)發(fā)送,優(yōu)先級高的節(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é)議總線,可以使用雙絞線來傳輸信號,是應(yīng)用最廣泛的現(xiàn)場總線之一。
  • 實(shí)時(shí)性強(qiáng),傳輸距離遠(yuǎn),抗電磁干擾強(qiáng),成本低,通信速度最高可達(dá)40M
  • 雙線串行通信,檢錯能力強(qiáng)
  • 具有優(yōu)先權(quán)和仲裁功能,多個(gè)模塊通過can控制器掛在can-bus上,形成多主機(jī)局部網(wǎng)絡(luò)
  • 根據(jù)報(bào)文ID決定接收或屏蔽報(bào)文
  • 報(bào)文使用標(biāo)識符來指示功能信息,優(yōu)先級信息
  • 短幀結(jié)構(gòu),出錯時(shí)可自動關(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)。對每個(gè)節(jié)點(diǎn)來說,無論數(shù)據(jù)是否是發(fā)給自己的,都對其進(jìn)行接收。

  • 每組報(bào)文開頭的11位字符為標(biāo)識符,定義了報(bào)文的優(yōu)先級,這種報(bào)文格式稱為面向內(nèi)容的編址方案。標(biāo)識符在網(wǎng)絡(luò)中是唯一的,描述了數(shù)據(jù)的特定含義,也決定報(bào)文優(yōu)先級(標(biāo)識符數(shù)值越小,優(yōu)先級越高)。注意:最高優(yōu)先級的報(bào)文獲得總線訪問權(quán),低優(yōu)先級報(bào)文在下一個(gè)總線周期自動重發(fā)。

  • 當(dāng)一個(gè)站要向其它站發(fā)送數(shù)據(jù)時(shí),該站的CPU將要發(fā)送的數(shù)據(jù)和自己的標(biāo)識符傳送給本站的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)的站對接收到的報(bào)文進(jìn)行檢測,判斷這些報(bào)文是否是發(fā)給自己的,以確定是否接收它。

  • CAN 總線組成:

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


    image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容