国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

手寫嵌入式操作系統(tǒng)(基于stm8單片機(jī))

這篇具有很好參考價(jià)值的文章主要介紹了手寫嵌入式操作系統(tǒng)(基于stm8單片機(jī))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

#include <stc8h.h>
#include <intrins.h>
#define MAX_TASKS 2 //簡化方面,我們當(dāng)前操作系統(tǒng)只有2個(gè)task
#define MAX_TASK_DEP 32

unsigned char idata task_sp[MAX_TASKS];  // 任務(wù)的堆棧指針
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];// 每個(gè)一個(gè)task任務(wù)的堆棧
unsigned char task_id; //當(dāng)前任務(wù)號(hào), 從0開始。

//任務(wù)狀態(tài)
typedef enum{
	TASK_RUNNING, //運(yùn)行狀態(tài)
	TASK_SUSPENDED  //掛起狀態(tài)
} TaskStatus;


typedef struct{
	  unsigned char id; //任務(wù)id
	  TaskStatus status; //任務(wù)狀態(tài)
	  unsigned int delay_count; // 延遲計(jì)數(shù)器
	  unsigned int delay_duration;//延遲時(shí)間
}Task ;

Task idata tasks[MAX_TASKS] = {
	{0, TASK_RUNNING,0,0},
	{1, TASK_RUNNING,0,0},   //兩個(gè)任務(wù),都是默認(rèn)運(yùn)行狀態(tài),不延時(shí),
};

void Timer0_init(void); //原型函數(shù) 
void sleep(unsigned int , unsigned int );// tid, delay_ms

void sleep(unsigned int task_id , unsigned int delay_ms){
   	tasks[task_id].status = TASK_SUSPENDED;
	  tasks[task_id].delay_count = 0;
	  tasks[task_id].delay_duration = delay_ms;
	
}

void Timer0_init(){
   AUXR |= 0x80;		//定時(shí)器時(shí)鐘1T模式
		TMOD &= 0xF0;		//設(shè)置定時(shí)器模式
    EA = 1; // 全局中斷允許
    ET0 = 1; // 定時(shí)器0中斷允許
	  TR0 = 1;		//定時(shí)器0開始計(jì)時(shí)
	TL0 = 0x40;		//設(shè)置定時(shí)初始值
		TH0 = 0xA2;		//設(shè)置定時(shí)初始值
	
}


void Delay1000ms()		//@24.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 122;
	j = 193;
	k = 128;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


//定義一個(gè)任務(wù)切換的函數(shù)(任務(wù)調(diào)度器)
void task_switch(){
	
	 task_sp[task_id] = SP;// 把當(dāng)前系統(tǒng)的堆棧指針存入到某個(gè)小朋友的task_sp里面。
	
	 task_id = task_id + 1; //任務(wù)加1
	 if(task_id == MAX_TASKS){	 
		 task_id = 0;
	 } 
	 SP = task_sp[task_id];
}



void task0(){
	//第0號(hào)任務(wù), 代表第0個(gè)小朋友做的事情。
	//static unsigned int a = 3;
	P5M0 = 0x00;
  P5M1 = 0x00;
	
  P53 = 1;
	while(1){
		//a = a + 3;
		//Delay1000ms();
		//檢查自己的狀態(tài)。如果自己是睡眠狀態(tài),就應(yīng)該交給別的task去執(zhí)行
		if(tasks[0].status == TASK_SUSPENDED){
			task_switch();
			continue;
		}
		
		sleep(0,1000);
		P53 = ~P53;
		task_switch();
	}
}

void task1(){
	//第1號(hào)任務(wù), 代表第1個(gè)小朋友做的事情。
	//static unsigned int b = 5;
	P4M1 = 0x00;
	P4M0 = 0x00;
	P2M1 = 0x00;
	P2M0 = 0x00;
	P27 = 0;
	
	
	while(1){
				//檢查自己的狀態(tài)。如果自己是睡眠狀態(tài),就應(yīng)該交給別的task去執(zhí)行
		if(tasks[1].status == TASK_SUSPENDED){
			task_switch();
			continue;
		}
		//b = b + 5;
		//Delay1000ms();
		sleep(1,1000);
    P27 = ~P27;	
		task_switch();
	}
}


void Timer0_ISR(void) interrupt 1 {
	//系統(tǒng)的定時(shí)器中斷, 每隔1毫秒就執(zhí)行一下中斷函數(shù)
	 unsigned char i;
	  
	 for(i =0 ;i<MAX_TASKS;i++){
		  if(tasks[i].status == TASK_SUSPENDED){
				tasks[i].delay_count++;
			}
		  
			if(tasks[i].delay_count >= tasks[i].delay_duration){
				tasks[i].status = TASK_RUNNING; //睡眠結(jié)束		 
				tasks[i].delay_count = 0;
			}
		 
	 }
	   
}

