flying1104 发表于 2023-12-21 17:09:28

UCOS 使用 BOOT引导后 不能跳出 OSTimeDly


硬件:H7
UCOS 版本:论坛上的UCOS III V3.8.0 移植
BOOT版本: V7-LCD的汉字显示和2D图形显示 加 一劳永逸

情况:
使用BOOT的版本跳转到0x8100000地址,运行AppTaskStart后,里面有一个OSTimeDly
按照例程那样进入系统,打印了2次循环后,就停止在OS_TickListInsert
    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按照一劳永逸那样,直接跳转,情况和之前出问题一样

不知道哪里出现问题,好像是不能获取到滴答时钟的值
现在无从下手,不知道哪里配置有问题

int main(void)
{
    OS_ERRerr;
       
        /* 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,   /* 堆栈基地址 */
               (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);
}

staticvoidAppTaskStart (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);
    }
}

h_007 发表于 2023-12-21 20:29:52

systemtick中断没搞好?

flying1104 发表于 2023-12-22 08:14:29

h_007 发表于 2023-12-21 20:29
systemtick中断没搞好?

中断是被注释掉的
#if uCOS_EN == 0
/*
*********************************************************************************************************
*        函 数 名: SysTick_Handler
*        功能说明: 系统嘀嗒定时器中断服务程序。启动文件中引用了该函数。
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void SysTick_Handler(void)
{
        HAL_IncTick();        /* ST HAL库的滴答定时中断服务程序 */
       
        if (g_ucEnableSystickISR == 0)
        {
                return;
        }
       
        SysTick_ISR();        /* 安富莱bsp库的滴答定时中断服务程序 */
}
#endif

uCOS_EN是使能的

#define bsp_ProPer1msSysTick_ISR
进入滴答中断,使用的是OS的
    while (1)
        {
          rttPrintf(0, "Start loop\r\n");
                /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
                bsp_ProPer1ms();
                OSTimeDly(1, OS_OPT_TIME_PERIODIC, &err);
    }

eric2013 发表于 2023-12-22 09:02:38

这个做过一个Demo

基于STM32H7的BOOT和APP代码都使用最新版uCOS-III V3.08.00的案例,相互之间任意跳转
https://www.armbbs.cn/forum.php?mod=viewthread&tid=97260

flying1104 发表于 2023-12-22 09:22:38

找到问题点了
system_stm32h7xx.c里面的
#define VECT_TAB_OFFSET0x00100000UL
这个要同时修改,当时以为跑起来了,就不用修改这个偏移量
页: [1]
查看完整版本: UCOS 使用 BOOT引导后 不能跳出 OSTimeDly