日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]在“51操作系統(tǒng)學(xué)習(xí)筆記(一)”里,已經(jīng)掌握了并行多任務(wù)的實(shí)現(xiàn),和利用修改sp內(nèi)容,子程序結(jié)束調(diào)用ret來(lái)實(shí)現(xiàn)程序跳轉(zhuǎn)。但程序沒(méi)有涉及中斷,任務(wù)中有中斷,程序會(huì)失去控制。這一單元,要學(xué)習(xí)帶中斷問(wèn)題的多任務(wù)操作系

在“51操作系統(tǒng)學(xué)習(xí)筆記(一)”里,已經(jīng)掌握了并行多任務(wù)的實(shí)現(xiàn),和利用修改sp內(nèi)容,子程序結(jié)束調(diào)用ret來(lái)實(shí)現(xiàn)程序跳轉(zhuǎn)。但程序沒(méi)有涉及中斷,任務(wù)中有中斷,程序會(huì)失去控制。

這一單元,要學(xué)習(xí)帶中斷問(wèn)題的多任務(wù)操作系統(tǒng):"在51單片機(jī)下具有延時(shí)功能占先式內(nèi)核的操作系統(tǒng)"

在網(wǎng)上找的這個(gè)程序比較簡(jiǎn)短,也符合本單元的學(xué)習(xí)任務(wù)。

不過(guò)有一個(gè)麻煩,這個(gè)程序用到了52擴(kuò)展的一些功能,需要先學(xué)習(xí)89c52單片機(jī)的一些寄存器和計(jì)數(shù)器使用。

全部源代碼如下:程序詳細(xì)講解,和源自于http://www.51hei.com/mcu/1325.html

//可以直接拷貝到keil中調(diào)試

#include

#define MAX_TASKS 5

typedef struct os_task_control_table {
unsigned char os_task_wait_tick;
unsigned char os_task_stack_top;
}TCB;

volatile unsigned char int_count;
volatile unsigned char os_en_cr_count;
#define enter_int() EA=0;int_count++;
#define os_enter_critical() EA=0;os_en_cr_count++;//關(guān)中斷,關(guān)中斷次數(shù)增加1
#define os_exit_critical() if(os_en_cr_count>=1){os_en_cr_count--;if(os_en_cr_count==0)EA=1;} //關(guān)閉中斷
unsigned char code os_map_tbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};//任務(wù)的狀態(tài)字

volatile unsigned char os_task_int_tbl;//任務(wù)中斷表
idata volatile TCB os_tcb[MAX_TASKS];//任務(wù)控制表數(shù)組
volatile unsigned char os_task_running_id;
volatile unsigned char os_task_rdy_tbl;//任務(wù)準(zhǔn)備
unsigned char idata os_task_stack[MAX_TASKS][20];//任務(wù)堆棧,每個(gè)任務(wù)有20字節(jié)的堆棧

void os_init(void);
void os_task_create(unsigned char task_id ,unsigned int task_point,unsigned char stack_point);
void os_delay(unsigned char ticks);
void os_start(void);
void os_task_switch(void);
void exit_int(void);


//操作系統(tǒng)初始化
void os_init(void) {
EA = 0; //關(guān)閉中斷
ET2 = 1;
T2CON = 0X00;
T2MOD = 0X00; //關(guān)計(jì)數(shù)器
RCAP2H = 0x0D8;
RCAP2L = 0x0F0; //計(jì)數(shù)器2的初始化
os_task_rdy_tbl = 0; //
os_task_int_tbl = 0xff; //中斷
int_count = 0; //中斷的次數(shù)
os_en_cr_count = 0; //關(guān)閉中斷的次數(shù)
}


//任務(wù)加載
void os_task_create(unsigned char task_id ,unsigned int task_point,unsigned char stack_point) {
os_enter_critical();//關(guān)中斷,程序段中不能被打斷
((unsigned char idata *)stack_point)[0] = task_point;//task_point是16位的,把任務(wù)的程序地址記錄下來(lái)
((unsigned char idata *)stack_point)[1] = task_point>>8;//右移8位,高位地址在上面
os_tcb[task_id].os_task_stack_top = stack_point+14;//堆棧結(jié)構(gòu):有兩字節(jié)程序地址,13字節(jié)的其他數(shù)據(jù),所以棧頂部是加14(0-14)
os_task_rdy_tbl |= os_map_tbl[task_id];//任務(wù)的狀態(tài)就緒
os_tcb[task_id].os_task_wait_tick = 0;//裝載任務(wù),任務(wù)的等待時(shí)間就是0
os_exit_critical(); //開(kāi)中斷
}

//系統(tǒng)延時(shí)
void os_delay(unsigned char ticks) {
os_enter_critical();//
os_tcb[os_task_running_id].os_task_wait_tick = ticks;
os_task_rdy_tbl &= ~os_map_tbl[os_task_running_id];
os_exit_critical();
os_task_switch(); //換下一個(gè)任務(wù)
}


