日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2024年10月25日(星期五)

正在發(fā)生

2019年10月25日 | 基于MSP430F5529的μc/os嵌入式實時操作系統(tǒng)移植

發(fā)布者:大酉幽華1 來源: eefocus關(guān)鍵字:MSP430F5529  μc  實時操作系統(tǒng)  移植 手機看文章 掃描二維碼
隨時隨地手機看文章

μc/os移植的條件

uCOS II的移植需要滿足以下要求: 

  1)處理器的C編譯器可以產(chǎn)生可重入代碼:可以使用C調(diào)用進入和退出Critical Code(臨界區(qū)代碼); 

  2)處理器必須支持硬件中斷,并且需要一個定時中斷源; 

  3)處理器需能容納一定數(shù)據(jù)的硬件堆棧; 

  4)處理器需有能在CPU寄存器與內(nèi)存和堆棧交換數(shù)據(jù)的指令。


移植需要完成的工作

CPU的接口部分(Ports)–需要移植的代碼部分 

匯編文件(OS_CPU_A.ASM)、處理器相關(guān)C文件(OS_CPU.H、OS_CPU_C.C)中相關(guān)函數(shù)和變量的聲明定義


OS_CPU_A.ASM文件改寫

OSStartHighRdy()    //OS啟動時調(diào)用,加載用戶最高優(yōu)先級的任務(wù) 

OSCtxSw()       //任務(wù)級調(diào)度 

OSIntCtxSw()      //中斷級調(diào)度 

OSTickISR()       //時鐘中斷響應(yīng),將檢測到延時結(jié)束的任務(wù)加入就緒隊列,


    .cdecls C, LIST, "msp430.h"


;用戶鉤子,對應(yīng)os_cpu_c.c中的HOOK函數(shù)

    .ref     OSIntExit

    .ref     OSIntNesting

    .ref     OSISRStkPtr

    .ref     OSPrioCur

    .ref     OSPrioHighRdy

    .ref     OSRunning

    .ref     OSTCBCur

    .ref     OSTCBHighRdy

    .ref     OSTaskSwHook

    .ref     OSTimeTick

;全局量

    .global  OSCtxSw

    .global  OSCPURestoreSR

    .global  OSCPUSaveSR

    .global  OSIntCtxSw

    .global  OSStartHighRdy

    .global  OSTickISR

;中斷使能操作之前保存SR,恢復(fù)中斷使能時CPU狀態(tài)不變

    .asmfunc            ;保存SR寄存器

OSCPUSaveSR:

    MOV.W       SR, R12

    DINT

    NOP

    RETA

    .endasmfunc


    .asmfunc            ;恢復(fù)SR寄存器,保持CPU狀態(tài)

OSCPURestoreSR:

    MOV.W       R12, SR

    NOP

    RETA

    .endasmfunc


    .asmfunc

;OS初始化后,準備運行時調(diào)用

;準備運行的最高優(yōu)先級的任務(wù)。任務(wù)就緒表第一個

;被OSStart()調(diào)用

OSStartHighRdy:

    CALLA       #OSTaskSwHook


    MOV.B       #1, &OSRunning          ; 內(nèi)核運行標(biāo)志


    MOVX.A      SP, &OSISRStkPtr        ; 保存中斷堆棧,系統(tǒng)堆棧


    MOVX.A      &OSTCBHighRdy, R13      ; 將最高優(yōu)先級任務(wù)準備

    MOVX.A      @R13, SP                ;將SP指向OSTCBHighRdy,即任務(wù)堆棧


    POPM.A      #12, R15



    RETI                                ; 模擬中斷,中斷退出應(yīng)執(zhí)行的內(nèi)容在OSISRStkPtr中

    .endasmfunc


    .asmfunc

;任務(wù)級上下文切換

