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

正文內(nèi)容

建立一個屬于自己的avr的rtos[1](編輯修改稿)

2025-07-22 08:24 本頁面
 

【文章內(nèi)容簡介】 的例子中,一切變得很簡單,三個正在運行的主任務(wù),都通過延時服務(wù),主動放棄對CPU的控制權(quán)。 在時間中斷中,對各個任務(wù)的的延時進行計時,如果某個任務(wù)的延時結(jié)束,將任務(wù)重新在就緒表中置位。 最低級的系統(tǒng)任務(wù)TaskScheduler(),在三個主任務(wù)在放棄對CPU的控制權(quán)后開始不斷地進行調(diào)度。如果某個任務(wù)在就緒表中置位,通過調(diào)度,進入最高級別的任務(wù)中繼續(xù)運行。 第五篇: 完善的協(xié)作式的內(nèi)核 現(xiàn)在為上面的協(xié)作式內(nèi)核添加一些OS中所必須的服務(wù): 1 掛起和重新運行任務(wù) 2 信號量(在必要時候,可以擴展成郵箱和信息隊列) 3 延時 include avr/ include avr/ include avr/ unsigned char Stack[400]。 register unsigned char OSRdyTbl asm(r2)。 //任務(wù)運行就緒表 register unsigned char OSTaskRunningPrio asm(r3)。 //正在運行的任務(wù) define OS_TASKS 3 //設(shè)定運行任務(wù)的數(shù)量 struct TaskCtrBlock { unsigned int OSTaskStackTop。 //保存任務(wù)的堆棧頂 unsigned int OSWaitTick。 //任務(wù)延時時鐘 } TCB[OS_TASKS+1]。 //防止被編譯器占用 register unsigned char tempR4 asm(r4)。 register unsigned char tempR5 asm(r5)。 register unsigned char tempR6 asm(r6)。 register unsigned char tempR7 asm(r7)。 register unsigned char tempR8 asm(r8)。 register unsigned char tempR9 asm(r9)。 register unsigned char tempR10 asm(r10)。 register unsigned char tempR11 asm(r11)。 register unsigned char tempR12 asm(r12)。 register unsigned char tempR13 asm(r13)。 register unsigned char tempR14 asm(r14)。 register unsigned char tempR15 asm(r15)。 register unsigned char tempR16 asm(r16)。 register unsigned char tempR16 asm(r17)。 //建立任務(wù) void OSTaskCreate(void (*Task)(void),unsigned char *Stack,unsigned char TaskID) { unsigned char i。 *Stack=(unsigned int)Task8。 //將任務(wù)的地址高位壓入堆棧, *Stack=(unsigned int)Task。 //將任務(wù)的地址低位壓入堆棧, *Stack=0x00。 //R1 __zero_reg__ *Stack=0x00。 //R0 __tmp_reg__ *Stack=0x80。 //SREG 在任務(wù)中,開啟全局中斷 for(i=0。i14。i++) //在 avr libc 中的 FAQ中的 What registers are used by the C piler? *Stack=i。 //描述了寄存器的作用 TCB[TaskID].OSTaskStackTop=(unsigned int)Stack。 //將人工堆棧的棧頂,保存到堆棧的數(shù)組中 OSRdyTbl|=0x01TaskID。 //任務(wù)就緒表已經(jīng)準(zhǔn)備好 } //開始任務(wù)調(diào)度,從最低優(yōu)先級的任務(wù)的開始 void OSStartTask() { OSTaskRunningPrio=OS_TASKS。 SP=TCB[OS_TASKS].OSTaskStackTop+17。 __asm__ __volatile__( reti \n\t )。 } //進行任務(wù)調(diào)度 void OSSched(void) { // 根據(jù)中斷時保存寄存器的次序入棧,模擬一次中斷后,入棧的情況 __asm__ __volatile__(PUSH __zero_reg__ \n\t)。 //R1 __asm__ __volatile__(PUSH __tmp_reg__ \n\t)。 //R0 __asm__ __volatile__(IN __tmp_reg__,__SREG__ \n\t)。 //保存狀態(tài)寄存器SREG __asm__ __volatile__(PUSH __tmp_reg__ \n\t)。 __asm__ __volatile__(CLR __zero_reg__ \n\t)。 //R0重新清零 __asm__ __volatile__(PUSH R18 \n\t)。 __asm__ __volatile__(PUSH R19 \n\t)。 __asm__ __volatile__(PUSH R20 \n\t)。 __asm__ __volatile__(PUSH R21 \n\t)。 __asm__ __volatile__(PUSH R22 \n\t)。 __asm__ __volatile__(PUSH R23 \n\t)。 __asm__ __volatile__(PUSH R24 \n\t)。 __asm__ __volatile__(PUSH R25 \n\t)。 __asm__ __volatile__(PUSH R26 \n\t)。 __asm__ __volatile__(PUSH R27 \n\t)。 __asm__ __volatile__(PUSH R30 \n\t)。 __asm__ __volatile__(PUSH R31 \n\t)。 __asm__ __volatile__(PUSH R28 \n\t)。 //R28與R29用于建立在堆棧上的指針 __asm__ __volatile__(PUSH R29 \n\t)。 //入棧完成 TCB[OSTaskRunningPrio]. OSTaskStackTop=SP。 //將正在運行的任務(wù)的堆棧底保存 unsigned char OSNextTaskID。 //在現(xiàn)有堆棧上開設(shè)新的空間 for (OSNextTaskID = 0。 //進行任務(wù)調(diào)度 OSNextTaskID OS_TASKS amp。amp。 !(OSRdyTbl amp。 (0x01OSNextTaskID))。 OSNextTaskID++)。 OSTaskRunningPrio = OSNextTaskID 。 cli()。 //保護堆棧轉(zhuǎn)換 SP=TCB[OSTaskRunningPrio].OSTaskStackTop。 sei()。 //根據(jù)中斷時的出棧次序 __asm__ __volatile__(POP R29 \n\t)。 __asm__ __volatile__(POP R28 \n\t)。 __asm__ __volatile__(POP R31 \n\t)。 __asm__ __volatile__(POP R30 \n\t)。 __asm__ __volatile__(POP R27 \n\t)。 __asm__ __volatile__(POP R26 \n\t)。 __asm__ __volatile__(POP R25 \n\t)。 __asm__ __volatile__(POP R24 \n\t)。 __asm__ __volatile__(POP R23 \n\t)。 __asm__ __volatile__(POP R22 \n\t)。 __asm__ __volatile__(POP R21 \n\t)。 __asm__ __volatile__(POP R20 \n\t)。 __asm__ __volatile__(POP R19 \n\t)。 __asm__ __volatile__(POP R18 \n\t)。 __asm__ __volatile__(POP __tmp_reg__ \n\t)。 //SERG 出棧并恢復(fù) __asm__ __volatile__(OUT __SREG__,__tmp_reg__ \n\t)。 // __asm__ __volatile__(POP __tmp_reg__ \n\t)。 //R0 出棧 __asm__ __volatile__(POP __zero_reg__ \ n\t)。 //R1 出棧 //中斷時出棧完成 } ////////////////////////////////////////////任務(wù)處理 //掛起任務(wù) void OSTaskSuspend(unsigned char prio) { TCB[prio].OSWaitTick=0。 OSRdyTbl amp。= ~(0x01prio)。 //從任務(wù)就緒表上去除標(biāo)志位 if(OSTaskRunningPrio==prio) //當(dāng)要掛起的任務(wù)為當(dāng)前任務(wù) OSSched()。 //從新調(diào)度 } //恢復(fù)任務(wù) 可以讓被OSTaskSuspend或 OSTimeDly暫停的任務(wù)恢復(fù) void OSTaskResume(unsigned char prio) { OSRdyTbl |= 0x01prio。 //從任務(wù)就緒表上重置標(biāo)志位 TCB[prio].OSWaitTick=0。 //將時間計時設(shè)為0,到時 if(OSTaskRunningPrioprio) //當(dāng)要當(dāng)前任務(wù)的優(yōu)先級低于重置位的任務(wù)的優(yōu)先級 OSSched()。 //從新調(diào)度 //從新調(diào)度 } // 任務(wù)延時 void OSTimeDly(unsigned int ticks) { if(ticks) //當(dāng)延時有效 { OSRdyTbl amp。= ~(0x01OSTaskRunningPrio)。 TCB[OSTaskRunningPrio].OSWaitTick=ticks。 OSSched()。 //從新調(diào)度 } } //信號量 struct SemBlk { unsigned char OSEventType。 //型號 0,信號量獨占型;1信號量共享型 unsigned char OSEventState。 //狀態(tài) 0,不可用。1,可用 unsigned char OSTaskPendTbl。 //等待信號量的任務(wù)列表 } Sem[10]。 //初始化信號量 void OSSemCreat(unsigned char Index,unsigned char Type) { Sem
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1