OpenEdv-开源电子网

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

移植UCOSIII 一上电就进入OS_IdleTask()这个函数,为什么?

[复制链接]

9

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-9-1
在线时间
78 小时
发表于 2018-1-31 21:13:57 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "touch.h"
#include "flash.h"
#include "key.h"
#include "led.h"
#include "usart.h"
#include "sarm.h"
#include "malloc.h"
#include "GUI.h"
#include "timer.h"
#include "GUIDemo.h"
#include "includes.h"

//¿aê¼èÎÎñ
#define START_TASK_PRIO                         3
#define START_STK_SIZE                                256
OS_TCB         StartTasTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *p_arg);
//LED0 ÏÔê¾èÎÎñ
#define LED0_START_TASK_PRIO                         4
#define LED0_START_STK_SIZE                                128
OS_TCB         LED0_StartTasTCB;
CPU_STK LED0_START_TASK_STK[LED0_START_STK_SIZE];
void led0_task(void *p_arg);
//LED1 ÏÔê¾èÎÎñ
#define LED1_START_TASK_PRIO                         5
#define LED1_START_STK_SIZE                                128
OS_TCB         LED1_StartTasTCB;
CPU_STK LED1_START_TASK_STK[LED1_START_STK_SIZE];
void led1_task(void *p_arg);
int main(void)
{                      
                OS_ERR err;
                CPU_SR_ALLOC();
    /* 3õê¼»ˉ */

                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
//                uart_init(115200);
                delay_init(72);                   
          LED_Init();
//                KEY_Init();
//                SRAM_Config();
//    TFT_Init();
//                FLASH_Init();
//                delay_ms(500);
//                TOUCH_Init();
//                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);   
//                MEMORY_Init();
//                WM_SetCreateFlags(WM_CF_MEMDEV);
//                GUI_Init();
               
               
                OSInit(&err);
                OS_CRITICAL_ENTER();
                OSTaskCreate((OS_TCB     *)&StartTasTCB,
                 (CPU_CHAR   *)"Stat Task",
                 (OS_TASK_PTR )start_task,
                 (void       *)0,
                 (OS_PRIO     )START_TASK_PRIO,
                 (CPU_STK    *)START_TASK_STK[0],
                 (CPU_STK_SIZE)START_STK_SIZE/10,
                 (CPU_STK_SIZE)START_STK_SIZE,
                 (OS_MSG_QTY  )0,
                 (OS_TICK     )0,
                 (void       *)0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);
                               
                OS_CRITICAL_EXIT();
                OSStart(&err);
       
}
void start_task(void *p_arg)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;

        CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);          //í3¼ÆèÎÎñ               
#endif
       
#ifdef CPU_CFG_INT_DIS_MEAS_EN                //èç1ûê1ÄüáË2aá¿ÖD¶Ï1رÕê±¼ä
    CPU_IntDisMeasMaxCurReset();       
#endif

#if        OS_CFG_SCHED_ROUND_ROBIN_EN  //μ±ê1óÃê±¼äÆ¬ÂÖ×aμÄê±oò
         //ê1Äüê±¼äÆ¬ÂÖ×aμ÷¶è1|Äü,ê±¼äÆ¬3¤¶èÎa1¸öÏμí3ê±Öó½úÅÄ£¬¼è1*5=5ms
        OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif               
       
        OS_CRITICAL_ENTER();
        OSTaskCreate((OS_TCB     *)&LED0_StartTasTCB,
                 (CPU_CHAR   *)"led0 Task",
                 (OS_TASK_PTR )led0_task,
                 (void       *)0,
                 (OS_PRIO     )LED0_START_TASK_PRIO,
                 (CPU_STK    *)LED0_START_TASK_STK[0],
                 (CPU_STK_SIZE)LED0_START_STK_SIZE/10,
                 (CPU_STK_SIZE)LED0_START_STK_SIZE,
                 (OS_MSG_QTY  )0,
                 (OS_TICK     )0,
                 (void       *)0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);
        OSTaskCreate((OS_TCB     *)&LED1_StartTasTCB,
                 (CPU_CHAR   *)"led1 Task",
                 (OS_TASK_PTR )led1_task,
                 (void       *)0,
                 (OS_PRIO     )LED1_START_TASK_PRIO,
                 (CPU_STK    *)LED1_START_TASK_STK[0],
                 (CPU_STK_SIZE)LED1_START_STK_SIZE/10,
                 (CPU_STK_SIZE)LED1_START_STK_SIZE,
                 (OS_MSG_QTY  )0,
                 (OS_TICK     )0,
                 (void       *)0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);
                                               
        OS_TaskSuspend((OS_TCB *)&StartTasTCB,&err);
        OS_CRITICAL_EXIT();
}
void led0_task(void *p_arg)
{
        OS_ERR err;
        while(1)
        {
                LED0=~LED0;
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);//Ñóê±5ms
        }
}
void led1_task(void *p_arg)
{
        OS_ERR err;
        while(1)
        {
                LED1=~LED1;
                OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_PERIODIC,&err);//Ñóê±5ms
        }
}


