相互學習一下。
單片機源程序如下:
- #include "includes.h"
- /*********************定義任務控制塊************************************************/
- static OS_TCB MENU_TCB; //定義MENU任務控制塊
- static OS_TCB RTC_TCB; //定義RTC任務控制塊
- static OS_TCB CLOCK_TCB; //定義CLOCK任務控制塊
- /********************* 定義任務棧****************************************************/
- static CPU_STK MENU_Stk[TASK_MENU_STK_SIZE]; //定義任務堆棧
- static CPU_STK RTC_Stk[TASK_RTC_STK_SIZE]; //定義任務堆棧
- static CPU_STK CLOCK_Stk[TASK_RTC_STK_SIZE]; //定義任務堆棧
- /********************* 任務函數****************************************************/
- void AppTaskStart (void *p_arg)
- {
- CPU_INT32U cpu_clk_freq; //CPU內核時鐘
- CPU_INT32U cnts; // 根據用戶設定的時鐘節(jié)拍頻率計算 SysTick 定時器的計數值
- OS_ERR err;
- (void)p_arg;
- BSP_Init(); //板級初始化
- CPU_Init(); //初始化 CPU 組件(時間戳、關中斷時間測量和主機名)
- cpu_clk_freq = BSP_CPU_ClkFreq(); //獲取 CPU 內核時鐘頻率(SysTick 工作時鐘)
- cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; //根據用戶設定的時鐘節(jié)拍頻率計算 SysTick 定時器的計數值
- OS_CPU_SysTickInit(cnts); //調用 SysTick 初始化函數,設置定時器計數值和啟動定時器
- // Mem_Init(); 有內存管理代替 //初始化內存管理組件(堆內存池和內存池表)
- #if OS_CFG_STAT_TASK_EN > 0u //如果使能(默認使能)了統(tǒng)計任務
- OSStatTaskCPUUsageInit(&err); //計算沒有應用任務(只有空閑任務)運行時 CPU 的(最大)
- #endif //容量(決定 OS_Stat_IdleCtrMax 的值,為后面計算 CPU
- //使用率使用)。
- CPU_IntDisMeasMaxCurReset(); //復位(清零)當前最大關中斷時間
-
-
- /*---------------------------------------------------------------------------------------------------------------------------------------*/
- /* 創(chuàng)建 munu 任務 */
- OSTaskCreate((OS_TCB *)&MENU_TCB, //任務控制塊指針
- (CPU_CHAR *)"MENU", //任務名稱
- (OS_TASK_PTR )Task_MENU, //任務代碼指針
- (void *)0, //傳遞給任務的參數parg
- (OS_PRIO )TASK_MENU_PRIO, //任務優(yōu)先級
- (CPU_STK *)&MENU_Stk[0], //任務堆棧基地址
- (CPU_STK_SIZE)TASK_MENU_STK_SIZE/10, //堆棧剩余警戒線
- (CPU_STK_SIZE)TASK_MENU_STK_SIZE, //堆棧大小
- (OS_MSG_QTY )0, //可接收的最大消息隊列數
- (OS_TICK )0, //時間片輪轉時間
- (void *)0, //任務控制塊擴展信息
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務選項
- (OS_ERR *)&err); //返回值
- /* 創(chuàng)建 RTC 任務 */
- OSTaskCreate((OS_TCB *)&RTC_TCB, //任務控制塊指針
- (CPU_CHAR *)"RTC", //任務名稱
- (OS_TASK_PTR )Task_RTC, //任務代碼指針
- (void *)0, //傳遞給任務的參數parg
- (OS_PRIO )TASK_RTC_PRIO, //任務優(yōu)先級
- (CPU_STK *)&RTC_Stk[0], //任務堆棧基地址
- (CPU_STK_SIZE)TASK_RTC_STK_SIZE/10, //堆棧剩余警戒線
- (CPU_STK_SIZE)TASK_RTC_STK_SIZE, //堆棧大小
- (OS_MSG_QTY )0, //可接收的最大消息隊列數
- (OS_TICK )0, //時間片輪轉時間
- (void *)0, //任務控制塊擴展信息
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務選項
- (OS_ERR *)&err); //返回值
- /* 創(chuàng)建 CLOCK 任務 */
- OSTaskCreate((OS_TCB *)&CLOCK_TCB, //任務控制塊指針
- (CPU_CHAR *)"CLOCK", //任務名稱
- (OS_TASK_PTR )Task_CLOCK, //任務代碼指針
- (void *)0, //傳遞給任務的參數parg
- (OS_PRIO )TASK_CLOCK_PRIO, //任務優(yōu)先級
- (CPU_STK *)&CLOCK_Stk[0], //任務堆棧基地址
- (CPU_STK_SIZE)TASK_CLOCK_STK_SIZE/10, //堆棧剩余警戒線
- (CPU_STK_SIZE)TASK_CLOCK_STK_SIZE, //堆棧大小
- (OS_MSG_QTY )0, //可接收的最大消息隊列數
- (OS_TICK )0, //時間片輪轉時間
- (void *)0, //任務控制塊擴展信息
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務選項
- (OS_ERR *)&err); //返回值
- // OSTaskSuspend (&CLOCK_TCB, & err ); //掛起CLOCK
- /*------------------------------------------------------------------------------------------------------------------------------------------*/
- OSTaskDel ( 0, & err ); //刪除起始任務本身,該任務不再運行
-
-
-
- }
- void Task_RTC(void *p_arg)
- {
- OS_ERR err;
- u8 t;
-
-
- while(1)
- {
- t=calendar.sec;
- RTC_Get();
- if(t!=calendar.sec)
- {
- t=calendar.sec;
- LCD_ShowString(20,2,80,16,16," : : ");
-
-
- LCD_ShowxNum(20,2,calendar.hour,2,16,0);//顯示數字,高位為0,還是顯示,mode:0,不填充;1,填充0.
- LCD_ShowxNum(44,2,calendar.min,2,16,0);
- LCD_ShowxNum(68,2,calendar.sec,2,16,0);
- }
-
- OSTimeDlyHMSM(0, 0,0,1,OS_OPT_TIME_HMSM_STRICT,&err);
- }
- }
復制代碼
所有資料51hei提供下載:
2.3 OSok - 菜單 -時鐘.7z
(720.42 KB, 下載次數: 89)
2019-12-15 15:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|