freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于stm32的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn)本科畢業(yè)論文-文庫吧資料

2025-07-02 09:50本頁面
  

【正文】 ,并立即顯示;LCD顯示任務(wù)用于顯示圖形,和接收紅外信號(hào)信息顯示出來;KEY按鍵任務(wù)分別使屏進(jìn)入校準(zhǔn)功能,以及顯示歡迎界面。圖 按鍵和 LED 燈武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙15 紅處接收電路HS0038 用于顯度的采集,其通信是單總線式,直接與 STM32F103 相連。武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙14圖 最小系統(tǒng) LCD 接口顯示電路使用的是 寸的 TFT 液晶顯示器,該顯示器有 16 位的數(shù)據(jù)口和5 位的控制端口。 硬件結(jié)構(gòu) STM32 最小系統(tǒng)STM32F103 最小系統(tǒng)包括電源電路,復(fù)位電路,時(shí)鐘電路,主芯片和下載接口。 這里 STM32 的 VBAT 采用CR1220 紐扣電池和 混合供電的方式,在有外部電源()的時(shí)候,CR1220 不給 VBAT 供電,而在外部電源斷開的時(shí)候,則由 CR1220 給VBAT 供電。P5 口是另外一個(gè) IO 引出排陣,將PORTC 和 PORTD 等的剩余 IO 口從這里引出。使用的時(shí)候,不受到 PL2303 的影響。P4口連接了 PL2303 的串口輸出,對(duì)應(yīng)著 STM32 的串口 1(PA9/PA10 ) ,在使用的時(shí)候,也是通過跳線帽將這兩處連接起來。P2 連接了 DS18B20 的數(shù)據(jù)口以及紅外傳感器的數(shù)據(jù)線,它們分別對(duì)應(yīng)著 PA0 和 PA1,只需要 19 通過跳線帽將 P2和 P3 連接起來就可以使用了。 P3 和 P1 分別用于 PORTA 和 PORTB 的 IO 口引出,其中 P2 還有部分用于 PORTC 口的引出。BOOT1 用于設(shè)置 STM32 的啟動(dòng)方式,其對(duì)應(yīng)啟動(dòng)模式如表 所示:表 BOOT0、BOOT1 啟動(dòng)模式表BOOT0 BOOT1 啟動(dòng)模式 說明0 X 用戶閃存存儲(chǔ)器 用戶閃存存儲(chǔ)器,也就是 FLASH 啟動(dòng)1 0 系統(tǒng)存儲(chǔ)器 系統(tǒng)存儲(chǔ)器啟動(dòng),用于串口下載1 1 SRAM 啟動(dòng) SRAM 啟動(dòng),用于在 SRAM 中調(diào)試代碼按照表 ,一般情況下如果我們想用用串口下載代碼,則必須配置BOOT0 為 1,BOOT1 為 0,而如果想讓 STM32 一按復(fù)位鍵就開始跑代碼,則需要配置 BOOT0 為 0,BOOT1 隨便設(shè)置都可以。128K FLASH、20K SRAM、2 個(gè) SPI、3 個(gè)串口、1 個(gè) USB 、1 個(gè) CAN、2 個(gè) 12 位的 ADC、RTC 、51 個(gè)可用 IO腳(3)最后新建 main 文件,在編輯區(qū)寫代碼。回到“畢業(yè)設(shè)計(jì) ”文件夾中,把系統(tǒng) SYSTEM 文件夾(delay,sys,usart 文件夾)復(fù)制過來,再建立 main 和 hardware 文件夾用于主函數(shù)和各外設(shè)資源函數(shù)。單擊“OK” 按鈕,則彈出一個(gè)對(duì)話框加載啟動(dòng)文件到工程中。 keil4 工程建立以及仿真方法(1)新建工程。武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙123 LCD 屏程序設(shè)計(jì)及調(diào)試 工具概述RVMDK 源自德國的 KEIL 公司,是 RealView MDK 的簡稱。整個(gè)移植的過程非常容易。 } 其他的鉤子函數(shù)都為空函數(shù)。 // R5 *(stk) = (INT32U)0x00000000L。 //R7 *(stk) = (INT32U)0x00000000L。 // R9 *(stk) = (INT32U)0x00000000L。 // R11 *(stk) = (INT32U)0x00000000L。 // R1 *(stk) = (INT32U)p_arg。 //R3 *(stk) = (INT32U)0x00000000L。 // R14 (LR) *(stk) = (INT32U)0x00000000L。 //xPSR *(stk) = (INT32U)task。 //防止編譯器報(bào)錯(cuò) stk = ptos。這個(gè)函數(shù)的代碼時(shí)下如下: OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt) { OS_STK *stk。這個(gè)函數(shù)首先將用戶為任務(wù)分配的堆棧頂?shù)刂焚x值給一個(gè)棧指針變量,然后再通過這個(gè)棧指針向任務(wù)的??臻g寫入初值。另外一個(gè)不是鉤子函數(shù),它是OSTaskStkInit()。 OSTimeTickHook ()。 OSTaskSwHook ()。 OSTaskStatHook ()。 OSTaskDelHook ()。 OSInitHookEnd ()。 從異常中返回; // 退出異常,處理器自動(dòng)恢復(fù)R3R0,R12,LR,PC 和xPSR 這樣很容易寫出PendSV中斷服務(wù)程序的代碼了。 // 設(shè)置運(yùn)行的任務(wù)控制塊為最高 //就緒任控制塊務(wù) PSP = OSTCBHighRdyOSTCBStkPtr。 //實(shí)現(xiàn)用戶擴(kuò)展功能而定義的鉤子 OSPrioCur = OSPrioHighRdy。具體的PendSV服務(wù)程序的偽代碼如下: OS_CPU_PendSVHandler : // 進(jìn)入異常,處理器自動(dòng)保存R3R0,R12,LR,PC 和xPSR if (PSP != NULL) //判斷不是開始第一次任務(wù) { 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙10保存R4R11到任務(wù)的堆棧; OSTCBCurOSTCBStkPtr = SP。首先是微處理器自動(dòng)保存上面提到的寄存器,然后把當(dāng)前的堆棧指針保存到任務(wù)的棧中,將要切換的任務(wù)的優(yōu)先級(jí)和任務(wù)控制塊的指針賦值給運(yùn)行時(shí)的最高優(yōu)先級(jí)指針和運(yùn)行時(shí)的任務(wù)控制塊指針,最后再把要運(yùn)行的任務(wù)的堆棧指針賦值給微處理器的堆棧指針,這樣就可以退出中斷服務(wù)程序了。OSStartHighRdy()主要完成以下幾項(xiàng)工作: ① 為任務(wù)切換設(shè)置PendSV的優(yōu)先級(jí);② 為第一次任務(wù)切換設(shè)置棧指針為0;③ 設(shè)置OSRunning = TRUE,以表明系統(tǒng)正在運(yùn)行;④ 觸發(fā)一次 PendSV,打開中斷等待第一次任務(wù)的切換。其代碼如下: OS_CPU_SR_Restore MSR PRIMASK, R0 BX LR CortexM3處理器有單獨(dú)的指令來打開或者關(guān)閉中斷,所以這兩個(gè)函數(shù)實(shí)現(xiàn)起來很簡單。也就是將狀態(tài)寄存器的內(nèi)容從R0中恢復(fù),然后跳轉(zhuǎn)回去。故關(guān)中斷實(shí)現(xiàn)代碼如下 OS_CPU_SR_Save MRS R0, PRIMASK; CPSID I BX LR 這也是宏OS_ENTER_CRITICAL() 的最終實(shí)現(xiàn)。 OSIntCtxSw()。 OSStartHighRdy()。 OS_CPU_SR_Save()。 void OS_CPU_PendSVHandler(void)。 void OSIntCtxSw(void)。 (5)其他函數(shù)聲明 在OS_ ,還聲明了以下幾個(gè)函數(shù),這幾個(gè)函數(shù)均在。即定義成如下形式 define OS_STK_GROWTH 1 (4)任務(wù)級(jí)任務(wù)切換 任務(wù)級(jí)任務(wù)切換調(diào)用宏OS_TASK_SW()來實(shí)現(xiàn)。 (3)棧的增長方向 盡管181。同時(shí)得注意,在使用這兩個(gè)宏之前,必須定義OS_CPU_SR cpu_sr。} define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr)。一般來說,采用方法3來實(shí)現(xiàn)這兩個(gè)宏。181。C/OSII為了保證某段代碼的完整執(zhí)行,需要臨時(shí)的關(guān)閉中斷,在這段代碼執(zhí)行完成之后再打開中斷。武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙8CortexM3 狀態(tài)寄存器為32位,定義OS_CPU_SR主要是為了在進(jìn)出臨界代碼段保存狀態(tài)寄存器。C/OSII定義了一個(gè)堆棧數(shù)據(jù)類型。C/OSII源代碼中并未使用。盡管181。 在STM32處理器及 keil MDK 或者IAR 編譯環(huán)境中可以通過查手冊得知short類型是16位而int類型是32位,這對(duì)于CortexM3 內(nèi)核是一致的。 typedef unsigned int OS_STK。 typedef float FP32。 typedef unsigned int INT32U。 typedef unsigned short INT16U。 typedef unsigned char INT8U。 移植方法(1)內(nèi)核頭文件() 在OS_CP 中,主要聲明了一些與微處理器相關(guān)的常量、宏和typedef。 (4)處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。(2)用C 語言就可以打開和關(guān)閉中斷。 STM32 上移植方法 平臺(tái)需求181。(2)消息郵箱一種通信機(jī)制,可以使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量,通常該指針指向一個(gè)包含了消息的特定數(shù)據(jù)結(jié)構(gòu)。信號(hào)量還可用于表示某事件的發(fā)生,用旗幟符號(hào)表示,符號(hào)旁數(shù)字代表事件已經(jīng)發(fā)武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙7生的次數(shù)。C/OSII 任務(wù)間通信方式 (1)信號(hào)量信號(hào)量由兩部分組成:一部分是16位的無符號(hào)整型信號(hào)量的計(jì)數(shù)值;另一部分是由等待該信號(hào)量的任務(wù)組成的等待任務(wù)表。系統(tǒng)初始化時(shí)會(huì)自動(dòng)產(chǎn)生兩個(gè)任務(wù):一個(gè)是空閑任務(wù),它的優(yōu)先級(jí)最低,該任務(wù)僅給一個(gè)整型變量做累加運(yùn)算;另一個(gè)是統(tǒng)計(jì)任務(wù),它的優(yōu)先級(jí)為次低,該任務(wù)負(fù)責(zé)統(tǒng)計(jì)當(dāng)前CPU的利用率。181。C/OSII中最多可以支持64個(gè)任務(wù),分別對(duì)應(yīng)優(yōu)先級(jí) 0~63,其中0為最高優(yōu)先級(jí)。釋放內(nèi)存時(shí)將該塊放回它以前所屬的分區(qū),這樣能有效解決碎片問題,同時(shí)執(zhí)行時(shí)間也是固定的。每個(gè)分區(qū)中包含整數(shù)個(gè)大小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)存塊大小可以不同。181。 內(nèi)存管理在ANSI C中是使用 malloc和free兩個(gè)函數(shù)來動(dòng)態(tài)分配和釋放內(nèi)存。啟動(dòng)之前要至少創(chuàng)建一個(gè)任務(wù)。C/OSII初始化任務(wù)控制塊、事件控制塊、消息隊(duì)列緩沖、標(biāo)志控制塊等數(shù)據(jù)結(jié)構(gòu)的空緩沖區(qū)。C/OSII所有的變量和數(shù)據(jù)結(jié)構(gòu),并建立空閑任務(wù)。C/OSII的服務(wù)之前要先調(diào)用系統(tǒng)初始化函數(shù) OSInit()。 181。C/OSII中的時(shí)鐘節(jié)拍服務(wù)是在ISR中調(diào)用OSTimeTick()實(shí)現(xiàn)的。假設(shè)用定時(shí)器TA0作為時(shí)鐘中斷源,那么,在移植過程中實(shí)現(xiàn)了函數(shù)init_timer_ta0(),此函數(shù)用來初始化定時(shí)器TA0,并將其打開。應(yīng)該在多任務(wù)系統(tǒng)啟動(dòng)后,也就是調(diào)用OSStart()后再開啟時(shí)鐘節(jié)拍器。C/OSII要求用戶提供一個(gè)周期性的時(shí)鐘源,來實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙6能,時(shí)鐘節(jié)拍應(yīng)該每秒發(fā)生10~100次/秒。C/OSII發(fā)生了中斷,這樣可以實(shí)現(xiàn)ISR 返回前的任務(wù)調(diào)度。OSUnMapTbl[] 是常量表,所以查找優(yōu)先級(jí)最高的任務(wù)的執(zhí)行時(shí)間為常量,和就緒表的任務(wù)數(shù)無關(guān)。 OSRdyGrp的每一位代表每組任務(wù)是否有進(jìn)入就緒態(tài)的任務(wù)。(2)就緒表每個(gè)就緒的任務(wù)都放在就緒表中,就緒表有兩個(gè)變量:OSRdyGrp和OSRdyTbl[]。中斷級(jí)的任務(wù)切換OSIntCtxSw()是在OSIntExt()中調(diào)用的,我們一般在用戶ISR中調(diào)用OSIntExt()以實(shí)現(xiàn)中斷返回前的任務(wù)調(diào)度。②將要運(yùn)行的高優(yōu)先級(jí)的任務(wù)的寄存器值從堆?;謴?fù)到CPU寄存器。任務(wù)級(jí)的任務(wù)切換過程:①保存當(dāng)前運(yùn)行的任務(wù)的 CPU寄存器值到該任務(wù)的堆棧。任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()是宏調(diào)用,通過軟中斷指令來實(shí)現(xiàn)CPU寄存器內(nèi)容切換。而中斷返回前ISR 調(diào)用OSIntExt()函數(shù),該函數(shù)查找就緒表發(fā)現(xiàn)有必要進(jìn)行任務(wù)切換,從而被中斷的任務(wù)進(jìn)入等待狀態(tài),運(yùn)行被激活的高優(yōu)先級(jí)的任務(wù)。這兩種任務(wù)調(diào)度情況調(diào)用的任務(wù)切換函數(shù)不同:任務(wù)級(jí)的任務(wù)調(diào)度
點(diǎn)擊復(fù)制文檔內(nèi)容
外語相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1