成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從零開始構(gòu)建實時操作系統(tǒng)—任務切換

運維 系統(tǒng)運維
嵌入式實時操作系統(tǒng)將會部署到越來越多的設備中,這就要求工程師深入地了解嵌入式實時操作系統(tǒng)。

1、前言

隨著計算機技術(shù)和微電子技術(shù)的迅速發(fā)展,嵌入式系統(tǒng)應用領(lǐng)域越來越廣泛,尤其是其具備低功耗技術(shù)的特點得到人們的重視。隨著工信部提出NB-IoT基站建設具體目標、三大運營商加速建設,即將迎來萬物互聯(lián)的新時代,這是信息產(chǎn)業(yè)繼移動互聯(lián)網(wǎng)之后的下一個萬億級市場,這些為實時操作系統(tǒng)的應用提供了廣闊的前景。

嵌入式實時操作系統(tǒng)將會部署到越來越多的設備中,這就要求工程師深入地了解嵌入式實時操作系統(tǒng)。本系列文章將和大家一起從零開始構(gòu)建一個嵌入式實時操作系統(tǒng),我將用最簡單直白的方式一步一步搭建,我將用一篇文章的方式來總結(jié)搭建中的每個節(jié)點階段,并開源軟件工程和源代碼。

2、嵌入式實時操作系統(tǒng)

嵌入式實時操作系統(tǒng)是一個特殊的程序,是一個支持多任務的運行環(huán)境。嵌入式實時操作系統(tǒng)最大的特點就是“實時性”,如果有一個任務需要執(zhí)行,實時操作系統(tǒng)會立即執(zhí)行該任務,不會有較長的延時。典型的實時操作系統(tǒng)有uCOS ,RT-Thread,F(xiàn)reeRTOS ,VxWorks,WinCE等。

嵌入式實時操作系統(tǒng)是一個特殊的程序(通常稱為內(nèi)核),它可以創(chuàng)建和控制所有任務。嵌入式實時操作系統(tǒng)除了包含一個內(nèi)核以外,還提供其他服務,如文件系統(tǒng),協(xié)議棧,圖形用戶界面等。本文的重點在于了解嵌入式實時操作系統(tǒng)內(nèi)核的工作原理和結(jié)構(gòu),因此文中提到的實時操作系統(tǒng)通常指的是操作系統(tǒng)內(nèi)核。實時操作系統(tǒng)內(nèi)核通常要占用5%左右的CPU運行時間,另外內(nèi)核是一個軟件代碼,需要額外占用ROM空間和RAM空間。

嵌入式實時操作系主要由以下3個子系統(tǒng)組成:

  • 任務調(diào)度子系統(tǒng)
  • 任務通信子系統(tǒng)
  • 內(nèi)存管理子系統(tǒng)

3、實現(xiàn)目標

本文講解構(gòu)建嵌入式實時操作系統(tǒng)的第一個節(jié)點階段:實現(xiàn)簡單的任務切換功能。

代碼區(qū)的數(shù)據(jù)是不變的,處理器寄存器的值和棧空間的值決定程序運行狀態(tài)。讓每個任務“獨享”一個棧空間,當我們將任務運行時的處理器寄存器的值保存起來時,這樣就實現(xiàn)保存任務的運行狀態(tài)。同樣的當我們把保存的任務運行時的處理器寄存器的值裝載到處理的寄存器中時,這樣就恢復了任務的運行狀態(tài),任務繼續(xù)運行起來。

切換任務的原理是:每個任務有一個“獨享”棧空間,通過保存和裝載任務運行時的處理器寄存器的值,實現(xiàn)任務的暫停和恢復運行。暫停一個任務后再恢復另外一個任務就完成了一次任務切換。

任務代碼,任務棧空間和處理器狀態(tài)如下圖:

4、實驗環(huán)境

硬件是基于意法半導體的STM32F401(ARM公司的Cortex-M4內(nèi)核),軟件開發(fā)使用的是KEIL V5.2 開發(fā)工具。

軟件工程如下:

軟件工程中包含:main.c ,startup_stm32f401xc.s 和 readme三個文件。startup_stm32f401xc.s文件為STM32F401的啟動文件,main.c文件實現(xiàn)任務切換功能,readme文件用于記錄版本修改日志。

5、代碼實現(xiàn)

切換任務的原理是讓每個任務都有一個“獨享”棧空間,通過保存和裝載任務運行時的處理器寄存器的值,實現(xiàn)任務的暫停和恢復運行。暫停一個任務后再恢復另外一個任務就完成了一次任務切換。

因此需要實現(xiàn):

  • 每個任務的獨立棧空間。
  • 實現(xiàn)任務的暫停和恢復。
  • 實現(xiàn)任務的調(diào)度。

(1)實現(xiàn)獨立棧空間

棧空間代碼如下:

為每個任務定義一個靜態(tài)數(shù)組,當任務運行時將處理器的棧指針指向任務“自己的”靜態(tài)數(shù)組,從而實現(xiàn)獨立棧空間。棧空間用來存放局部變量,中斷調(diào)用和函數(shù)調(diào)用時的處理器寄存器的值。任務切換時需要將處理器寄存器的值保存到任務的獨立棧空間。

在保存任務運行狀態(tài)時需要保存處理器寄存器值到棧空間,因此需要深入了解處理器寄存器的用途和出入棧順序,Cortex-M4內(nèi)核的寄存器和寄存器中斷自動入棧的順序圖如下:

