1.STM32F407 探索者 Emwin+UcosⅢ的Progbar控件刷新实时显示问题(任务的切换调度)

Emwin中的Progbar控件的实时刷新显示

问题如下:当STM32的外部数据返回到emwin里面处理显示的时候,需要花很久时间才刷新一次,emwin里的Progbar控件进度条,之前不跑系统的时候是可以1%-2%-3%…-100%,一个一个百分比的变化的,加了系统之后,返回的数据用串口和它显示对比,发现大概过了8%才变化一次,也就是第一次开机刷新时显示0%,等n久后才由0%-8%,8%-16%(0-100%变化分别由变量0-100变化,也就是变量的值对应着进度条的值)但是这个过程并没有实时显示出来,后来去查了一次,应该是任务调度的问题,我设置的emwin的优先级和外部运行的程序的优先级一样,

都是5级优先级

//EMWINDEMO任务
//设置任务优先级
#define EMWINDEMO_TASK_PRIO			5
//任务堆栈大小
#define EMWINDEMO_STK_SIZE			2048
//任务控制块
OS_TCB EmwindemoTaskTCB;
//任务堆栈
CPU_STK EMWINDEMO_TASK_STK[EMWINDEMO_STK_SIZE];
//emwindemo_task任务
void emwindemo_task(void *p_arg);



//L298n电机任务
//设置任务优先级
#define motor_TASK_PRIO 				5
//任务堆栈大小
#define motor_STK_SIZE				160
//任务控制块
OS_TCB motorTaskTCB;
//任务堆栈
CPU_STK motor_TASK_STK[motor_STK_SIZE];
//led0任务
void motor_task(void *p_arg);


在这里插入图片描述

也就是说,这两个任务是一直完成然后切换的,(当然过程中还有更高优先级的触摸任务,优先级4)

​​在这里插入图片描述

着重理解任务中止

大概意思就是说,如果两个任务一直有切换的话,那就意味着两个任务都有被正常运行,等下次任务恢复后又继续从上一次没有完成的地方开始继续完成任务,结合以上的,我大概就猜到了应该是emwin的任务的时间片过短了,导致没有运行到更新Progbar的控件的代码那句,循环了几次切换任务后,才真正完成了一个emwin的任务,然后去查了仔细了解了一下系统的时间片轮调度,后面才知道,默认情况下,每一个任务的时间片轮是系统默认的也就是1个系统节拍×5ms(这里的5ms可以修改),

这里已经使能了时间片轮调度功能

#if	OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
	 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
	OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  

后来我就把两个两个任务的时间片轮都调大,L298n的改成120个时间片轮,也就是600ms,

	//L298N控制水泵任务
	OSTaskCreate((OS_TCB*     )&motorTaskTCB,		
				 (CPU_CHAR*   )"motor task", 		
                 (OS_TASK_PTR )motor_task, 			
                 (void*       )0,					
                 (OS_PRIO	  )motor_TASK_PRIO,     
                 (CPU_STK*    )&motor_TASK_STK[0],	
                 (CPU_STK_SIZE)motor_STK_SIZE/10,	
                 (CPU_STK_SIZE)motor_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )120,  				//时间片为0时为默认长度,即5ms*1个系统时钟节拍	=5ms
                 (void*       )0,					
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);	

L298n的任务块

void motor_task(void *p_arg)
	
{		
	OS_ERR err;
	while(1)
	{	
//				if(HW==0)											//如果检测到有瓶子	,则红外灯亮,返回0,
//		{		
		if (/*Bottle_Flag==1&&*/L<capacity1-1)
		{		buhuo();
				motor_start();				//水泵全速启动		
		}else if(L>=capacity1-1)						//如果检测到流量大于等于299ml,则水泵停止工作,转盘启动						
									{ 		//OSTaskTimeQuantaSet();
												Bottle=Bottle+1;					
												motor_stop();													//水泵停止						
												Locate_Rle(1600,1000,CW);							//步进电机旋转90度
												printf("标志位为%d\r\n",Bottle_Flag);	//打印输出
												printf("瓶子:%d 瓶\r\n",Bottle);			//打印瓶子				
												Freq=0;																//上一次的工作已完成,把捕捉到的脉冲计数清零
												L=0;																	//上一次的工作已完成,把流量计数清零
												Bottle_Flag=0;												//标志位清零,表示清除上一次瓶子的状态		
												delay_ms(500);
										}	OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_PERIODIC,&err);//延时1ms		
							}
				}

emwin的时间片轮改成2个系统时钟节拍,10ms

	//STemWin Demo任务	
	OSTaskCreate((OS_TCB*     )&EmwindemoTaskTCB,		
				 (CPU_CHAR*   )"Emwindemo task", 		
                 (OS_TASK_PTR )emwindemo_task, 			
                 (void*       )0,					
                 (OS_PRIO	  )EMWINDEMO_TASK_PRIO,     
                 (CPU_STK*    )&EMWINDEMO_TASK_STK[0],	
                 (CPU_STK_SIZE)EMWINDEMO_STK_SIZE/10,	
                 (CPU_STK_SIZE)EMWINDEMO_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )2,  //时间片长度为1个系统时钟节拍,既2*5=10ms				
                 (void*       )0,					
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);

emwin的任务块