void Timer1_Init(void)		//100微秒@24.000MHz
{
	AUXR |= 0x40;			//定時(shí)器時(shí)鐘1T模式
	TMOD &= 0x0F;			//設(shè)置定時(shí)器模式
	TL1 = 0xA0;				//設(shè)置定時(shí)初始值
	TH1 = 0xF6;				//設(shè)置定時(shí)初始值
	TF1 = 0;				//清除TF1標(biāo)志
	TR1 = 1;				//定時(shí)器1開始計(jì)時(shí)
}

void Timer1_ISR(void) interrupt 3{
	task_switch();// 在timer1中的中斷,進(jìn)行任務(wù)切換。
}



//幼兒園老師(操作系統(tǒng),加載任務(wù)的函數(shù))
//fn fn是一個(gè)函數(shù)的指針,注意數(shù)據(jù)類型是int 16位的。
//tid task id, 是8位的, 0,1 
//下面函數(shù)的作用就是把一個(gè)task的函數(shù)指針放入對(duì)應(yīng)的堆??臻g里面。
void task_load(unsigned int fn, unsigned char tid){
	task_sp[tid] =  task_stack[tid] + 1; // 把任務(wù)的指針往下一個(gè)空間挪一格,兩個(gè)char了
	task_stack[tid][0] = fn& 0xff;
	task_stack[tid][1] = fn>>8;	
}


void main(){
	   Timer0_init();
		 Timer1_Init();
	   task_load(task0,0);// 把task0 裝載到內(nèi)存中。
	   task_load(task1,1);// 把task1 裝載到內(nèi)存中。
	   task_id = 0;   
	   SP = task_sp[0];
}




文章來源地址http://www.zghlxwxcb.cn/news/detail-708112.html

