OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4977|回复: 6

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

[复制链接]

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
发表于 2017-9-11 22:43:37 | 显示全部楼层 |阅读模式
1金钱
如题所示:我参考原子的手册进行移植stemwin加ucosiii,我的main函数如下所示:[mw_shl_code=applescript,true]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.                               */

        }
}[/mw_shl_code]
在main函数中创建了一个任务AppTaskStart,该函数如下所示:
[mw_shl_code=applescript,true]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);
        }
}[/mw_shl_code]
在该AppTaskStart任务中,我执行了GUI_DispStringAt ("iysheng", 100, 200);可以正常显示。
我通过AppTaskCreate新建了一个任务AppTaskObj0:
[mw_shl_code=applescript,true]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);
}[/mw_shl_code]
AppTaskObj0任务中也执行了一次显示的函数GUI_DispStringAt ("iysheng", 0, 0);
[mw_shl_code=applescript,true]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) {
}
}[/mw_shl_code]
现在的现象是任务可以切换到AppTaskObj0,但是执行该函数下的GUI_DispStringAt 时就出现卡死,进入Infinite_Loop
[mw_shl_code=applescript,true]Default_Handler:
Infinite_Loop:
  b  Infinite_Loop[/mw_shl_code]
这是什么问题呢?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
 楼主| 发表于 2017-9-12 14:49:49 | 显示全部楼层
主要问题,有两个:
1。每个任务都需要执行一次GUI_Init()函数。
2。我没有把自己调度出去,所以会出现上述问题。
经过我的修改,两个任务,任务一:
[mw_shl_code=applescript,true]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();
}
}[/mw_shl_code]
任务二:
[mw_shl_code=applescript,true]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();
}
}[/mw_shl_code]
现在可以输出两个任务中的内容了,
之前之所以卡死,是因为我没有在新的任务重GUI_Init()。


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

5

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
 楼主| 发表于 2018-3-7 11:55:28 | 显示全部楼层
hwl1023 发表于 2017-11-11 22:03
不是很明白为什么要在每个任务里面都执行一次 GUI_Init()?

我也没有搞清楚,感觉有些任务可以不执行GUI_Init()就可以正常显示,有些任务必须要执行GUI_Init()才能正常显示,不知道会不会是GNU编译器的问题。
回复

使用道具 举报

24

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
497
金钱
497
注册时间
2016-3-16
在线时间
201 小时
发表于 2018-3-7 14:22:56 | 显示全部楼层
iysheng 发表于 2018-3-7 11:55
我也没有搞清楚,感觉有些任务可以不执行GUI_Init()就可以正常显示,有些任务必须要执行GUI_Init()才 ...

在每个线程(任务)的循环中,加入OSTimeDly(),让其他线程被调度器调度到。
路漫漫其修远兮,戒骄戒躁。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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