硬汉嵌入式论坛

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

[ThreadX全家桶] 进入threadx内核 启动不起来

[复制链接]

31

主题

55

回帖

148

积分

初级会员

积分
148
发表于 2024-10-30 10:09:50 | 显示全部楼层 |阅读模式
STM32H743BIT6,按照硬汉的模版移植的,进入内核后,创建一个任务,单步调试一直停留在
tx_thread_schedule.s文件中的



;    /* Wait here for the PendSV to take place.  */
;
__tx_wait_here
    B       __tx_wait_here                          ; Wait for the PendSV to happen

用STM32H743IIT6 就可以正常运行。

请教下大家有没有遇到过这样的问题?


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-10-30 11:29:48 | 显示全部楼层
卡在这里是OS启动失败了,PendSV没有正常执行。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-12-5 10:19:45 | 显示全部楼层
請問一下PendSV沒有正常執行 這該怎麼解決?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-12-6 08:53:52 | 显示全部楼层
namestanly 发表于 2024-12-5 10:19
請問一下PendSV沒有正常執行 這該怎麼解決?

这个帖子探讨过一次这个问题
ThreadX 一直卡在调度器里循环 __tx_ts_wait
https://www.armbbs.cn/forum.php?mod=viewthread&tid=115893
回复

使用道具 举报

31

主题

55

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2024-12-6 09:30:26 | 显示全部楼层
我现在是把HAL_IncTick放在汇编文件tx_initialize_low_level.s下能正常运行了
微信图片_20241206092800.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-12-7 09:07:57 | 显示全部楼层
qingtianxiayi 发表于 2024-12-6 09:30
我现在是把HAL_IncTick放在汇编文件tx_initialize_low_level.s下能正常运行了

这样的话,是程序里面没有为HAL库提供时间基准,我们的程序下面两种方式解决这个问题的

采用TIM7或者继续使用滴答定时器。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*
*	模块名称 : HAL库时基
*	文件名称 : stm32h7xx_hal_timbase_tim.c
*	版    本 : V1.0
*	说    明 : 用于为HAL库提供时间基准
*	修改记录 :
*		版本号  日期         作者       说明
*		V1.0    2018-07-29  Eric2013   正式发布
*
*	Copyright (C), 2018-2030, 安富莱电子 [url]www.armfly.com[/url]
*
*********************************************************************************************************
*/
#include "bsp.h"
#include "tx_api.h"
#include "tx_initialize.h"
#include "tx_thread.h"

/* 采用TIM7方案 */
#if 0

TIM_HandleTypeDef   TimHandle = {0};
	
