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);
}
}
systemtick中断没搞好? 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);
} 这个做过一个Demo
基于STM32H7的BOOT和APP代码都使用最新版uCOS-III V3.08.00的案例,相互之间任意跳转
https://www.armbbs.cn/forum.php?mod=viewthread&tid=97260
找到问题点了
system_stm32h7xx.c里面的
#define VECT_TAB_OFFSET0x00100000UL
这个要同时修改,当时以为跑起来了,就不用修改这个偏移量
页:
[1]