硬汉嵌入式论坛

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

[μCOS-III] 反馈解决奇怪问题的方法

[复制链接]

16

主题

33

回帖

81

积分

初级会员

积分
81
发表于 2022-11-29 15:14:55 | 显示全部楼层 |阅读模式
为了众网友少走弯路,把我碰到的问题及解决方式共享出来,软件平台ucos3.03.00+lwip+fatfs
三个任务+一个网络发包任务,碰到的问题:
1.系统上电工作几分钟后,网络发包正常,其它3个任务不正常,仿真发现程序不能进入到3个任务设置的断点中,但初始化时候都能进入。
2.系统上电工作几小时到几十个小时后,网络发包也出现不正常的现象,ping也无法ping通


解决问题:
在执行函数delay_init(168)后马上初始化UCOSIII,之后创建启动任务之前添加宏OS_CRITICAL_ENTER(),在启动任务之后添加OS_CRITICAL_EXIT();
这样以上出现的问题就解决了,目前正在进一步测试,有问题及时反馈。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-11-30 10:37:54 | 显示全部楼层
注意uCOS创建的正确姿势,有效排查各种幺蛾子。
1、上电仅初始化系统时钟等和一个启动任务,不要做任何额外的东西,可以有效排查系统的启动问题和潜在的驱动初始化问题。
2、在启动任务里面创建驱动外设,可以排查驱动是否适合在OS下运行。
3、然创建各种任务和任务通信组件,可以逐个排查各个任务和通信组件问题。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: main
*	功能说明: 标准c程序入口。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
    OS_ERR  err;  
	
	/* HAL库,MPU,Cache,时钟等系统初始化 */
	System_Init();

	/* 内核开启前关闭HAL的时间基准 */
	HAL_SuspendTick();
	
	/* 初始化滴答时钟,在启动任务里面开启 */	
	BSP_OS_TickInit();
	
	/* 初始化uC/OS-III 内核 */
    OSInit(&err);  

	/* 创建一个启动任务(也就是主任务)。启动任务会创建所有的应用程序任务 */
	OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,  /* 任务控制块地址 */           
                 (CPU_CHAR     *)"App Task Start",  /* 任务名 */
                 (OS_TASK_PTR   )AppTaskStart,      /* 启动任务函数地址 */
                 (void         *)0,                 /* 传递给任务的参数 */
                 (OS_PRIO       )APP_CFG_TASK_START_PRIO, /* 任务优先级 */
                 (CPU_STK      *)&AppTaskStartStk[0],     /* 堆栈基地址 */
                 (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE / 10, /* 堆栈监测区,这里表示后10%作为监测区 */
                 (CPU_STK_SIZE  )APP_CFG_TASK_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_OPT_TASK_STK_CHK      使能检测任务栈,统计任务栈已用的和未用的
					OS_OPT_TASK_STK_CLR      在创建任务时,清零任务栈
					OS_OPT_TASK_SAVE_FP      如果CPU有浮点寄存器,则在任务切换时保存浮点寄存器的内容
				 */  
                 (OS_ERR       *)&err);

	/* 启动多任务系统,控制权交给uC/OS-III */
    OSStart(&err);                                               
    
    (void)&err;
    
    return (0);
}

/*
*********************************************************************************************************
*	函 数 名: AppTaskStart
*	功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器。本任务主要实现按键检测。
*	形    参: p_arg 是在创建该任务时传递的形参
*	返 回 值: 无
	优 先 级: 2
*********************************************************************************************************
*/
static  void  AppTaskStart (void *p_arg)
{
	OS_ERR      err;

   (void)p_arg;
	
	HAL_ResumeTick();
	
	CPU_Init(); /* 此函数要优先调用,因为外设驱动中使用的us和ms延迟是基于此函数的 */
 	bsp_Init();
	BSP_OS_TickEnable();
	
#if OS_CFG_STAT_TASK_EN > 0u
     OSStatTaskCPUUsageInit(&err);   
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_IntDisMeasMaxCurReset();
#endif
    
	/* 创建任务 */
    AppTaskCreate(); 

	/* 创建任务间通信机制 */
	AppObjCreate();	
	
    while (1)
	{  
		/* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
		bsp_ProPer1ms();
		OSTimeDly(1, OS_OPT_TIME_PERIODIC, &err);
    }
}





回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2022-11-30 16:29:30 | 显示全部楼层
eric2013 发表于 2022-11-30 10:37
注意uCOS创建的正确姿势,有效排查各种幺蛾子。
1、上电仅初始化系统时钟等和一个启动任务,不要做任何额 ...

感谢硬汉eric2013大侠的回复
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 18:23 , Processed in 0.156271 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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