OSCtxSw:

    POP.W       R12                     ;CALLA調(diào)用,當(dāng)前PC地址被壓入系統(tǒng)棧

    POP.W       R13                     ;這里使用的是擴展內(nèi)存地址,地址長度為20位


    PUSH.W      R12                     ;因此壓棧的寫法有變化


    RLAM.A      #4, R13                 

    RLAM.A      #4, R13

    RLAM.A      #4, R13

    MOVX.W      SR,  R12

    ADDX.A      R13, R12

    PUSH.W      R12                     ;保存PC和SR


    PUSHM.A     #12, R15                ; 保存上一個任務(wù)的上下文到它的任務(wù)堆棧


    MOVX.A      &OSTCBCur, R13          ;任務(wù)堆棧構(gòu)建完成

    MOVX.A      SP, 0(R13)              ;前一個任務(wù)的上下文保存


    CALLA       #OSTaskSwHook           ;用戶鉤子


    MOV.B       &OSPrioHighRdy, R13     ;切換任務(wù)

    MOV.B       R13, &OSPrioCur


    MOVX.A      &OSTCBHighRdy, R13      ;

    MOVX.A      R13, &OSTCBCur


    MOVX.A      @R13, SP                ; 堆棧寄存器指向任務(wù)堆棧


    POPM.A      #12, R15                ; 從任務(wù)PCB中恢復(fù)寄存器內(nèi)容,程序開始執(zhí)行


    RETI                                ; 從中斷返回

    .endasmfunc



;OSIntCtxSw()是唯一一個與編譯器相關(guān)的函數(shù),也是用戶問的最多的。

;中斷級上下文切換

;在此之前必須已經(jīng)對上下文內(nèi)容進行了保存

;由于中斷已經(jīng)發(fā)生,此處不需要再保存CPU寄存器

;OSIntCtxSw()需要調(diào)整堆棧指針,去掉堆棧中一些不需要的內(nèi)容,以使堆棧中只包含任務(wù)的運行環(huán)境

    .asmfunc

OSIntCtxSw:

    CALLA       #OSTaskSwHook


    MOV.B       &OSPrioHighRdy, R13

    MOV.B       R13, &OSPrioCur


    MOVX.A      &OSTCBHighRdy, R13

    MOVX.A      R13, &OSTCBCur


    MOVX.A      @R13, SP                ; 堆棧寄存器指向任務(wù)PCB


    POPM.A      #12, R15                ;從任務(wù)PCB中恢復(fù)寄存器內(nèi)容,程序開始執(zhí)行


    RETI                                ; 中斷返回

    .endasmfunc


;中斷服務(wù)程序中會執(zhí)行OSTimeTick()

;每進行一次中斷,OSTimeTick()都會遍歷所有掛起任務(wù)然后對有延時的任務(wù)控制塊TCB中的OSTCBDly減1

;這樣,當(dāng)延時減為0時,就會把減為0的任務(wù)在就緒表中進行注冊登記。

    .sect  ".text:_isr"                 ; 這個函數(shù)在中斷向量空間

    .asmfunc

;

OSTickISR:                              ;看門狗時鐘中斷

    PUSHM.A     #12, R15                ;保存寄存器內(nèi)容


    BIC.W       #0x01, &SFRIE1          ;禁止看門狗中斷


    CMP.B       #0, &OSIntNesting       ;無中斷嵌套,跳轉(zhuǎn)

    JNE         OSTickISR1              ;跳轉(zhuǎn)到下面的模塊


    MOVX.A      &OSTCBCur, R13          ;保存任務(wù)堆棧

    MOVX.A      SP, 0(R13)


    MOVX.A      &OSISRStkPtr, SP        ;加載中斷堆棧

;只有當(dāng)中斷全部執(zhí)行完畢,

OSTickISR1:

    INC.B       &OSIntNesting           ;產(chǎn)生了一個時鐘中斷


    BIS.W       #0x01, &SFRIE1          ; 禁止看門狗

    NOP


    EINT                                ; 允許中斷嵌套

    NOP


    CALLA       #OSTimeTick             ; 調(diào)用節(jié)拍處理函數(shù)


    DINT                                ; 一般禁用中斷之前調(diào)用OSIntExit()

    NOP


    CALLA       #OSIntExit              ;退出中斷


    CMP.B       #0, &OSIntNesting       ;中斷無嵌套時,跳轉(zhuǎn)

    JNE         OSTickISR2


    MOVX.A      &OSTCBHighRdy, R13      ;恢復(fù)任務(wù)堆棧寄存器

    MOVX.A      @R13, SP



OSTickISR2:

    POPM.A      #12, R15

    RETI                                ; 從中斷中返回

    .endasmfunc


    .sect   WDT_VECTOR

    .short  OSTickISR                   ; 中斷向量,看門狗定時器模式


    .end


OS_CPU_A.ASM中與MSP430硬件機制相關(guān)的部分

