OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 159|回复: 4

多个任务,可以切换,但是第二个任务不能GUI_DispStringAt卡死,进入

[复制链接]

  离线 

11

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2017-4-16
在线时间
27 小时
发表于 2017-9-11 22:43:37 | 显示全部楼层 |阅读模式
1金钱
如题所示:我参考原子的手册进行移植stemwin加ucosiii,我的main函数如下所示:
[AppleScript] 纯文本查看 复制代码
int main(void) {
	OS_ERR err;
	HAL_Init(); /* See Note 1.                                          */
	BSP_SystemClkCfg(); /* Initialize CPU clock frequency to 216Mhz             */

	CPU_Init(); /* Initialize the uC/CPU services                       */

	Mem_Init(); /* Initialize Memory Managment Module                   */
	Math_Init(); /* Initialize Mathematical Module                       */

	CPU_IntDis(); /* Disable all Interrupts.                              */

	BSP_Init(); /* Initialize BSP functions                             */
	OSInit(&err); /* Init uC/OS-III.                                      */

	App_OS_SetAllHooks();
	MessQueue_Init ();

	OSTaskCreate(&AppTaskStartTCB, /* Create the start task                                */
	"App Task Start", AppTaskStart, 0u,
	APP_CFG_TASK_START_PRIO, &AppTaskStartStk[0u],
			AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE / 10u],
			APP_CFG_TASK_START_STK_SIZE, 0u, 0u, 0u,
			(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR ), &err);
	OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */

	while (DEF_ON) { /* Should Never Get Here.                               */

	}
}

在main函数中创建了一个任务AppTaskStart,该函数如下所示:
[AppleScript] 纯文本查看 复制代码
static void AppTaskStart(void *p_arg) {
	OS_ERR err;

	(void) p_arg;


	__HAL_RCC_CRC_CLK_ENABLE()
	  ;
	  GUI_Init ();
#if OS_CFG_STAT_TASK_EN > 0u
	OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running            */
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
	CPU_IntDisMeasMaxCurReset();
#endif

	APP_TRACE_DBG(("Creating Application Tasks\n\r"));
GUI_DispStringAt ("iysheng", 100, 200);
	AppTaskCreate(); /* Create Application tasks                             */

	while (DEF_TRUE) { /* Task body, always written as an infinite loop.       */
		//OSTaskDel((OS_TCB*) 0, &err);
	}
}

在该AppTaskStart任务中,我执行了GUI_DispStringAt ("iysheng", 100, 200);可以正常显示。
我通过AppTaskCreate新建了一个任务AppTaskObj0:
[AppleScript] 纯文本查看 复制代码
static void AppTaskCreate(void) {
	OS_ERR os_err;
	/* ---------- CREATE KERNEL OBJECTS TEST TASK --------- */
	OSTaskCreate(&AppTaskObj0TCB, "Kernel Objects Task 0", AppTaskObj0, 0,
	APP_CFG_TASK_OBJ0_PRIO, &AppTaskObj0Stk[0],
			AppTaskObj0Stk[APP_CFG_TASK_OBJ_STK_SIZE / 10u],
			APP_CFG_TASK_OBJ_STK_SIZE, 0u, 0u, 0,
			(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR ), &os_err);
}

AppTaskObj0任务中也执行了一次显示的函数GUI_DispStringAt ("iysheng", 0, 0);
[AppleScript] 纯文本查看 复制代码
static void AppTaskObj0(void *p_arg) {
	OS_ERR os_err;
	(void) p_arg;
	static uint8_t uline;
	static float ftemp;
	static uint32_t uitemp;
	static char rstr[64];
GUI_DispStringAt ("iysheng@163.com", 0, 0);
while (DEF_TRUE) {
}
}

现在的现象是任务可以切换到AppTaskObj0,但是执行该函数下的GUI_DispStringAt 时就出现卡死,进入Infinite_Loop
[AppleScript] 纯文本查看 复制代码
Default_Handler:
Infinite_Loop:
  b  Infinite_Loop

这是什么问题呢?


回复

使用道具 举报

  离线 

11

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2017-4-16
在线时间
27 小时
 楼主| 发表于 2017-9-11 23:02:53 | 显示全部楼层
如果把AppTaskObj0的优先级提高到比AppTaskStart的优先级高,那么会显示AppTaskObj0任务中的内容,但是低优先级的任务中的内容就不会显示了。也就是总是显示高优先级的任务中的内容,低优先级的任务的内容就不会显示,会卡死。
回复

使用道具 举报

  离线 

11

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2017-4-16
在线时间
27 小时
 楼主| 发表于 2017-9-12 14:49:49 | 显示全部楼层
主要问题,有两个:
1。每个任务都需要执行一次GUI_Init()函数。
2。我没有把自己调度出去,所以会出现上述问题。
经过我的修改,两个任务,任务一:
[AppleScript] 纯文本查看 复制代码
static void AppTaskObj0(void *p_arg)
{
    (void)p_arg;        /* 避免编译器告警 */
    OS_ERR      p_err;
    	  GUI_Init ();
while (1)
{
    GUI_DispStringAt ("AppTaskObj0", 0, 0);
    OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_DLY,&p_err);
//MainTask();
}
}

任务二:
[AppleScript] 纯文本查看 复制代码
static void AppTaskObj1(void *p_arg)
{
    (void)p_arg;        /* 避免编译器告警 */
    OS_ERR      p_err;
     GUI_Init ();
while (1)
{
    GUI_DispStringAt ("AppTaskObj1", 200, 200);
    OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_DLY,&p_err);
//Task_1();
}
}

现在可以输出两个任务中的内容了,
之前之所以卡死,是因为我没有在新的任务重GUI_Init()。


回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117144
金钱
117144
注册时间
2010-12-1
在线时间
898 小时
发表于 2017-9-12 23:48:40 | 显示全部楼层
帮顶
回复

使用道具 举报

  离线 

5

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-8-10
在线时间
19 小时
发表于 2017-11-11 22:03:12 | 显示全部楼层
iysheng 发表于 2017-9-12 14:49
主要问题,有两个:
1。每个任务都需要执行一次GUI_Init()函数。
2。我没有把自己调度出去,所以会出现上 ...

不是很明白为什么要在每个任务里面都执行一次 GUI_Init()?
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-20 21:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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