注意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);
}
}
|