/*
*********************************************************************************************************
*	函 数 名: System_Init
*	功能说明: 为HAL库配置1ms的时间基准,此函数会被HAL_Init和HAL_RCC_ClockConfig调用
*	形    参:TickPriority  定时器优先级
*	返 回 值: 无
*********************************************************************************************************
*/
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
{

	RCC_ClkInitTypeDef    clkconfig;
	uint32_t              uwTimclock, uwAPB1Prescaler = 0U;
	uint32_t              uwPrescalerValue = 0U;
	uint32_t              pFLatency;

	
	/* 复位定时器7 */
	TimHandle.Instance = TIM7;
	if(HAL_TIM_Base_DeInit(&TimHandle) != HAL_OK)
	{
		Error_Handler(__FILE__, __LINE__);
	}
	
	/* 设置TIM7的中断优先级并使能 */
	HAL_NVIC_SetPriority(TIM7_IRQn, TickPriority ,0U);
	HAL_NVIC_EnableIRQ(TIM7_IRQn);

	/* 使能TIM7时钟 */
	__HAL_RCC_TIM7_CLK_ENABLE();

	/*-----------------------------------------------------------------------
        System Clock source       = PLL (HSE)
        SYSCLK(Hz)                = 400000000 (CPU Clock)
        HCLK(Hz)                  = 200000000 (AXI and AHBs Clock)
        AHB Prescaler             = 2
        D1 APB3 Prescaler         = 2 (APB3 Clock  100MHz)
        D2 APB1 Prescaler         = 2 (APB1 Clock  100MHz)
        D2 APB2 Prescaler         = 2 (APB2 Clock  100MHz)
        D3 APB4 Prescaler         = 2 (APB4 Clock  100MHz)

        因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;
        因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;
        APB4上面的TIMxCLK没有分频,所以就是100MHz;

        APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
        APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17

        APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5
	----------------------------------------------------------------------- */
	/* 获取时钟配置 */
	HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);

	/* 获取APB1时钟 */
	uwAPB1Prescaler = clkconfig.APB1CLKDivider;

	/* 获得TIM7时钟 */
	if (uwAPB1Prescaler == RCC_HCLK_DIV1) 
	{
		uwTimclock = HAL_RCC_GetPCLK1Freq();
	}
	else
	{
		uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
	}

	/* TIM7分频到1MHz */
	uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);

	/* TIM7CLK = uwTimclock / (Period + 1) / (Prescaler + 1) = 1KHz */
	TimHandle.Init.Period = (1000000U / 1000U) - 1U;
	TimHandle.Init.Prescaler = uwPrescalerValue;
	TimHandle.Init.ClockDivision = 0;
	TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
	if(HAL_TIM_Base_Init(&TimHandle) == HAL_OK)
	{
		/* 启动TIM7 */
		return HAL_TIM_Base_Start_IT(&TimHandle);
	}

	/* 返回错误 */
	return HAL_ERROR;
}

/*
*********************************************************************************************************
*	函 数 名: HAL_SuspendTick
*	功能说明: 关闭TIM7
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void HAL_SuspendTick(void)
{
	__HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE);
}

/*
*********************************************************************************************************
*	函 数 名: HAL_ResumeTick
*	功能说明: 使能TIM7
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void HAL_ResumeTick(void)
{
	__HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
}

/*
*********************************************************************************************************
*	函 数 名: TIM7_IRQHandler
*	功能说明: TIM7定时器中断服务程序
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void TIM7_IRQHandler(void)
{
	if((TIM7->SR & TIM_FLAG_UPDATE) != RESET)
	{
		 TIM7->SR = ~ TIM_FLAG_UPDATE;
		 HAL_IncTick();
	}
}

#else
/*
*********************************************************************************************************
*	函 数 名: HAL_Delay
*	功能说明: 重定向毫秒延迟函数。替换HAL中的函数。因为HAL中的缺省函数依赖于Systick中断,如果在USB、SD卡
*             中断中有延迟函数,则会锁死。也可以通过函数HAL_NVIC_SetPriority提升Systick中断
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void HAL_Delay(uint32_t Delay)
{
	bsp_DelayMS(Delay);
}

HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
{
        return HAL_OK;
}

uint32_t HAL_GetTick (void)
{
        static uint32_t ticks = 0U;
        uint32_t i;

        if (_tx_thread_system_state == TX_INITIALIZE_IS_FINISHED)
        {
                return ((uint32_t)_tx_time_get());
        }

        /* 如果ThreadX还没有运行,采用下面方式 */
        for (i = (SystemCoreClock >> 14U); i > 0U; i--)
        {
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
        }
       
        return ++ticks;
}
#endif

/***************************** 安富莱电子 [url]www.armfly.com[/url] (END OF FILE) *********************************/
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-12-13 23:34:57 | 显示全部楼层
但凡是触发中断的地方都不能用单步调试。直接在PendSV函数中打一个断点,然后全速运行,不出意外就能运行到PendSV内的断点处。在调试其他中断程序的时候也是一样的,不能仅使用单步,否则无法进入中断处理函数。当然不排除PendSV触发失败的可能。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 20:37 , Processed in 0.308270 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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