硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2634|回复: 6
收起左侧

[emWin] STemWin+FreeRTOS在任务优先级低的任务中显示字符串等语句均不执行

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-7-4 10:54:34 | 显示全部楼层 |阅读模式
最近学习STemWin+FreeRTOS,在STM32F1上执行,采用外接12864OLED屏,移植成功,建立一个任务并成功打印字符串、汉字显示等。但是如果在工程中增加一个任务,任务优先级如果与这个显示任务优先级相同或更高,则这个显示任务就不向液晶屏输出内容,哪怕这个任务什么都不执行,且将任务内的delay时间设置很长。液晶屏采用驱动是LCDConf_Lin_Template.c。其他设置都试过,只与显示任务优先级有关,请教大神是何原因?如果在执行完显示字符串命令后延时2秒钟,再在这个任务中创建窗口,则窗口能正常显示,前面的两秒钟液晶屏无显示。
如果在高优先级任务和低优先级任务中都有液晶屏显示命令,显示内容和位置不同,在低优先级任务中间隔2秒显示一次,高优先级任务中间隔1秒显示一次,则只会显示高优先级任务内容,同时间隔9-10秒左右出现一次显示混乱,混乱持续时间一秒内,时间不等。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-7-4 11:00:42 | 显示全部楼层
显示混乱的原因找到了,是因为两个任务里面都调用的刷OLED的函数,在低任务中刷OLED的过程中会被高优先级任务中断,重新刷,就会出问题,把低优先级任务中刷OLED的函数禁掉就正常显示了,但只显示高优先级任务打印的内容。
回复

使用道具 举报

36

主题

2050

回帖

2158

积分

至尊会员

积分
2158
发表于 2019-7-4 11:59:05 | 显示全部楼层
你写的内容读者有点累,直接上两个任务的代码看下
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-7-4 15:53:56 | 显示全部楼层
  两个任务的定义
/* definition and creation of myTaskOled */
  osThreadDef(myTaskOled, StartTask02, osPriorityNormal, 0, 300);
  myTaskOledHandle = osThreadCreate(osThread(myTaskOled), NULL);

  /* definition and creation of myTask04 */
  osThreadDef(myTask04, StartTask04, osPriorityNormal, 0, 128);
  myTask04Handle = osThreadCreate(osThread(myTask04), NULL);

/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  LCD_init();
  GUI_UC_SetEncodeUTF8();  
  GUI_SetBkColor(GUI_BLACK);
  GUI_Clear();
  GUI_SetFont(&GUI_FontFontKai20_4pp);
  GUI_DispStringHCenterAt("中国",64,0);
  GUI_DispStringHCenterAt("科学",64,20);
    GUI_SetFont(&GUI_FontFontSong15);
  GUI_DispStringAt("测量",0,45);
  GUI_SetFont(GUI_FONT_6X8);
  GUI_DispStringAt("V1.0",105,50);
  GUI_Delay(100);
  LCD_show();
  osDelay(2000);
  /* Infinite loop */
  for(;;)
  {
//    GUI_FillRect(0,0,20,20);
//    LCD_show();
//    GUI_FillCircle(10,40,10);
//    LCD_show();
    MainTask();
    osDelay(2000);
  }
  /* USER CODE END StartTask02 */
}

/* USER CODE BEGIN Header_StartTask04 */
/**
* @brief Function implementing the myTask04 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask04 */
void StartTask04(void const * argument)
{
  /* USER CODE BEGIN StartTask04 */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1000);
  }
  /* USER CODE END StartTask04 */
}
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-7-8 16:45:00 | 显示全部楼层
没有使用STemWin+FreeRTOS遇到类似问题的吗?
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-7-9 15:34:03 | 显示全部楼层
问题解决,标记一下,万一有遇到相同问题的人呢!
把GUIConf.c文件里GUITASK_SetMaxTask(3)改为GUITASK_SetMaxTask(1)就可以正常显示。
实际应用是在一个任务里面管理emWin,其他任务不调用显示,按理说不应该有影响啊?!实际上还是不明白为什么!
回复

使用道具 举报

5

主题

27

回帖

42

积分

新手上路

积分
42
发表于 2019-7-9 17:05:28 | 显示全部楼层
zhengxk 发表于 2019-7-9 15:34
问题解决,标记一下,万一有遇到相同问题的人呢!
把GUIConf.c文件里GUITASK_SetMaxTask(3)改为GUITASK_Se ...

应该是emWin多线程处理机制是有问题的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-18 07:40 , Processed in 0.247693 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表