1.MSP430單片機有R0~R15十六個通用寄存器,其中PC占用R0,SP占用R1,SR占用R3,因此,切換任務(wù)時有16個寄存器值需要保存。

2.MSP430開關(guān)中斷

_EINT開總中斷 

DINT關(guān)總中斷


3.中斷處理流程

任何當(dāng)前執(zhí)行的指令完成。

指向下一條指令的PC 被壓入堆棧。

SR 被壓入堆棧。

如果在最后一個指令執(zhí)行期間由多個中斷出現(xiàn),那么具有最高優(yōu)先級的中斷被選中并等待被處理。

在單一源標(biāo)志上,中斷請求標(biāo)志自動復(fù)位。對于軟件處理,多個源標(biāo)志保持被設(shè)定。

SR 被清除。這將終止任何低功耗模式。由于GIE 位被清除,之后的中斷被禁用。

中斷矢量的內(nèi)容被載入到PC:程序繼續(xù)在中斷處理例程所處的地址上執(zhí)行。

4.中斷處理程序由以下指令終止:

RETI(從中斷處理例程返回)


5.時鐘中斷源時鐘的選擇

在這里使用的是看門狗時鐘那么相應(yīng)的也要打開看門時鐘的中斷,但是不要錯誤的把看門狗設(shè)置成安全模式,這樣會造成系統(tǒng)反復(fù)重啟


6.MSP430為16位單片機,堆棧是向下生長

os_cpu_c.c文件的改寫

μC/OS-II 的移植需要用戶改寫OS_CPU_C.C中的六個函數(shù): 

OSTaskStkInit() 

OSTaskCreateHook() 

OSTaskDelHook() 

OSTaskSwHook() 

OSTaskStatHook() 

OSTimeTickHook() 

實際需要修改的只有OSTaskStkInit()函數(shù),其他五個函數(shù)需要聲明,但不一定有實際內(nèi)容。這五個函數(shù)都是用戶定義的對操作系統(tǒng)功能的擴展 

其他的鉤子函數(shù)已經(jīng)嵌入到系統(tǒng),會在操作系統(tǒng)執(zhí)行某些操作時被調(diào)用,可以通過os_cfg.h來配置讓系統(tǒng)不使用這些鉤子


/*

 * os_cpu.c

 *

 *  Created on: 2016年11月20日

 *      Author: Tom

 */

#define  OS_CPU_GLOBALS


#include "ucos_ii.h"




#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203

void  OSInitHookBegin (void)    //進入OSInit()函數(shù)后,OSInitHookBegin就會被調(diào)用

{

}

#endif


#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203

void  OSInitHookEnd (void)      //:OSInitHookEnd與OSInitHookBegin相似,

{

}

#endif


#if OS_CPU_HOOKS_EN > 0

void  OSTaskCreateHook (OS_TCB *ptcb)   //OS_TCBInit會調(diào)用OSTaskCreateHook

{

    ptcb = ptcb;                       /* 防止編譯警告                                         */

}

#endif


#if OS_CPU_HOOKS_EN > 0

void  OSTaskDelHook (OS_TCB *ptcb)  //OSTaskDel()會調(diào)用OSTaskDelHook(ptcb)