最佳答案

查看完整内容[请看2#楼]

每个任务都会调用延时函数,设置多少个节拍调度一次,节拍没到,就没有调度,就会进入空闲任务。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-9-1
在线时间
78 小时
 楼主| 发表于 2018-2-2 12:29:15 | 显示全部楼层
问题解决了,原来是栈地址写错,导致创建任务函数一直识别到栈地址为0所以创建任务失败输出 err = OS_ERR_STK_INVALID,
1517545722(1).jpg
1517545683(1).jpg
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2014-6-27
在线时间
980 小时
发表于 2018-1-31 21:13:58 | 显示全部楼层
笨鸟多飞 发表于 2018-2-1 13:57
是啊  可是我创建了任务  怎么会不去调度呢,两个LED灯额周期闪烁,查看 err 错误码显示就是上面那个

每个任务都会调用延时函数,设置多少个节拍调度一次,节拍没到,就没有调度,就会进入空闲任务。
回复

使用道具 举报

9

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-9-1
在线时间
78 小时
 楼主| 发表于 2018-1-31 21:14:40 | 显示全部楼层
根据教程 ucosiii + emwin  修改的
回复

使用道具 举报

9

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-9-1
在线时间
78 小时
 楼主| 发表于 2018-1-31 21:25:20 | 显示全部楼层
创建完任务错误码是 :OS_ERR_STK_INVALID (0x6e2f)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-2-1 01:08:01 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2014-6-27
在线时间
980 小时
发表于 2018-2-1 08:51:08 | 显示全部楼层
这个是系统的空闲任务,如果你没有创建任务运行系统,系统就跑空闲任务,如果有其他任务,在没有调度其他任务的情况下,就跑空闲任务,反正就是无论如何,系统都有事情做。
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-2-1 09:04:10 | 显示全部楼层
帮顶帮顶帮顶
qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

9

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-9-1
在线时间
78 小时
 楼主| 发表于 2018-2-1 13:57:21 | 显示全部楼层
TinyBoy 发表于 2018-2-1 08:51
这个是系统的空闲任务,如果你没有创建任务运行系统,系统就跑空闲任务,如果有其他任务,在没有调度其他任 ...

是啊  可是我创建了任务  怎么会不去调度呢,两个LED灯额周期闪烁,查看 err 错误码显示就是上面那个
回复

使用道具 举报

9

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-9-1
在线时间
78 小时
 楼主| 发表于 2018-2-2 12:29:42 | 显示全部楼层
谢谢各位  现在结贴。
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2020-12-14
在线时间
9 小时
发表于 2021-2-24 17:28:38 | 显示全部楼层
老哥,我的也是进入系统OS_IdleTask(),能交流下吗
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-5-1
在线时间
5 小时
发表于 2021-3-18 19:49:52 | 显示全部楼层
hibaby 发表于 2021-2-24 17:28
老哥,我的也是进入系统OS_IdleTask(),能交流下吗

你好,我也遇到这个问题,你的问题解决了吗?能否交流下。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 14:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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