硬件:H7
UCOS 版本:论坛上的UCOS III V3.8.0 移植
BOOT版本: V7-LCD的汉字显示和2D图形显示 加 一劳永逸
情况:
使用BOOT的版本跳转到0x8100000地址,运行AppTaskStart后,里面有一个OSTimeDly
按照例程那样进入系统,打印了2次循环后,就停止在OS_TickListInsert
[C] 纯文本查看 复制代码 while ((p_tcb2 != (OS_TCB *)0) && /* Find the appropriate position in the delta list. */
(delta >= p_tcb2->TickRemain)) {
delta -= p_tcb2->TickRemain;
p_tcb1 = p_tcb2;
p_tcb2 = p_tcb2->TickNextPtr;
}
其中p_tcb2->TickRemain = 0; delta = 1;因此永远跳不出这个循环
第一次循环p_tcb2->TickRemain = 0x16, delta=0xFFFFFFFF
第一次延时不为1ms,比较久,第二次就卡住,不能跳出循环
然后不要BOOT,直接把这个程序下载到0x0x8000000,也就是默认地址的时候,能够正常运行
之后,我把BOOT按照一劳永逸那样,直接跳转,情况和之前出问题一样
不知道哪里出现问题,好像是不能获取到滴答时钟的值
现在无从下手,不知道哪里配置有问题
[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);
}
[C] 纯文本查看 复制代码 static void AppTaskStart (void *p_arg)
{
OS_ERR err;
(void)p_arg;
HAL_ResumeTick();
CPU_Init(); /* 此函数要优先调用,因为外设驱动中使用的us和ms延迟是基于此函数的 */
bsp_Init();
BSP_OS_TickEnable();
mid_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err);
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
CPU_IntDisMeasMaxCurReset();
#endif
/* 创建任务 */
// AppTaskCreate();
/* 创建任务间通信机制 */
// AppObjCreate();
while (1)
{
rttPrintf(0, "Start loop\r\n");
/* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
bsp_ProPer1ms();
OSTimeDly(1, OS_OPT_TIME_PERIODIC, &err);
}
}
|