久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 51單片機嵌入UCOS系統 [打印本頁]

作者: liuyang    時間: 2012-5-29 18:32
標題: 51單片機嵌入UCOS系統
 很少人會對51嵌入UCOS感冒,原因是51的RAm太少,最近看到一篇《制造自己的操作系統,》學習了一下午,感覺不是很強大,我是個菜鳥,可能還不知道其中的精髓吧,下貼出,留念。
#include <reg51.h>


/*============================以下為任務管理器代碼============================*/

#define MAX_TASKS 3//任務槽個數.在本例中并未考慮任務換入換出,所以實際運行的任務有多少個,就定義多少個任務槽,不可多定義或少定義

//任務的棧指針
unsigned char idata task_sp[MAX_TASKS];
          
#define MAX_TASK_DEP 12 //最大棧深.最低不得少于2個,保守值為12.
      //預估方法:以2為基數,每增加一層函數調用,加2字節.如果其間可能發生中斷,則還要再加上中斷需要的棧深.
      //減小棧深的方法:1.盡量少嵌套子程序 2.調子程序前關中斷.
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任務堆棧.

unsigned char task_id;//當前活動任務號


//任務切換函數(任務調度器)
void task_switch(){
 task_sp[task_id] = SP;

 if(++task_id == MAX_TASKS)
  task_id = 0;

 SP = task_sp[task_id];
}

//任務裝入函數.將指定的函數(參數1)裝入指定(參數2)的任務槽中.如果該槽中原來就有任務,則原任務丟失,但系統本身不會發生錯誤.
void task_load(unsigned int fn, unsigned char tid){
 task_sp[tid] = task_stack[tid] + 1;
 task_stack[tid][0] = (unsigned int)fn & 0xff;
 task_stack[tid][1] = (unsigned int)fn >> 8;
}

//從指定的任務開始運行任務調度.調用該宏后,將永不返回.
#define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}

 

 

 

 

 

 

 

 

 


/*============================以下為測試代碼============================*/


unsigned char stra[3], strb[3];//用于內存塊復制測試的數組.

 


//測試任務:復制內存塊.每復制一個字節釋放CPU一次
void task1(){
 //每復制一個字節釋放CPU一次,控制循環的變量必須考慮覆蓋
 static unsigned char i;//如果將這個變量前的static去掉,會發生什么事?
 i = 0;

 while(1){//任務必須為死循環,不得退出函數,否則系統會崩潰
  stra = strb;
  if(++i == sizeof(stra))
   i = 0;

  //變量i在這里跨越了task_switch(),因此它必須定義為靜態(static),否則它將會被其它進程修改,因為在另一個進程里也會用到該變量所占用的地址.
  task_switch();//釋放CPU一會兒,讓其它進程有機會運行.如果去掉該行,則別的進程永遠不會被調用到
 }
}

//測試任務:復制內存塊.每復制一個字節釋放CPU一次.
void task2(){
 //每復制一個字節釋放CPU一次,控制循環的變量必須考慮覆蓋
 static unsigned char i;//如果將這個變量前的static去掉,將會發生覆蓋問題.task1()和task2()會被編譯器分配到同一個內存地址上,當兩個任務同時運行時,i的值就會被兩個任務改來改去
 i = 0;

 while(1){//任務必須為死循環,不得退出函數,否則系統會崩潰
  stra = strb;
  if(++i == sizeof(stra))
   i = 0;

  //變量i在這里跨越了task_switch(),因此它必須定義為靜態(static),否則它將會被其它進程修改,因為在另一個進程里也會用到該變量所占用的地址.
  task_switch();//釋放CPU一會兒,讓其它進程有機會運行.如果去掉該行,則別的進程永遠不會被調用到
 }
}

//測試任務:復制內存塊.復制完所有字節后釋放CPU一次.
void task3(){
 //復制全部字節后才釋放CPU,控制循環的變量不須考慮覆蓋
 unsigned char i;//這個變量前不需要加static,因為在它的作用域內并沒有釋放過CPU

 while(1){//任務必須為死循環,不得退出函數,否則系統會崩潰
  i = sizeof(stra);
  do{
   stra[i-1] = strb[i-1];
  }while(--i);

  //變量i在這里已完成它的使命,所以無需定義為靜態.你甚至可以定義為寄存器型(regiter)
  task_switch();//釋放CPU一會兒,讓其它進程有機會運行.如果去掉該行,則別的進程永遠不會被調用到
 }
}

void main(){
 //在這個示例里并沒有考慮任務的換入換出,所以任務槽必須全部用完,否則系統會崩潰.
 //這里裝載了三個任務,因此在定義MAX_TASKS時也必須定義為3
 task_load(task1, 0);//將task1函數裝入0號槽
 task_load(task2, 1);//將task2函數裝入1號槽
 task_load(task3, 2);//將task3函數裝入2號槽

 os_start(0);//啟動任務調度,并從0號槽開始運行.參數改為1,則首先運行1號槽.
    //調用該宏后,程序流將永不再返回main(),也就是說,該語句行之后的所有語句都不被執行到.
}

看了看其形式就是

void  main (void)

{

while(1)

          {

            task_1();

                task_2();

                    task_3();  

          }  

}

我唯一的目的是想看一下51到底有跑多大,

另外,16位單片機代表MSP430是典型代表,

作者: 77408187    時間: 2014-11-26 15:59
很歷害了哦




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 不卡中文字幕 | 国产黄网| 久久青| 日日操日日操 | 在线亚洲一区 | 婷婷一区二区三区 | 免费精品视频 | 一级黄色免费视频 | 成人免费视频观看视频 | 美女国产精品 | 日韩欧美中文在线 | 青青青国产 | 97在线超碰 | 亚洲国产天堂 | 日本精品视频 | 亚洲欧美日韩一区二区三区四区 | 亚洲天堂成人 | 精品一区在线播放 | 五月天视频| 亚洲免费在线播放 | 性生活网址 | 欧美在线亚洲 | 欧美日韩中文 | 综合导航 | 欧美日本在线 | 欧美在线视频一区二区 | 亚洲激情另类 | 天堂va蜜桃一区二区三区 | 国产免费91 | 欧美日韩高清 | 国产精品一区一区三区 | 一级片在线观看视频 | 欧美精品网 | 亚洲综合色网 | 欧美片网站免费 | 你懂的在线网站 | 国产超碰人人模人人爽人人添 | 日日操日日干 | 国产中文在线观看 | 高潮毛片无遮挡免费看 | 黑森林av|