//任務(wù)開(kāi)始
void os_start(void) {
os_task_running_id = 0; //由任務(wù)0開(kāi)始
os_tcb[os_task_running_id].os_task_stack_top -= 13; //堆棧頂跳到任務(wù)一的程序地址處的堆棧
EA = 1; //開(kāi)中斷
SP = os_tcb[os_task_running_id].os_task_stack_top; //把任務(wù)一的程序地址給sp
TR2 = 1; //T2計(jì)數(shù)器打開(kāi),該計(jì)數(shù)器是52擴(kuò)展的計(jì)數(shù)器
} //os_start(void)執(zhí)行完,就實(shí)現(xiàn)RET,sp的內(nèi)容賦給pc,會(huì)接著執(zhí)行任務(wù)一


//任務(wù)轉(zhuǎn)換
void os_task_switch(void) {
unsigned char i;
EA = 0;
os_tcb[os_task_running_id].os_task_stack_top = SP;
os_task_int_tbl &= ~os_map_tbl[os_task_running_id];
for(i=0; iif(os_task_rdy_tbl&os_map_tbl[i]) {
break;
}
}
os_task_running_id = i;
SP = os_tcb[os_task_running_id].os_task_stack_top;
if(os_task_int_tbl&os_map_tbl[os_task_running_id]) {
__asm POP 7 //Keil51的中斷處理會(huì)先讓這13個(gè)寄存器入棧,所以這里要出棧
__asm POP 6

__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL //13字節(jié)堆棧
__asm POP DPH
__asm POP B
__asm POP ACC
}
EA = 1;
__asm RETI //從中斷服務(wù)返回主程序
}


//中斷結(jié)束
void exit_int(void) {
unsigned char i;
SP -= 2;

if(--int_count == 0)
{ //如果中斷數(shù)=0
os_tcb[os_task_running_id].os_task_stack_top = SP;
os_task_int_tbl |= os_map_tbl[os_task_running_id];
for(i=0; i { //順序檢查任務(wù)是否準(zhǔn)備好
if(os_task_rdy_tbl&os_map_tbl[i])
{
break;
}
}
os_task_running_id = i; //把就緒的任務(wù)號(hào)給任務(wù)運(yùn)行號(hào)碼
SP = os_tcb[os_task_running_id].os_task_stack_top; //堆棧指向運(yùn)行任務(wù)
if(os_task_int_tbl&os_map_tbl[os_task_running_id])
{
__asm POP 7
__asm POP 6 //恢復(fù)任務(wù)寄存器
__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL
__asm POP DPH
__asm POP B
__asm POP ACC
}
EA = 1;
__asm RETI
}

//如果中斷數(shù)還不為0
__asm POP 7
__asm POP 6 //恢復(fù)任務(wù)寄存器
__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL
__asm POP DPH
__asm POP B
__asm POP ACC
EA=1;
__asm RETI //計(jì)數(shù)器2中斷服務(wù)程序結(jié)束,返回主程序
}


//滴答中斷程序,計(jì)數(shù)器2的中斷
void timer2_isr(void) interrupt 5 {
unsigned char i;
TF2=0;
enter_int();
for(i=0; iif(os_tcb[i].os_task_wait_tick) {
os_tcb[i].os_task_wait_tick--;
if(os_tcb[i].os_task_wait_tick == 0) {
os_task_rdy_tbl |= os_map_tbl[i];
}
}
}
exit_int(); //
}


//下面是任務(wù)實(shí)現(xiàn)代碼
void task_0(void) { //空循環(huán)
while(1) {

}
}

sbit seg2 = P2^5;
sbit seg3 = P2^6;
sbit seg4 = P2^7;

void delay_ms(unsigned int xms){ //只是程序延時(shí)
unsigned int x,y;
for(x=xms; x>0; x--)
for(y=248; y>0; y--);
}

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};

void task_1(void) { //提取task_2的等待時(shí)間,顯示在數(shù)碼管上
unsigned char gw,sw,bw;
while(1) {
bw = os_tcb[2].os_task_wait_tick/100;
sw = os_tcb[2].os_task_wait_tick%100/10;
gw = os_tcb[2].os_task_wait_tick%10;
P0 = table[bw];
seg2=0;
delay_ms(3);
seg2=1;
P0 = table[sw];
seg3=0;
delay_ms(3);
seg3=1;
P0 = table[gw];
seg4=0;
delay_ms(3);
seg4=1;
}
}

void task_2(void) {
unsigned char i;
while(1) {
i++;
P3 = 0x01<<(i%8);
os_delay(200);
}
}

void task_3(void) {
unsigned char i;
while(1) {
i++;
//P2 = 0x01<<(i%8);
os_delay(7);
}
}

void task_4(void) {
unsigned char i;
while(1) {
i++;
P1 = 0x01<<(i%8);
os_delay(10);
}
}


void main(void) {
os_init();
os_task_create(4,(unsigned int)&task_0,(unsigned char)os_task_stack[4]);
os_task_create(3,(unsigned int)&task_1,(unsigned char)os_task_stack[3]);
os_task_create(2,(unsigned int)&task_2,(unsigned char)os_task_stack[2]);
os_task_create(1,(unsigned int)&task_3,(unsigned char)os_task_stack[1]);
os_task_create(0,(unsigned int)&task_4,(unsigned char)os_task_stack[0]);
os_start();
}


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

