高中生
最后登录1970-1-1
在线时间 小时
注册时间2014-1-20
|
在uCOSIII移植到STM32后可以正常执行多任务,让三个LED以不同频率闪烁。
后来我在此基础上加入emWin522,测试正常,可以正常显示画面,包括emWin的自带DEMO能正常运行。
然后我加入自己写的触摸屏校准程序,经过调试后可以正常校准并把校准数据写入到外部SPI FLASH里面,然后再测试DEMO可以正常触摸控制DEMO例程。
可是问题来了,首先我说明一下,我使用的是emWin522多任务版的OSlib,和官方GUI_X_UCOS.C文件,能够正常使用emWin,但是我发现我的校准程序延时出现了一个问题----延时随机失效,就是明明延时5秒,可是1秒没有到就直接过去了。
刚开始我使用的是GUI_Delay来延时的,我以为是GUI_Delay出了问题(GUI_X_UCOS是官方实例的应该不会出问题的),然后我改用UCOS的OSTimeDly来延时,发现问题还是存在,出现随机性的延时失效,就是有时候校准成功或者失败后延时
正常5秒,有时候直接1秒不到就跳过,连个校准成功的文字都没有看到就直接跳到其他的多任务里面去了。(我目前让系统执行的任务是首先优先级最高的获取触摸屏位置任务,然后是三个LED的各个任务闪烁,本来是加入触摸屏校准任务的,后来发现触摸屏校准任务会出现问题,我就没有将触摸屏校准单独生成一个任务,而是将其放在BSP_Init里面进行初始化,而为了让其能使用OSTimeDly,所以我在板载初始化之前先开启滴答。)
后来关闭#define OS_CFG_ISR_POST_DEFERRED_EN 0u /* Enable (1) or Disable (0) Deferred ISR posts */ 还是一样会出现问题,延时随机失效。我用了好几天的时间都没有找到出现问题的原因,利用仿真查看也没有查出个所以然来。
但是有点可以肯定,第一、GUI_Delay调用的就是GUI_X_UCOS里面的OSTimeDly,而GUI_Delay出现问题后,换成OSTimeDly也还是有一样的问题,那就说明就是OSTimeDly出现延时失效的问题,而OS_CFG_ISR_POST_DEFERRED_EN是可以修改
OSTimeDly延时方式的,修改与不修改都不会解决延时失效的问题。第二、使用for函数自减制作的延时函数替代OSTimeDly后可以正常稳定的延时,不会出现任何失效,说明我写的触摸校准程序是没有问题的。
有以上几点我大概得出:要么是其他地方导致OSTimeDly延时随机性失效,要么就是UCOS有BUG,当然我相信应该是前者的问题。以下是我触摸校准函数的程序源码,直接以emwin为基础写的。
触摸屏校准程序(实际测试并不是备份域影响延时)wudaxstudio发布
- <blockquote><blockquote>void Display_LineX(uint16_t x,uint16_t y)//设置一个十字型的图案用于触摸校正的,中心点为原点
复制代码 多任务中:- static void AppTaskStart (void *p_arg)
- {
- CPU_INT32U cpu_clk_freq;
- CPU_INT32U cnts;
- OS_ERR err;
- (void)p_arg;
- cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */
- cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */
- OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */
-
- CPU_Init();
- BSP_Init(); /* Initialize BSP functions */
- // Mem_Init(); /* Initialize Memory Management Module */
- //#if OS_CFG_STAT_TASK_EN > 0u
- // OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
- //#endif
- // CPU_IntDisMeasMaxCurReset();
- OSTaskCreate((OS_TCB *)&AppTouchPositionTCB, /* Create the TouchPosition */
- (CPU_CHAR *)"App TouchPosition",
- (OS_TASK_PTR ) AppTouchPosition,
- (void *) 0,
- (OS_PRIO ) APP_TouchPosition_PRIO,
- (CPU_STK *)&AppTouchPositionStk[0],
- (CPU_STK_SIZE) APP_TouchPosition_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_TouchPosition_STK_SIZE,
- (OS_MSG_QTY ) 0u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&AppTouchpointTCB, /* Create the Touchpoint */
- (CPU_CHAR *)"App Touchpoint",
- (OS_TASK_PTR ) AppTouchpoint,
- (void *) 0,
- (OS_PRIO ) APP_Touchpoint_PRIO,
- (CPU_STK *)&AppTouchpointStk[0],
- (CPU_STK_SIZE) APP_Touchpoint_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_Touchpoint_STK_SIZE,
- (OS_MSG_QTY ) 0u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&AppLedTask1TCB, /* Create the led1 */
- (CPU_CHAR *)"App LedTask1",
- (OS_TASK_PTR ) AppLedTask1,
- (void *) 0,
- (OS_PRIO ) APP_LedTask1_PRIO,
- (CPU_STK *)&AppLedTask1Stk[0],
- (CPU_STK_SIZE) APP_LedTask1_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_LedTask1_STK_SIZE,
- (OS_MSG_QTY ) 0u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&AppLedTask2TCB, /* Create the led1 */
- (CPU_CHAR *)"App LedTask2",
- (OS_TASK_PTR ) AppLedTask2,
- (void *) 0,
- (OS_PRIO ) APP_LedTask2_PRIO,
- (CPU_STK *)&AppLedTask2Stk[0],
- (CPU_STK_SIZE) APP_LedTask2_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_LedTask2_STK_SIZE,
- (OS_MSG_QTY ) 0u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSTaskCreate((OS_TCB *)&AppLedTask3TCB, /* Create the led1 */
- (CPU_CHAR *)"App LedTask3",
- (OS_TASK_PTR ) AppLedTask3,
- (void *) 0,
- (OS_PRIO ) APP_LedTask3_PRIO,
- (CPU_STK *)&AppLedTask3Stk[0],
- (CPU_STK_SIZE) APP_LedTask3_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_LedTask3_STK_SIZE,
- (OS_MSG_QTY ) 0u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- OSTaskDel(&AppTaskStartTCB,&err);
- }
- //各个任务的实体函数
- void AppTouchPosition (void *p_arg)
- {
- OS_ERR err;
- uint16_t Touch_X,Touch_Y;
-
- while (DEF_TRUE)
- {
- //GUI_Exec();//刷新屏幕
- if (Get_Position(&Touch_X,&Touch_Y))//获取当前触摸值对应的像素坐标
- GUI_TOUCH_StoreState(Touch_X,Touch_Y);//将坐标储存在emWin的TouchPID里面,方便GUI系统调用
- else
- GUI_TOUCH_StoreState(-1,-1);//将坐标储存在emWin的TouchPID里面,方便GUI系统调用
- OSTimeDly(10,OS_OPT_TIME_DLY,&err);//每隔10MS获取一次触摸值
- }
- }
- void AppTouchpoint (void *p_arg)
- {
- OS_ERR err;
- uint16_t Touch_X,Touch_Y;
-
- GUI_CURSOR_Select(&GUI_CursorCrossM); //设置游标为十字形
- GUI_CURSOR_SetPosition(-1,-1); //设置游标的位置
- GUI_CURSOR_Show(); //显示游标
- GUI_SetPenSize(6);
- while (DEF_TRUE)
- {
- if (Get_Position(&Touch_X,&Touch_Y))
- {
- GUI_CURSOR_SetPosition(Touch_X,Touch_Y);
- GUI_DrawPoint(Touch_X,Touch_Y);
- }
- OSTimeDly(60,OS_OPT_TIME_DLY,&err);//每隔10MS获取一次触摸值
- }
- }
- void AppLedTask1(void *p_arg)
- {
- OS_ERR err;
-
- (void)p_arg;
-
- while (DEF_TRUE)
- { /* Task body, always written as an infinite loop. */
- LED1(1);
- OSTimeDly(500,OS_OPT_TIME_DLY,&err);
- LED1(0);
- OSTimeDly(500,OS_OPT_TIME_DLY,&err);
- }
- }
- void AppLedTask2(void *p_arg)
- {
- OS_ERR err;
-
- (void)p_arg;
-
- while (DEF_TRUE)
- { /* Task body, always written as an infinite loop. */
- LED2(1);
- OSTimeDly(500,OS_OPT_TIME_DLY,&err);
- LED2(0);
- OSTimeDly(500,OS_OPT_TIME_DLY,&err);
- }
- }
- void AppLedTask3(void *p_arg)
- {
- OS_ERR err;
-
- (void)p_arg;
-
- while (DEF_TRUE)
- { /* Task body, always written as an infinite loop. */
- LED3(1);
- OSTimeDly(1000,OS_OPT_TIME_DLY,&err);
- LED3(0);
- OSTimeDly(1000,OS_OPT_TIME_DLY,&err);
- }
- }
复制代码 请教高手,请教野火@fire ,到底应该是什么原因导致我写的触摸屏校准程序无法正常延时,不可能真有BUG吧?在下载此感谢! 无大侠工作室发布
|
-
多任务LED正常闪烁
-
触摸屏校准,使用OSTimeDly延时随机失效
|