//EMWINDEMO任务
void emwindemo_task(void *p_arg)
	
{	
	OS_ERR err;
	GUI_CURSOR_Show(); //显示鼠标
	MainTask();
	while(Run_Flag)
	{
		OSTimeDlyHMSM(0,0,0,1,OS_OPT_TIME_PERIODIC,&err);//延时5ms
	}
}

然后现在Progbar的控件实时刷新的问题没有解决,还多了一个emwin切换界面反应很慢的问题,后来发现,我把L298n的时间片轮设置过大了,导致长时间停留在L298n,当你触摸界面的时候,要等l298n的任务完成了才能刷新,然后后面经过测试。

把L298n的时间片轮设置为默认,即5ms

在这里插入图片描述

然后经过测试得,emwin一个完整的任务刷新大概需要30ms,也就是6个时间片轮。

在这里插入图片描述

到这里,这个Progbar控件的问题就基本解决了。已经可以做到单片机外部返回数据,然后UI界面实时刷新,差不多1000ms刷新一次这样

我的UcosⅢ刚学几天,这个是个人见解,大佬勿喷!嘴下留情!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: emwin是一种用于嵌入式系统的图形库,提供了丰富的图形界面和多媒体功能,使开发者能够方便地实现图形界面的设计和显示。使用emwin,开发者可以轻松创建各种用户界面元素,如按钮、文本框、图表等,并能够在嵌入式系统上进行交互操作和显示ucos是一个开源的嵌入式实时操作系统(RTOS),它提供了任务管理、内存管理、时间管理、消息队列等功能方便嵌入式开发。ucos可以帮助开发者更好地组织和管理任务,提高嵌入式系统的实时性和可靠性。 Modbus是一种通信协议,主要用于工业自动化领域中的设备之间的通信。Modbus提供了一种简单、可靠且易于实现的通信方式,支持主从设备之间的通信。Modbus可以通过串口、以太网等多种物理介质进行通信,广泛应用于工业控制系统。 结合emwinucos和Modbus,可以在嵌入式系统上实现图形界面的显示和交互,并通过Modbus协议与其他设备进行通信。例如,可以使用emwin设计和显示控制界面,并通过ucos进行任务管理,在其中调用Modbus通信接口与其他设备进行通信。这样可以实现嵌入式系统与其他设备之间的数据传输和控制操作,满足工业自动化系统的需求。 ### 回答2: emWin是一种用于嵌入式系统的图形界面库,它由Segger开发并被广泛应用于各种嵌入式设备中。emWin提供了丰富的图形绘制和显示功能,可以用于创建用户友好的界面,包括按钮、标签、图形图像等。它可以跨平台使用,并支持多种不同类型的显示屏。开发者可以通过使用emWin库,简化嵌入式系统的图形界面设计和开发工作。 uCos是一个开源的实时操作系统(RTOS),由微型操作系统服务(Micrium)开发。uCos提供了多种功能,包括任务管理、中断处理、内存管理等。它可以运行在不同的嵌入式处理器上,并且具有高度可移植性和可定制性。开发者可以通过使用uCos,简化嵌入式系统的多任务管理和实时性要求。 Modbus是一种通信协议,常用于工业领域的设备之间进行通信。Modbus协议定义了设备之间通信的格式和规范,包括数据传输方式、消息结构等。它可以基于串口、以太网等物理介质进行通信。Modbus协议分为Modbus RTU和Modbus TCP两种形式,分别用于串口和以太网通信。开发者可以通过使用Modbus协议,实现不同设备之间的数据传输和通信。 综上所述,emWinuCos和Modbus都是在嵌入式系统开发中常用的技术和工具。emWin用于图形界面设计和显示uCos用于实时操作系统的管理和多任务处理,Modbus用于设备之间的通信和数据传输。它们在嵌入式系统开发中发挥了重要的作用,提高了系统的可靠性、可移植性和用户体验。 ### 回答3: eMWin是一款嵌入式GUI软件,可以在微控制器上实现图形用户界面的开发。它提供了丰富的图形元素和控件,可以让开发者轻松创建出漂亮的界面。eMWin支持多种操作系统,包括uC/OS、FreeRTOS等,对于嵌入式系统来说非常灵活。 uC/OS是一款常用的嵌入式实时操作系统。它提供了任务管理、内存管理、时间管理等一系列功能,可以方便地实现任务调度和资源管理。uC/OS采用了优先级调度算法,可以根据任务的优先级调度任务的执行顺序。同时,uC/OS还提供了丰富的中断处理机制,可以方便地处理外部中断和定时器中断。 Modbus是一种通信协议,主要应用于工业自动化领域。它可以在串行通信和以太网通信等不同的物理介质上运行。Modbus协议包括了多个功能码,可以实现数据的读写、设备的控制等功能。Modbus主从模型中,主设备负责发起请求,从设备负责响应请求,实现设备之间的通信。 eMWinuC/OS和Modbus可以结合使用,实现在嵌入式系统中创建图形界面并与外部设备进行通信。使用eMWin可以设计出用户友好的界面,uC/OS可以提供操作系统功能,Modbus可以实现与外设的通信。通过这样的组合,可以轻松地开发出功能强大的嵌入式系统,满足工业自动化等领域的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值