普通的單片機編程:程序(軟件)——單片機硬件;html
嵌入式操做系統開發:程序(軟件)——操做系統——嵌入式硬件(包括單片機等);編程
咱們平時普通所學的單片機編程開發,通常狀況下都須要對單片機的片載資源進行了解,瞭解IO口、PWM發生器、中斷、定時器、串口等經常使用的內部資源,而後通常採用C編程的面向過程編程,程序的運行過程從進入入口函數開始運行,是順序執行的。單片機的開發,相對來講比較簡單,可是不一樣的單片機,要實現相同的功能,其內部程序必然存在差異,也就是所說的移植性較差,另外在開發單片機時,必然要閱讀芯片手冊,對可用的資源有必定的硬件上的瞭解。在事件的執行上也不如嵌入式開發來得效率高。數組
嵌入式開發,也就是在已有的硬件基礎上移植操做系統,開發者所寫的軟件程序運行在操做系統中,經過調用操做系統提供的 API 接口等調用硬件資源,實現想要實現的功能。操做系統某種程度上屏蔽了底層的硬件,能夠暫時不去考慮操做系統是如何調用硬件資源問題,這其中涉及到驅動等知識。瀏覽器
固然,想要實現移植操做系統的單片機,相對來講其性能就要求高一些,像普通的51芯片,即便移植剪裁到很小的Linux系統,運行起來也很吃力。網絡
開發者所寫的程序是與操做系統相關,與硬件無關,只要運行在相同的操做系統中便可,所以嵌入式開發具備較好的移植性,對底層硬件也不強制要求熟悉,此外嵌入式系統一般是併發式執行任務,所以執行效率要好。好比要說得us/Os II 可同時管理64個任務,多個任務的處理在同時間段內同步完成。(這裏涉及到多線程以及CPU時間片的概念)。數據結構
總結來講,與單片機開發相比,嵌入式開發有以下優勢:多線程
除此以外,嵌入式操做系統還具有不少優越性:精簡的內核,高實時性,多任務的操做系統;高可靠性;可裁剪性好;架構
百度百科的解釋仍是頗有道理的:併發
嵌入式操做系統(Embedded Operating System,簡稱:EOS)是指用於嵌入式系統的操做系統。嵌入式操做系統是一種用途普遍的系統軟件,一般包括與硬件相關的底層驅動軟件、系統內核、設備驅動接口、通訊協議、圖形界面、標準化瀏覽器等。嵌入式操做系統負責嵌入式系統的所有軟、硬件資源的分配、任務調度,控制、協調併發活動。它必須體現其所在系統的特徵,可以經過裝卸某些模塊來達到系統所要求的功能。目前在嵌入式領域普遍使用的操做系統有:嵌入式實時操做系統µC/OS-II、嵌入式Linux、Windows Embedded、VxWorks等,以及應用在智能手機和平板電腦的Android、iOS等。框架
OS_ENTER_CRITICAL() OS_EXIT_CRITCAL() //宏定義的具體實現取決於移植所用的微處理器,每種微處理器都要本身的OS_CPU.H文件
OSTickISR():硬件定時器以時鐘節拍爲週期定時產生中斷,該中斷服務程序爲OSTickISR,該函數中主要調用了OSTIMETick()函數來完成系統在每一個時鐘節拍須要完成的工做。
保存處理器寄存器的值 調用OSIntEnter()或是OSIntNesting加1 調用OSTimeTick() 調用OSIntExit() 恢復處理器寄存器的值 執行中斷返回指令
OSTimeTick():時鐘節拍服務函數作的工做包括:記錄節拍樹,任務延時減一,其任務時在每一個時鐘節拍瞭解任務的延時狀態,使得其中延時結束的非掛起任務進入就緒狀態。
任務狀態:OSTCBStat 任務狀態字
任務控制塊OS_TCB:用來記錄任務的堆棧指針,任務的當前狀態,任務的優先級等一些與任務管理有關的屬性的表,叫作任務控制塊TCB。系統初始化時會按照用戶提供的任務數(OS_MAX_TASKS)爲任務建立相應數量的任務控制塊鏈表,也就是空任務塊鏈表,當建立一個任務後,會調用OSTCBInit來爲任務控制塊進行初始化,從鏈表中獲取一個任務控制塊,並利用屬性對各個成員賦值,最後將該塊鏈入鏈表頭部。
任務就緒表:ready List:包含兩個變量,OSRdyGrp和OSRdyTb1[],每一個任務的就緒標誌都會放入就緒表中,任務按照優先級分組,8個任務爲一組(64個任務),OSRdyGrp中的每一位表示8組任務中每一組中是否有進入就緒狀態的任務。
任務堆棧:保存CPU寄存器中的內容及存儲私有數據的須要,每一個任務都應該分配有本身的堆棧,任務堆棧是任務的重要組成部分,在應用程序中定義任務堆棧方法爲:OS_TSK TaskStk[TASK_STK_SIZE]定義一個OS_STK類型數組並在建立一個任務時將數組地址賦給該任務。
任務建立:建立函數:OSTaskCreate + 建立函數:OSTaskCreateExt 建立任務時傳遞任務的堆棧指針,任務的指針,任務參數以及任務優先級等,OSTaskCreate()在建立任務時會調用任務堆棧初始化函數OSTaskStkInit()來完成任務堆棧的初始化工做,這個函數在OS_CPU.C根據處理器移植時編寫
任務切換:OS_TASK_SW()任務切換宏:停止正在運行的任務,轉而去運行另一個任務的操做,這個任務時就緒任務中優先級別最高的那個任務。簡單說,就是將掛起的任務寄存器入棧,將較高優先級任務的寄存器出棧
OSSchedLock() 禁止調度保護任務級的共享資源
typedef struct { INT8U OSEventType; //事件的類型 INT16U OSEventCnt; //信號量計數器 void *OSEventPtr; //消息或消息隊列的指針 INT8U OSEventGrp; //等待事件的任務組 INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任務等待表 } OS_EVENT;
設置OS_CPU.H與處理器和編譯器相關的代碼:包括定義數據類型INT8U,INT8S等,使用OS_ENTER_CRITICAL等宏開啓中斷關閉中斷等,定義堆棧增加方向(要注意)
用C語言編寫與操做系統相關的函數 OS_CPU_C.C:OSTaskStkInit(初始化任務堆棧),OSTaskCreateHook,OSTaskDelHook,OSTaskSwHoOK,OSTaskStatHook,OSTimeTickHooK,比較重要的是第一個,後面五個通常可置空
用匯編語言編寫四個與處理器相關的函數 OS_CPU.ASM:OSStartHighRdy,OSCtxSw(上下文切換)OSIntCtxSw(中斷級任務切換),OSTickISR
飛思卡爾9s12X系列雙核中的協處理器XGATE
雙核架構,增長了一個RISC核的高效協處理器,XGATE模塊,專門用於處理中斷任務,能夠將主核CPU從執行耗時的中斷處理程序工做中解放出來,專一於執行與應用有關的任務,實現更好的實時事件處理,XGATE採用RISC指令核,代碼高效,主頻運行速率可達到主核的2倍。
#pragma DATA_SEG_SHARED_DATA volatile int shared_counter;// 定義XGATE與主核共享RAM的變量 #pragma DATA_SEG DEFAULT
#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 寄存器設置到初始地址 XGVBR= (unsigned int)(void*__far)(XGATE_VectorTable - XGATE_VECTOR_OFFSET); // RTI_VEC 爲自定義中斷名 設置xgate中斷以及中斷優先級 ROUTE_INTERRUPT(RTI_VEC, 0x86); /* RQST=1 and PRIO=1 */ //實時時鐘中斷 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 */ }
interrupt void SCI2_Handler(void){ } const XGATE_TableEntry XGATE_VectorTable[] ={ ... {(XGATE_Function)SCI2_Handler}, // Channel 45 - SCI2 ... }
can總線是一種串行數據通訊協議,特色包括:多主機方式工做,任意節點能夠在任意時刻主動向網絡上其餘節點發送信息;串行,同步,半雙工,CRC
節點信息分紅不一樣的優先級:仲裁總線結構機制,節點同時傳送信息時,優先級低的節點主動中止數據發送,優先級高的節點不受影響繼續傳送數據。
CAN總線系統:由多個電子控制單元EMU同時控制多個工做裝置或系統,各控制單元ECU的共用信息經過總線互相傳遞。
傳輸速度快;相關控制單元可共用傳感器;更少的線束,更小的控制單元,節省了空間。
參考:https://wenku.baidu.com/view/bab35fb765ce0508763213cf.html
每組報文開頭的11位字符爲標識符,定義了報文的優先級,這種報文格式稱爲面向內容的編址方案。標識符在網絡中是惟一的,描述了數據的特定含義,也決定報文優先級(標識符數值越小,優先級越高)。注意:最高優先級的報文得到總線訪問權,低優先級報文在下一個總線週期自動重發。
當一個站要向其它站發送數據時,該站的CPU將要發送的數據和本身的標識符傳送給本站的CAN芯片,並處於準備狀態;當它收到總線分配時,轉爲發送報文狀態。CAN芯片將數據根據協議組織成必定的報文格式發出,這時網上的其它站處於接收狀態。每一個處於接收狀態的站對接收到的報文進行檢測,判斷這些報文是不是發給本身的,以肯定是否接收它。