相互学习一下。
单片机源程序如下:
- #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; // 根据用户设定的时钟节拍频率计算 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; //根据用户设定的时钟节拍频率计算 SysTick 定时器的计数值
- OS_CPU_SysTickInit(cnts); //调用 SysTick 初始化函数,设置定时器计数值和启动定时器
- // Mem_Init(); 有内存管理代替 //初始化内存管理组件(堆内存池和内存池表)
- #if OS_CFG_STAT_TASK_EN > 0u //如果使能(默认使能)了统计任务
- OSStatTaskCPUUsageInit(&err); //计算没有应用任务(只有空闲任务)运行时 CPU 的(最大)
- #endif //容量(决定 OS_Stat_IdleCtrMax 的值,为后面计算 CPU
- //使用率使用)。
- CPU_IntDisMeasMaxCurReset(); //复位(清零)当前最大关中断时间
-
-
- /*---------------------------------------------------------------------------------------------------------------------------------------*/
- /* 创建 munu 任务 */
- OSTaskCreate((OS_TCB *)&MENU_TCB, //任务控制块指针
- (CPU_CHAR *)"MENU", //任务名称
- (OS_TASK_PTR )Task_MENU, //任务代码指针
- (void *)0, //传递给任务的参数parg
- (OS_PRIO )TASK_MENU_PRIO, //任务优先级
- (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); //返回值
- /* 创建 RTC 任务 */
- OSTaskCreate((OS_TCB *)&RTC_TCB, //任务控制块指针
- (CPU_CHAR *)"RTC", //任务名称
- (OS_TASK_PTR )Task_RTC, //任务代码指针
- (void *)0, //传递给任务的参数parg
- (OS_PRIO )TASK_RTC_PRIO, //任务优先级
- (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); //返回值
- /* 创建 CLOCK 任务 */
- OSTaskCreate((OS_TCB *)&CLOCK_TCB, //任务控制块指针
- (CPU_CHAR *)"CLOCK", //任务名称
- (OS_TASK_PTR )Task_CLOCK, //任务代码指针
- (void *)0, //传递给任务的参数parg
- (OS_PRIO )TASK_CLOCK_PRIO, //任务优先级
- (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)
|