到了這里,關(guān)于手寫嵌入式操作系統(tǒng)(基于stm8單片機(jī))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【小黑嵌入式系統(tǒng)第二課】嵌入式系統(tǒng)的概述(二)——外圍設(shè)備、處理器、ARM、操作系統(tǒng)

    【小黑嵌入式系統(tǒng)第二課】嵌入式系統(tǒng)的概述(二)——外圍設(shè)備、處理器、ARM、操作系統(tǒng)

    上一課: 【小黑嵌入式系統(tǒng)第一課】嵌入式系統(tǒng)的概述(一)——概念、特點(diǎn)、發(fā)展、應(yīng)用 下一課: 【小黑嵌入式系統(tǒng)第三課】嵌入式系統(tǒng)硬件平臺(tái)(一)——概述、總線、存儲(chǔ)設(shè)備(RAMROMFLASH) 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享

    2024年02月08日
    瀏覽(23)
  • 嵌入式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與開發(fā)

    嵌入式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與開發(fā)

    在RTOS中,時(shí)鐘具有非常重要的作用,通過時(shí)鐘可實(shí)現(xiàn)延時(shí)任務(wù)、周期性觸發(fā)任務(wù)執(zhí)行、任務(wù)有限等待的計(jì)時(shí)。 大多數(shù)嵌入式系統(tǒng)有兩種時(shí)鐘源,分別為實(shí)時(shí)時(shí)鐘RTC(Real-Time Clock)和定時(shí)器/計(jì)數(shù)器。 實(shí)時(shí)時(shí)鐘一般是靠電池供電,即使系統(tǒng)斷電,也可以維持日期和時(shí)間。由于實(shí)

    2024年02月11日
    瀏覽(23)
  • 嵌入式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與開發(fā)(十)

    RTOS的引導(dǎo)是指將操作系統(tǒng)裝入內(nèi)存并開始執(zhí)行的過程。在嵌入式系統(tǒng)的實(shí)際應(yīng)用中,針對(duì)不同應(yīng)用環(huán)境,對(duì)時(shí)間效率和空間效率有不同的要求。因此,操作系統(tǒng)啟動(dòng)時(shí)應(yīng)充分考慮這兩種限制。 時(shí)間限制主要包括兩種情況:系統(tǒng)要求快速啟動(dòng)和系統(tǒng)啟動(dòng)后要求程序能實(shí)時(shí)運(yùn)行

    2024年02月07日
    瀏覽(27)
  • 嵌入式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與開發(fā)(一)

    嵌入式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與開發(fā)(一)

    以一款簡單、易學(xué)的嵌入式開發(fā)平臺(tái)ARM Mini2440(CPU是三星ARM 9系列的ARM S3C2440)為例,通過具體代碼實(shí)現(xiàn),介紹如何從裸板入手設(shè)計(jì)簡單的輪詢系統(tǒng)、前后臺(tái)系統(tǒng),以及如何一步一步在ARM Mini2440上編寫RTOS內(nèi)核,到如何讓RTOS內(nèi)核支持多核嵌入式處理器。 aCoral是2009年創(chuàng)建的開源

    2024年02月12日
    瀏覽(22)
  • 【嵌入式操作系統(tǒng)】實(shí)驗(yàn)2:GPIO編程及應(yīng)用

    【嵌入式操作系統(tǒng)】實(shí)驗(yàn)2:GPIO編程及應(yīng)用

    熟悉STM32 模塊的GPIO硬件連接; 掌握GPIO初始化配置; 掌握GPIO控制板上LED燈編程; 熟練KEIL 工程的配置,編譯,調(diào)試,下載。 操作系統(tǒng):WINDOWS 10 開發(fā)工具:Keil 4,UartAssists 實(shí)驗(yàn)設(shè)備:125K RFID讀寫器模塊、JLink在線調(diào)試器、電源、PC ??運(yùn)行程序后,LED燈D7、D8按照全熄滅、亮

    2024年02月09日
    瀏覽(24)
  • 嵌入式系統(tǒng)設(shè)計(jì)師考試筆記之操作系統(tǒng)基礎(chǔ)復(fù)習(xí)筆記二

    嵌入式系統(tǒng)設(shè)計(jì)師考試筆記之操作系統(tǒng)基礎(chǔ)復(fù)習(xí)筆記二

    目錄 3、任務(wù)管理 (1)嵌入式操作系統(tǒng)的任務(wù)管理可以分為 (2)進(jìn)程 (3)線程 (4)任務(wù) (5)任務(wù)的創(chuàng)建與中止 (6)任務(wù)的狀態(tài)任務(wù)有三中基本狀態(tài): (7)任務(wù)控制塊 TCB (8)任務(wù)的切換 (9)任務(wù)的調(diào)度 (10)實(shí)時(shí)系統(tǒng)調(diào)度 (11)任務(wù)互斥 (12)信號(hào)量 (13)任務(wù)同

    2024年02月08日
    瀏覽(91)
  • 嵌入式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)與開發(fā)(信號(hào)量學(xué)習(xí))

    除了臨界點(diǎn)機(jī)制、互斥量機(jī)制可實(shí)現(xiàn)臨界資源的互斥訪問外,信號(hào)量(Semaphore)是另一選擇。 信號(hào)量與互斥量的區(qū)別 對(duì)于互斥量來說,主要應(yīng)用于臨界資源的互斥訪問,并且能夠有效地避免優(yōu)先級(jí)反轉(zhuǎn)問題。 對(duì)于信號(hào)量而言,它雖然也能用于臨界資源的互斥訪問,但是不能

    2024年02月08日
    瀏覽(29)
  • C語言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作

    C語言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作

    在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對(duì)應(yīng)的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對(duì)地址的能力 數(shù)據(jù)指針 在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對(duì)應(yīng)的MOV指令,而除C/C++以外的其它編程語言

    2024年02月09日
    瀏覽(25)
  • 從何著手OpenHarmony?從這里開始認(rèn)識(shí)嵌入式開源鴻蒙操作系統(tǒng)

    從何著手OpenHarmony?從這里開始認(rèn)識(shí)嵌入式開源鴻蒙操作系統(tǒng)

    首先,我們需要知道HarmonyOS與OpenHarmony是不同的概念,我們需要知道它們的區(qū)別: ????????HarmonyOS是華為獨(dú)家開發(fā)的,但華為在2020、2021年分兩次 將HarmonyOS的基礎(chǔ)能力全部捐獻(xiàn)給了開放原子開源基金會(huì),形成了OpenHarmony開源項(xiàng)目 ,華為對(duì)開源鴻蒙沒有控制權(quán),當(dāng)然華為仍將

    2024年02月04日
    瀏覽(24)
  • 《嵌入式系統(tǒng)開發(fā)實(shí)踐》實(shí)踐一 Linux 文件I/O操作

    一、 實(shí)驗(yàn)?zāi)康?掌握函數(shù)stat中文件屬性的應(yīng)用; 掌握系統(tǒng)函數(shù)system、opendir等的使用; 掌握struct dirent的結(jié)構(gòu)體變量的使用方法; 掌握文件屬性的判斷; 掌握系統(tǒng)函數(shù)open、read、write、close的使用方法。 掌握設(shè)備操作的系統(tǒng)函數(shù)使用方法。 二、 實(shí)驗(yàn)任務(wù)與要求 測(cè)試文件S_IRU

    2023年04月14日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包