{

    ptcb = ptcb;                       /* 防止編譯警告                                     */

[1] [2]
關(guān)鍵字:MSP430F5529  μc  實時操作系統(tǒng)  移植 引用地址:基于MSP430F5529的μc/os嵌入式實時操作系統(tǒng)移植

上一篇:MSP430時鐘模塊詳解
下一篇:MSP430F149學(xué)習(xí)筆記——時鐘

推薦閱讀

集微網(wǎng)消息,早前國外知名爆料人Roland Quandt就透露,大約幾個月前,華碩想在手機中整合10GB RAM,最后沒有做成,因為PoP封裝,即SoC和內(nèi)存/閃存在一起的方案導(dǎo)致空間受限,畢竟尚未有單芯片10GB的LPDDR4方案公布。華碩整合10GB內(nèi)存失敗了,沒想到居然還有手機廠商不放棄,繼續(xù)打著10GB內(nèi)存的主意,這個手機廠商便是有“國際大廠”之稱的OPPO,而且OPPO...
10月17日,國際智能制造聯(lián)盟(籌)(ICIM)、中國科協(xié)智能制造學(xué)會聯(lián)合體(IMAC)聯(lián)合發(fā)布了“2019世界智能制造十大科技進展”、“2019中國智能制造十大科技進展”名單。其中,??怂箍礢MART Quality智慧質(zhì)量信息化管理系統(tǒng)經(jīng)由中國科學(xué)技術(shù)協(xié)會智能制造學(xué)會聯(lián)合體13家成員學(xué)會共同推薦、遴選,成功入選“2019世界智能制造十大科技進展”。 入選的方案主...
iPhone 12 系列已經(jīng)陸續(xù)送達消費者手中,有外媒對其進行了初步續(xù)航測試。結(jié)果顯示,全程開啟 5G 的 iPhone 12 續(xù)航要比開啟 4G 短 2 個小時。iPhone 12 的電池容量已經(jīng)曝光,為 2851mAh,相比去年 iPhone 11 的 3110mAh 少了 10% 左右。官網(wǎng)結(jié)果顯示,iPhone 11 與 iPhone 12 的續(xù)航時間一致,均為 17 小時視頻播放時間以及...
網(wǎng)絡(luò)分析儀是一種功能強大的測試測量的儀器儀表,只要按照流量正確使用和操作,可以達到極高的精度,它通過使用自身的信號源來進行比對和測量其他電子設(shè)備、電子元器件、電子零件、網(wǎng)絡(luò)接頭、電纜線等電氣特性和性能參數(shù)是否符合標(biāo)準和要求,能精確地測量入射波、反射波、傳輸波中的幅度和相位信息,通過比值測量法定量描述被測器件的反射和傳輸特性。它的...

史海拾趣

問答坊 | AI 解惑

15分鐘快速充電器產(chǎn)品介紹

產(chǎn) 品 介 紹 CK6501 “速霸”15分鐘充電器套裝                                ...…

查看全部問答∨

keil中文教程

希望對大家有幫助…

查看全部問答∨

【藏書閣】傳感器與自動檢測技術(shù)演示教程

內(nèi)容包括: 第01,2章 傳感與檢測基礎(chǔ),概述 24頁 第03章 應(yīng)變式傳感器 57頁 第04章 電感式傳感器 89頁 第05章 電容式傳感器 58頁 第06章 壓電式傳感器 43頁 第07章 磁電式傳感器 12頁 第08章 光電式傳感器 109頁 第09章 半導(dǎo)體傳感器 69頁 ...…

查看全部問答∨

wicne中的file0000.chk垃圾文件

系統(tǒng)是 2440 + PB5.0 構(gòu)成的    在拷貝文件時候  關(guān)機重啟就會產(chǎn)生file0000.chk 。。。。。。文件 要如何才能修復(fù)吶  ?  等高手指點迷經(jīng) …

查看全部問答∨

串口驅(qū)動問題

現(xiàn)在我要寫串口的驅(qū)動,我看了串口驅(qū)動的相關(guān)資料,發(fā)現(xiàn)COM_IOControl、COM_Open、COM_Close,等函數(shù)都在MDD層里定義了,那我現(xiàn)在還要寫什么函數(shù)呢?是不是配置GPIO口為串口,時鐘設(shè)置,判斷那個串口然后調(diào)用MDD里的相關(guān)函數(shù)呢?…

查看全部問答∨

WGM-12864B單色圖形點陣液晶顯示模塊 出售 練手,作產(chǎn)品俱佳?。。?!

從程序員走向經(jīng)商,第一仗就敗了 變賣自己的 一點血汗,希望能重振旗鼓 近來的 兄弟麻煩幫忙頂一下 沒什么好回報的 只能給您一點微不足道的分數(shù) 家里有將近2萬塊WGM-12864B單色圖形點陣液晶顯示模塊(牌子是“風(fēng)華”的) 適用于 嵌入式設(shè)計的小 ...…

查看全部問答∨

誰幫忙推薦一個深圳ST的代理商

                                 誰幫忙推薦一個深圳ST的代理商,最好有技術(shù)支持的,找了幾個感覺沒什么技術(shù)支持的實力,打電話很難找到人,要不半 ...…

查看全部問答∨

stm8s可以實現(xiàn)pwm嗎?

                                 stm8s驅(qū)動H橋,可以實現(xiàn)單極性和雙極性嗎?…

查看全部問答∨

RC相移震蕩電路不振, 求助!

謝謝大家?guī)兔?!最近做一個相移震蕩電路, 在multisim上仿真是可以振蕩的   但實際電路就是不振。 這是仿真短路圖. …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved