硬汉嵌入式论坛

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

[μCOS-III] UCOS 使用 BOOT引导后 不能跳出 OSTimeDly

[复制链接]

5

主题

35

回帖

50

积分

初级会员

积分
50
发表于 2023-12-21 17:09:28 | 显示全部楼层 |阅读模式

硬件: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);
    }
}


回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2023-12-21 20:29:52 | 显示全部楼层
systemtick中断没搞好?
回复

使用道具 举报

5

主题

35

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2023-12-22 08:14:29 | 显示全部楼层
h_007 发表于 2023-12-21 20:29
systemtick中断没搞好?

中断是被注释掉的
[C] 纯文本查看 复制代码
#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_ProPer1ms  SysTick_ISR
进入滴答中断,使用的是OS的
[C] 纯文本查看 复制代码
    while (1)
	{  
	    rttPrintf(0, "Start loop\r\n");
		/* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
		bsp_ProPer1ms();
		OSTimeDly(1, OS_OPT_TIME_PERIODIC, &err);
    }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 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
回复

使用道具 举报

5

主题

35

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2023-12-22 09:22:38 | 显示全部楼层
找到问题点了
system_stm32h7xx.c里面的
#define VECT_TAB_OFFSET  0x00100000UL
这个要同时修改,当时以为跑起来了,就不用修改这个偏移量
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 09:00 , Processed in 0.181488 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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