欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2782|回復: 0
打印 上一主題 下一主題
收起左側

51單片機嵌入UCOS系統 程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-6 13:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 51黑tt 于 2016-3-6 13:49 編輯

8位單片機代表類型是51單片機,
最近正對51單片機嵌入UCOS系統很感興趣,
很少人會對51嵌入UCOS感冒,原因是51的RAm太少,最近看到一篇《制造自己的操作系統,》學習了一下午,感覺不是很強大,我是個菜鳥,可能還不知道其中的精髓吧,下貼出,留念。
  1. #include <reg51.h>


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

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

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

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


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

  15. if(++task_id == MAX_TASKS)
  16.   task_id = 0;

  17. SP = task_sp[task_id];
  18. }

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

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




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


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




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

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

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

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

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

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

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

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

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

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

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

看了看其形式就是
void  main (void)
{
while(1)
          {
            task_1();
                task_2();
                    task_3();  
          }  
}
我唯一的目的是想看一下51到底有跑多大,
另外,16位單片機代表MSP430是典型代表,
我馬上會學到,真的希望有電子或是計算機專業的同學給我教教,楊秀旭,他好像在電子科技大學,我聯系不上她,但是找他去
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表