北京 2025年7月3日 /美通社/ -- 近日,北京積算科技有限公司(以下簡(jiǎn)稱(chēng)"積算科技")正式推出GPU裸金屬算力服務(wù)套件,幫助客戶(hù)實(shí)現(xiàn)并行環(huán)境的分鐘級(jí)部署與出廠級(jí)性能校準(zhǔn),在GPU裸金屬算力上...

關(guān)鍵字: 金屬 GPU 性能優(yōu)化 操作系統(tǒng)

上海 2025年5月20日 /美通社/ -- 2025年5月15日至18日,全球神經(jīng)介入領(lǐng)域頂級(jí)盛會(huì)——世界神經(jīng)介入治療大會(huì)(WLNC)暨東方腦血管病大會(huì)(OCIN)于上海國(guó)際會(huì)議中心隆重舉行,吸引了來(lái)自全球神經(jīng)介入領(lǐng)...

關(guān)鍵字: 機(jī)器人 VI AN 操作系統(tǒng)

Docker 是一種基于操作系統(tǒng)層級(jí)的虛擬化技術(shù),它將軟件及其依賴(lài)項(xiàng)打包為容器,使得應(yīng)用程序可以在任何支持 Docker 的環(huán)境中運(yùn)行。

關(guān)鍵字: Docker 操作系統(tǒng)

北京2025年2月28日 /美通社/ -- 日前,《服務(wù)器操作系統(tǒng)遷移指南》(以下簡(jiǎn)稱(chēng)《指南》)經(jīng)中國(guó)電子工業(yè)標(biāo)準(zhǔn)化技術(shù)協(xié)會(huì)批準(zhǔn)后正式發(fā)布,將于3月正式實(shí)施?!吨改稀酚衫顺毙畔款^,中國(guó)電子技術(shù)標(biāo)準(zhǔn)化研究院、阿里云、統(tǒng)信...

關(guān)鍵字: 操作系統(tǒng) 編寫(xiě) CPU 內(nèi)存

業(yè)界最真實(shí)、最互聯(lián)、最具未來(lái)性的操作系統(tǒng)變得更智能、更快速、更敏銳 紐約2025年1月30日 ?/PRNewswire/ -- Stagwell(納斯達(dá)克股票代碼:STGW...

關(guān)鍵字: ASSEMBLY STAGE AI 操作系統(tǒng)

在Linux操作系統(tǒng)中,文件操作是進(jìn)程與存儲(chǔ)系統(tǒng)交互的重要方式。對(duì)于同一個(gè)文件,一個(gè)進(jìn)程是否可以在其生命周期內(nèi)多次調(diào)用open函數(shù)打開(kāi)它,并進(jìn)行讀寫(xiě)操作呢?答案是肯定的。本文將深入探討這一機(jī)制,并通過(guò)代碼示例展示如何在進(jìn)...

關(guān)鍵字: 文件 Linux 操作系統(tǒng)

北京2025年1月20日 /美通社/ -- 近日,微展世(北京)數(shù)字科技有限公司(簡(jiǎn)稱(chēng)"微展世")在北京成功舉辦了2025產(chǎn)品發(fā)布與戰(zhàn)略簽約盛典。作為微展世的重要戰(zhàn)略合作伙伴,軟通動(dòng)力及其子公司鴻湖萬(wàn)...

關(guān)鍵字: 開(kāi)源 操作系統(tǒng) 鴻蒙 OS

北京2025年1月16日 /美通社/ -- 軟硬一體具身智能人形機(jī)器人是未來(lái)智能產(chǎn)業(yè)的重大機(jī)遇,大模型智能體應(yīng)用在千行百業(yè)深入廣泛推進(jìn),世界模型、具身智能也正加快從實(shí)驗(yàn)室走向場(chǎng)景應(yīng)用和商業(yè)落地。軟通動(dòng)力聚焦人形機(jī)器人場(chǎng)景...

關(guān)鍵字: 機(jī)器人 模型 智能計(jì)算 操作系統(tǒng)

拉斯維加斯2025年1月11日 /美通社/ -- 2025年1月8日,于拉斯維加斯舉辦的消費(fèi)電子展(CES)上,全球AI跨語(yǔ)言溝通設(shè)備領(lǐng)導(dǎo)品牌時(shí)空壺,正式發(fā)布Timekett...

關(guān)鍵字: 操作系統(tǒng) BLE OS CE

以開(kāi)源鴻蒙賦能工業(yè)創(chuàng)新升級(jí) 北京2025年1月10日 /美通社/ -- 1月7日,軟通動(dòng)力攜子公司鴻湖萬(wàn)聯(lián),與微展世(北京)數(shù)字科技有限公司(簡(jiǎn)稱(chēng)"微展世")在廣州簽署戰(zhàn)略合作協(xié)議,三方將聯(lián)合開(kāi)發(fā)基...

關(guān)鍵字: 操作系統(tǒng) 開(kāi)源 數(shù)字化 OS
關(guān)閉