久久久久无码精品,四川省少妇一级毛片,老老熟妇xxxxhd,人妻无码少妇一区二区

μC/OS-II的多任務(wù)信息流與CAN總線驅(qū)動(dòng)

時(shí)間:2024-05-30 21:57:31 理工畢業(yè)論文 我要投稿
  • 相關(guān)推薦

μC/OS-II的多任務(wù)信息流與CAN總線驅(qū)動(dòng)

摘要:闡述μC/OS-II多任務(wù)信息流關(guān)鍵技術(shù)與中斷處理的一般方法和PC體系中斷的基本概念;以CAN總線為例,詳細(xì)分析在x86實(shí)模式下基于μC/OS-II的CAN總線驅(qū)動(dòng)的實(shí)現(xiàn)過(guò)程。

μC/OS-II是美國(guó)人Jean Labrosse編寫的一個(gè)免費(fèi)的、源碼公開的嵌入式實(shí)時(shí)內(nèi)核。對(duì)于開發(fā)計(jì)算機(jī)嵌入式應(yīng)用產(chǎn)品的技術(shù)人員來(lái)說(shuō)是一個(gè)實(shí)用價(jià)值很高的實(shí)時(shí)嵌入式操作系統(tǒng)ERTOS(Embedded Real Time Operation System)。

  要開發(fā)出完善的ERTOS,就要在多任務(wù)的調(diào)度和對(duì)I/O設(shè)備操作的穩(wěn)定性、協(xié)調(diào)性方面做出大量的工作,這也是我在開發(fā)ERTOS過(guò)程中深深體會(huì)到的重點(diǎn)所在。希望本文能對(duì)開發(fā)ERTOS的技術(shù)人員在多任務(wù)信息流和I/O驅(qū)動(dòng)方面有所啟迪。

1 多任務(wù)信息流關(guān)鍵技術(shù)

  在討論多任務(wù)信息流之前,先討論一下多任務(wù)的工作狀態(tài)。在μC/OS中,每個(gè)任務(wù)都是無(wú)限循環(huán)的,每個(gè)任務(wù)都處在以下五種狀態(tài)之一:休眠態(tài)、就緒態(tài)、運(yùn)行態(tài)、掛起態(tài)和中斷態(tài),如圖1所示。

  在多任務(wù)的調(diào)度和驅(qū)動(dòng)程序的編寫過(guò)程中,必然要涉及到公用代碼段和共享存儲(chǔ)區(qū)的保護(hù)問(wèn)題。即使是原有的C函數(shù),可重用性方面在沒(méi)有得到理論和實(shí)踐的驗(yàn)證情況下也需要對(duì)其進(jìn)行保護(hù)。這樣就需要合理的算法對(duì)公用代碼段、共享存儲(chǔ)區(qū)進(jìn)行保護(hù),避免操作系統(tǒng)在運(yùn)行過(guò)程中產(chǎn)生重用性問(wèn)題而導(dǎo)致運(yùn)行結(jié)果不可預(yù)測(cè)。

  系統(tǒng)在開發(fā)過(guò)程中,既要考慮到減少系統(tǒng)的復(fù)雜程度,也要兼顧其穩(wěn)定性與運(yùn)行效率的要求。這就需要我們對(duì)各種算法進(jìn)行合理的選擇:在穩(wěn)定性可以保障的情況下,選擇相對(duì)簡(jiǎn)單,占用CPU時(shí)間少的算法;在穩(wěn)定性不能保障的情況下,考慮選擇周全的算法。只有這樣才能使操作系統(tǒng)在一定的配置環(huán)境下達(dá)到最高的運(yùn)行效率。

  接下來(lái)分別用void CanSendMessageProcess(void *data)、void CanSendMessage(void *data)、void CanReceiveMessageProcess(void *data)和void CanReceiveMessage(void *data)這四個(gè)任務(wù)來(lái)描述在采用消息隊(duì)列、郵箱和信號(hào)量通信機(jī)制時(shí)的信息流的傳遞過(guò)程。

 。1)消息隊(duì)列通信機(jī)制

  消息隊(duì)列在初始化的時(shí)候,建立一個(gè)指定空間大小的數(shù)組,這個(gè)數(shù)組在使用的時(shí)候取得了環(huán)形緩沖區(qū)的概念。這個(gè)數(shù)組在運(yùn)行期間不會(huì)被消除,這樣就避免了重復(fù)建立數(shù)組的時(shí)候內(nèi)存空間的泄漏問(wèn)題。當(dāng)一個(gè)任務(wù)向消息隊(duì)列發(fā)送一個(gè)信息的時(shí)候,相應(yīng)的指針加1(OSQIn 1),隊(duì)列滿時(shí)(OSQEntries = OSQSize),OSQIn則與OSQOut指向同一單元。如果在OSQIn指向的單元內(nèi)插入新的指向消息的指針,就構(gòu)成FIFO(First-In-First-Out)隊(duì)列。相反,如果在OSQOut指向單元的下一個(gè)單元插入新的指針,就構(gòu)成LIFO隊(duì)列(Last-In-First-Out)。在本實(shí)例中,我們定義FIFO隊(duì)列。消息指針總是從OSQOut指向的單元取出。OSQStart和OSQEnd定義了消息指針數(shù)組的頭和尾,以便在OSQIn和OSQOut到達(dá)隊(duì)列的邊緣時(shí),進(jìn)行邊界檢查和必要的指針調(diào)整,實(shí)現(xiàn)其循環(huán)功能。

  消息隊(duì)列數(shù)據(jù)結(jié)構(gòu)如下:

typedef struct os_q {

struct os_q *OSQPtr; /* 在空閑隊(duì)列控制塊中鏈接所有的隊(duì)列控制塊*/

void *OSQStart; /*指向消息隊(duì)列的指針數(shù)組的起始地址的指針*/

void *OSQEnd; /* 指向消息隊(duì)列結(jié)束單元的下一個(gè)地址的指針*/

void *OSQIn; /* 指向消息隊(duì)列中插入下一條信息位置的指針*/

void *OSQOut; /* 指向消息隊(duì)列中下一個(gè)取出消息位置的指針*/

INT16U OSQSize; /* 消息隊(duì)列中總的單元數(shù)*/

INT16U OSQEntries; /*消息隊(duì)列中總的消息數(shù)量*/

} OS_Q;

圖2為消息隊(duì)列信息流的演示說(shuō)明。

  ① CanSendMessageProcess任務(wù)完成信息的計(jì)算工作以后,將要發(fā)送的信息送進(jìn)消息隊(duì)列1。

 、 CanSendMessage任務(wù)負(fù)責(zé)取得消息隊(duì)列1里面的信息。

【μC/OS-II的多任務(wù)信息流與CAN總線驅(qū)動(dòng)】相關(guān)文章:

基于ADμC812的CAN總線智能節(jié)點(diǎn)的設(shè)計(jì)03-19

嵌入式Linux下CAN總線驅(qū)動(dòng)程序設(shè)計(jì)03-07

CAN總線控制器與DSP的接口03-07

光纖CAN總線自愈環(huán)網(wǎng)的研究01-09

CAN總線在樓宇監(jiān)控系統(tǒng)中的應(yīng)用03-07

CAN總線中位定時(shí)的設(shè)定方法03-18

基于PCI總線的CAN卡的設(shè)計(jì)與實(shí)現(xiàn)03-18

CAN總線位定時(shí)參數(shù)的確定03-18

基于CAN總線的汽車液晶儀表設(shè)計(jì)03-07