打印
[其他ST产品]

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

[复制链接]
282|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2025-2-27 12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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
        }
}

使用特权

评论回复
沙发
香水城| | 2025-2-27 14:42 | 只看该作者
没有创建其它任务?还是其它任务因为配置的原因没正常启动?

使用特权

评论回复
板凳
江河千里| | 2025-3-14 01:01 | 只看该作者
在移植 UCOSIII 时,如果一上电就进入 OS_IdleTask() 函数,通常是因为系统未能正确启动或初始化,导致系统直接进入空闲任务。

使用特权

评论回复
地板
别乱了阵脚| | 2025-3-14 02:25 | 只看该作者
用户任务未创建或未启动,导致系统没有其他任务可运行,直接进入空闲任务。

使用特权

评论回复
5
淡漠安然| | 2025-3-14 03:51 | 只看该作者
可能是用户任务的优先级设置过低,导致系统无法调度到该任务。

使用特权

评论回复
6
光辉梦境| | 2025-3-14 04:32 | 只看该作者
UCOSIII 的系统时钟(SysTick)未正确配置,导致任务调度无法正常工作。

使用特权

评论回复
7
一秒落纱| | 2025-3-14 05:23 | 只看该作者
一般可能是任务堆栈设置过小,导致任务无法正常运行。

使用特权

评论回复
8
远山寻你| | 2025-3-14 06:16 | 只看该作者
系统时钟中断或其他关键中断未启用,导致任务调度无法进行。

使用特权

评论回复
9
夜阑风雨| | 2025-3-14 07:26 | 只看该作者
有可能是UCOSIII 初始化失败,导致系统无法正常启动。

使用特权

评论回复
10
冰春彩落下| | 2025-3-14 08:04 | 只看该作者
硬件初始化未完成,导致系统无法正常运行。你检查一下你的硬件初始化部分呗

使用特权

评论回复
11
三生万物| | 2025-3-14 09:37 | 只看该作者
使用调试工具(如 Keil MDK STM32CubeIDE)检查任务状态,确认任务是否已创建并启动。

使用特权

评论回复
12
暖了夏天蓝了海| | 2025-3-14 10:21 | 只看该作者
建议检查 OS_TCB 结构体,确认任务是否处于就绪状态。检查 OS_IdleTask() 的调用路径,确认系统为何直接进入空闲任务。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2109

主题

7957

帖子

11

粉丝