初始化棧空間的代碼如下:

棧空間初始化后的狀態(tài)如下:

棧是一中先入后出的數(shù)據(jù)結(jié)構(gòu),Cortex-M4內(nèi)核的棧操作方式倍設置成了向下生長。psp_array用于保存任務棧指針,psp_array[0]任務0棧指針指向task0_stack[112],其中task0_stack[116]保存PC程序指針值,task0_stack[117]保存狀態(tài)寄存器(符合Cortex-M4內(nèi)核寄存器出棧順序:手動出棧8個寄存器,硬件自動出棧8個寄存器)。

(2)實現(xiàn)任務的暫停和恢復

代碼如下:

cortex-M4內(nèi)核有一個PendSV(可掛起的系統(tǒng)調(diào)用)異常,其異常編號為14并且具有可編程的優(yōu)先級。當軟件將PendSV設置成掛起時,程序?qū)⑦M入PendSV異常(中斷)。

將PendSV異常優(yōu)先級設置為最低,其它中斷函數(shù)都可以得到正常響應,不會受到PendSV異常影響,在PendSV異常中執(zhí)行任務切換,時序框圖如下:

PendSV_Handler為Cortex-M4內(nèi)核中斷服務函數(shù),進入中斷函數(shù)時處理器自動保存了R0,R1,R2,R3, R12,LR,PC,XPSR,在PendSV_Handler中斷程序中完成R4~R11入棧保存工作,從而實現(xiàn)任務保存工作。

/* 讀取當前進程棧指針數(shù)值 */
MRS R0,PSP
/* 保存R4-R11八個寄存器的值到當前任務棧中 同時將回寫的地址寫入R0 */
STMDB R0!,{R4-R11}

psp_array[0]為任務0的棧指針, psp_array[1]為任務1的棧指針。以下代碼實現(xiàn)任務棧指針切換。

/* 讀取psp_array 地址 */
LDR R3, =__cpp(&psp_array)
/* 將當前進程PSP指針值 寫入 相應的 PSP_array 位置 */
STR R0,[R3,R2,LSL #2]
/* 獲取下個進程序號 */
LDR R4,=__cpp(&next_task)
LDR R4,[R4]
/* R1為&curr_task 將下個進程序號寫入curr_task中 */
STR R4,[R1]
/* psp_array讀取更新后的curr_task的PSP指針數(shù)值 */
LDR R0,[R3,R4,LSL #2]

在PendSV_Handler中斷程序中完成R4~R11寄存器出棧,PendSV_Handler中斷程序返回時處理器自動出棧R0,R1,R2,R3, R12,LR,PC,XPSR,從而實現(xiàn)任務恢復工作。

/* 出棧 R4-R11八個寄存器 */
LDMIA R0!,{R4-R11}
/* 設置PSP指針 */
MSR PSP,R0
/* 中斷返回 */
BX LR

(3)實現(xiàn)任務的調(diào)度

任務調(diào)度的代碼如下:

SysTick_Handler為定時器中斷程序,實現(xiàn)時間片輪流改變目標任務,并掛起PendSV_Handle中斷,退出SysTick_Handler中斷程序時進入PendSV_Handle中斷程序。

6、運行結(jié)果

代碼仿真運行如下:

運行代碼后task_num0和task_num1這兩個變量依次自加,代碼實現(xiàn)任務輪流切換功能。

責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2022-04-01 08:09:03

操作系統(tǒng)嵌入式重構(gòu)

2024-03-01 19:53:37

PyBuilderPython開發(fā)

2024-07-31 08:14:17

2017-02-10 09:30:33

數(shù)據(jù)化運營流量

2010-02-22 09:39:52

HTML 5Web

2024-08-01 11:21:52

2025-01-09 11:14:13

2015-10-15 14:16:24

2024-05-17 17:29:00

CurdlingPython開發(fā)

2024-11-28 10:35:47

2009-04-11 15:12:24

vxworks操作系統(tǒng)

2025-01-26 16:57:02

2024-02-23 09:00:00

編程語言編譯器工具

2014-07-22 13:09:21

android

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構(gòu)

2025-02-17 07:20:00

Flutter 3Flutter開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久aaaa九色 | 日韩一二三区视频 | 亚洲视频在线播放 | 中文字幕国产视频 | 九九精品在线 | 亚洲精品视频在线看 | 黄色一级视频免费 | 热久久国产 | 日韩视频区| 91香蕉| 五十女人一级毛片 | 欧美日韩国产精品一区二区 | 亚洲精品久久久一区二区三区 | 少妇一级淫片免费放播放 | 欧美日韩精品亚洲 | 国产一在线观看 | 91精品国产综合久久久久蜜臀 | 日韩一级免费 | 黄色一级片aaa | 在线观看亚洲精品视频 | 精品国产一二三区 | 九九热在线观看视频 | 欧美久久久久久久 | 日本特黄特色aaa大片免费 | 欧美日韩毛片 | 国产又色又爽又黄又免费 | 国产一区亚洲 | 91视频入口 | 欧美五月婷婷 | 91视频在线网站 | 日韩成人影院 | 欧美又大粗又爽又黄大片视频 | 九九久久精品 | 成人在线免费视频观看 | 国产免费一区二区三区网站免费 | 欧美日韩精品一区 | 涩色视频在线观看 | 国产福利网站 | 国产精品成av人在线视午夜片 | 精品国产第一区二区三区 | 亚洲精品一区二区三区四区高清 |