找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3042|回復(fù): 0
收起左側(cè)

stm32f103ze,UCOSIII+菜單+時(shí)鐘任務(wù) 源程序

[復(fù)制鏈接]
ID:581602 發(fā)表于 2019-12-15 15:44 | 顯示全部樓層 |閱讀模式
相互學(xué)習(xí)一下。

單片機(jī)源程序如下:
  1. #include "includes.h"


  2. /*********************定義任務(wù)控制塊************************************************/

  3. static  OS_TCB        MENU_TCB;                                                           //定義MENU任務(wù)控制塊
  4. static  OS_TCB        RTC_TCB;                                                           //定義RTC任務(wù)控制塊
  5. static  OS_TCB        CLOCK_TCB;                                                           //定義CLOCK任務(wù)控制塊



  6. /********************* 定義任務(wù)棧****************************************************/
  7. static        CPU_STK        MENU_Stk[TASK_MENU_STK_SIZE];                   //定義任務(wù)堆棧
  8. static        CPU_STK        RTC_Stk[TASK_RTC_STK_SIZE];                   //定義任務(wù)堆棧
  9. static        CPU_STK        CLOCK_Stk[TASK_RTC_STK_SIZE];                   //定義任務(wù)堆棧



  10. /********************* 任務(wù)函數(shù)****************************************************/

  11. void  AppTaskStart (void *p_arg)
  12. {
  13.     CPU_INT32U  cpu_clk_freq;                                                                                                                                                //CPU內(nèi)核時(shí)鐘
  14.     CPU_INT32U  cnts;                                                                                                                                                                                // 根據(jù)用戶設(shè)定的時(shí)鐘節(jié)拍頻率計(jì)算 SysTick 定時(shí)器的計(jì)數(shù)值
  15.     OS_ERR      err;


  16.     (void)p_arg;

  17.     BSP_Init();                                                 //板級(jí)初始化
  18.     CPU_Init();                                                 //初始化 CPU 組件(時(shí)間戳、關(guān)中斷時(shí)間測(cè)量和主機(jī)名)

  19.     cpu_clk_freq = BSP_CPU_ClkFreq();                           //獲取 CPU 內(nèi)核時(shí)鐘頻率(SysTick 工作時(shí)鐘)
  20.     cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;        //根據(jù)用戶設(shè)定的時(shí)鐘節(jié)拍頻率計(jì)算 SysTick 定時(shí)器的計(jì)數(shù)值
  21.     OS_CPU_SysTickInit(cnts);                                   //調(diào)用 SysTick 初始化函數(shù),設(shè)置定時(shí)器計(jì)數(shù)值和啟動(dòng)定時(shí)器

  22. //    Mem_Init(); 有內(nèi)存管理代替                                 //初始化內(nèi)存管理組件(堆內(nèi)存池和內(nèi)存池表)

  23. #if OS_CFG_STAT_TASK_EN > 0u                                    //如果使能(默認(rèn)使能)了統(tǒng)計(jì)任務(wù)
  24.     OSStatTaskCPUUsageInit(&err);                               //計(jì)算沒有應(yīng)用任務(wù)(只有空閑任務(wù))運(yùn)行時(shí) CPU 的(最大)
  25. #endif                                                          //容量(決定 OS_Stat_IdleCtrMax 的值,為后面計(jì)算 CPU
  26.                                                                 //使用率使用)。
  27.     CPU_IntDisMeasMaxCurReset();                                //復(fù)位(清零)當(dāng)前最大關(guān)中斷時(shí)間

  28.    

  29. /*---------------------------------------------------------------------------------------------------------------------------------------*/
  30.                 /* 創(chuàng)建 munu 任務(wù) */
  31.           OSTaskCreate((OS_TCB     *)&MENU_TCB,                                        //任務(wù)控制塊指針         
  32.                  (CPU_CHAR   *)"MENU",                                                //任務(wù)名稱
  33.                  (OS_TASK_PTR )Task_MENU,                                        //任務(wù)代碼指針
  34.                  (void       *)0,                                                        //傳遞給任務(wù)的參數(shù)parg
  35.                  (OS_PRIO     )TASK_MENU_PRIO,                                //任務(wù)優(yōu)先級(jí)
  36.                  (CPU_STK    *)&MENU_Stk[0],                                //任務(wù)堆;刂
  37.                  (CPU_STK_SIZE)TASK_MENU_STK_SIZE/10,                //堆棧剩余警戒線
  38.                  (CPU_STK_SIZE)TASK_MENU_STK_SIZE,                        //堆棧大小
  39.                  (OS_MSG_QTY  )0,                                                        //可接收的最大消息隊(duì)列數(shù)
  40.                  (OS_TICK     )0,                                                        //時(shí)間片輪轉(zhuǎn)時(shí)間
  41.                  (void       *)0,                                                        //任務(wù)控制塊擴(kuò)展信息
  42.                  (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),         //任務(wù)選項(xiàng)
  43.                  (OS_ERR     *)&err);                                                //返回值     
  44.         /* 創(chuàng)建 RTC 任務(wù) */
  45.           OSTaskCreate((OS_TCB     *)&RTC_TCB,                                        //任務(wù)控制塊指針         
  46.                  (CPU_CHAR   *)"RTC",                                                //任務(wù)名稱
  47.                  (OS_TASK_PTR )Task_RTC,                                        //任務(wù)代碼指針
  48.                  (void       *)0,                                                        //傳遞給任務(wù)的參數(shù)parg
  49.                  (OS_PRIO     )TASK_RTC_PRIO,                                //任務(wù)優(yōu)先級(jí)
  50.                  (CPU_STK    *)&RTC_Stk[0],                                //任務(wù)堆;刂
  51.                  (CPU_STK_SIZE)TASK_RTC_STK_SIZE/10,                //堆棧剩余警戒線
  52.                  (CPU_STK_SIZE)TASK_RTC_STK_SIZE,                        //堆棧大小
  53.                  (OS_MSG_QTY  )0,                                                        //可接收的最大消息隊(duì)列數(shù)
  54.                  (OS_TICK     )0,                                                        //時(shí)間片輪轉(zhuǎn)時(shí)間
  55.                  (void       *)0,                                                        //任務(wù)控制塊擴(kuò)展信息
  56.                  (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),         //任務(wù)選項(xiàng)
  57.                  (OS_ERR     *)&err);                                                //返回值                                                                           
  58.    /* 創(chuàng)建 CLOCK 任務(wù) */
  59.           OSTaskCreate((OS_TCB     *)&CLOCK_TCB,                                        //任務(wù)控制塊指針         
  60.                  (CPU_CHAR   *)"CLOCK",                                                //任務(wù)名稱
  61.                  (OS_TASK_PTR )Task_CLOCK,                                        //任務(wù)代碼指針
  62.                  (void       *)0,                                                        //傳遞給任務(wù)的參數(shù)parg
  63.                  (OS_PRIO     )TASK_CLOCK_PRIO,                                //任務(wù)優(yōu)先級(jí)
  64.                  (CPU_STK    *)&CLOCK_Stk[0],                                //任務(wù)堆;刂
  65.                  (CPU_STK_SIZE)TASK_CLOCK_STK_SIZE/10,                //堆棧剩余警戒線
  66.                  (CPU_STK_SIZE)TASK_CLOCK_STK_SIZE,                        //堆棧大小
  67.                  (OS_MSG_QTY  )0,                                                        //可接收的最大消息隊(duì)列數(shù)
  68.                  (OS_TICK     )0,                                                        //時(shí)間片輪轉(zhuǎn)時(shí)間
  69.                  (void       *)0,                                                        //任務(wù)控制塊擴(kuò)展信息
  70.                  (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),         //任務(wù)選項(xiàng)
  71.                  (OS_ERR     *)&err);                                                //返回值                                                                           
  72. //   OSTaskSuspend (&CLOCK_TCB, & err );                    //掛起CLOCK



  73. /*------------------------------------------------------------------------------------------------------------------------------------------*/  
  74.                 OSTaskDel ( 0, & err );                     //刪除起始任務(wù)本身,該任務(wù)不再運(yùn)行
  75.                
  76.                
  77.                
  78. }


  79. void Task_RTC(void *p_arg)
  80. {
  81.         OS_ERR err;
  82.         u8 t;

  83.        
  84.        
  85.         while(1)
  86.         {       
  87.                 t=calendar.sec;
  88.                 RTC_Get();               
  89.         if(t!=calendar.sec)
  90.                 {
  91.                         t=calendar.sec;
  92.                         LCD_ShowString(20,2,80,16,16,"  :  :  ");
  93.                        
  94.                        
  95.                         LCD_ShowxNum(20,2,calendar.hour,2,16,0);//顯示數(shù)字,高位為0,還是顯示,mode:0,不填充;1,填充0.
  96.                         LCD_ShowxNum(44,2,calendar.min,2,16,0);
  97.                         LCD_ShowxNum(68,2,calendar.sec,2,16,0);
  98.                 }       
  99.                        
  100.         OSTimeDlyHMSM(0, 0,0,1,OS_OPT_TIME_HMSM_STRICT,&err);
  101.         }
  102. }
復(fù)制代碼

所有資料51hei提供下載:
2.3 OSok - 菜單 -時(shí)鐘.7z (720.42 KB, 下載次數(shù): 89)


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表