请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX的系统时钟节拍和STM32的HAL库时间基准都使用Systick的简单方法

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
发表于 2020-8-5 10:52:22 | 显示全部楼层 |阅读模式


ThreadX系统时钟节拍默认是用的滴答定时器,STM32的HAL库时间基准也是用的滴答定时器

对于这种情况,我们一般的情况下是使用其他的通用定时器替代,不过要额外的占用一点系统性能。

简单的处理办法是重新下面两个函数即可,让HAL库和ThreadX都使用滴答定时器:


  1. #include "tx_api.h"
  2. #include "tx_initialize.h"
  3. #include "tx_thread.h"


  4. HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
  5. {
  6.         return HAL_OK;
  7. }

  8. uint32_t HAL_GetTick (void)
  9. {
  10.         static uint32_t ticks = 0U;
  11.         uint32_t i;

  12.         if (_tx_thread_system_state == TX_INITIALIZE_IS_FINISHED)
  13.         {
  14.                 return ((uint32_t)_tx_time_get());
  15.         }

  16.         /* 如果ThreadX还没有运行,采用下面方式 */
  17.         for (i = (SystemCoreClock >> 14U); i > 0U; i--)
  18.         {
  19.                 __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  20.                 __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  21.         }
  22.        
  23.         return ++ticks;
  24. }
复制代码


评分

参与人数 1金币 +10 收起 理由
byccc + 10 赞一个!

查看全部评分

回复

使用道具 举报

7

主题

85

回帖

111

积分

初级会员

积分
111
发表于 2020-8-5 11:44:05 | 显示全部楼层
这个做法跟RTX5一样呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-5 11:59:02 | 显示全部楼层
JIKIMO 发表于 2020-8-5 11:44
这个做法跟RTX5一样呀

对,都统一成一个方案了,方便维护。
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2020-8-5 12:30:51 | 显示全部楼层
RTX5的教程还没放出来啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-5 13:31:52 | 显示全部楼层
lhaoyue 发表于 2020-8-5 12:30
RTX5的教程还没放出来啊

看来ThreadX的要先上线了。
回复

使用道具 举报

56

主题

901

回帖

1069

积分

至尊会员

积分
1069
发表于 2020-8-5 13:41:38 | 显示全部楼层
eric2013 发表于 2020-8-5 13:31
看来ThreadX的要先上线了。

有了新的旧人不要了啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-5 14:08:54 | 显示全部楼层
roguebear 发表于 2020-8-5 13:41
有了新的旧人不要了啊

此言差异,RTX5不管什么依然是主推对象,深得我心,用的也舒服。
我们H7-TOOL的唯一RTOS版就是采用RTX5全家桶。


H7-TOOL的RTX5全家桶一条龙服务固件开工,分纯手持版,高速USB版和网络版(2020-07-13)
http://www.armbbs.cn/forum.php?m ... 5541&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2020-8-5 16:14:58 | 显示全部楼层
好东西,标记一下,谢谢硬汉哥!
回复

使用道具 举报

5

主题

16

回帖

31

积分

新手上路

积分
31
发表于 2020-8-5 17:51:31 | 显示全部楼层
ST在HAL库里面也提供了一个文件,就是用于解决滴答定时器被占用的情况下,使用一个硬件定时器来替代,源码src目录下的stm32f4xx_hal_timebase_tim_template.c文件,直接添加到工程中就可以使用了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-5 17:57:38 | 显示全部楼层
1598025967 发表于 2020-8-5 17:51
ST在HAL库里面也提供了一个文件,就是用于解决滴答定时器被占用的情况下,使用一个硬件定时器来替代,源码s ...

对,就是要砍掉这种方式,搞了楼主位的方案,不再需要额外占用一个定时器中断,也停掉了1ms的中断资源。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-8-5 22:56:45 | 显示全部楼层
期待H7-TOOL用ThreadX和GuiX

评分

参与人数 1金币 +10 收起 理由
SEALGA + 10

查看全部评分

回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2020-8-6 10:55:08 | 显示全部楼层
HAL的时间基准能用DWT吗?反正也要用DWT做us级延时
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-6 11:02:05 | 显示全部楼层
lhaoyue 发表于 2020-8-6 10:55
HAL的时间基准能用DWT吗?反正也要用DWT做us级延时

可以的,用DWT的话,最长时间短点,400MHz主频时,大概就是2^32 / 400 000 000 ≈ 10秒
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2020-8-6 11:20:29 | 显示全部楼层
谢谢分享,学习了。
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2020-8-6 15:57:10 | 显示全部楼层
那开启内核前还需要关闭HAL时间基准HAL_SuspendTick();吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-6 15:59:34 | 显示全部楼层
lhaoyue 发表于 2020-8-6 15:57
那开启内核前还需要关闭HAL时间基准HAL_SuspendTick();吗?

不用了,不过可以保留着。

程序里面对两种时间基准方法做了个条件编译,调试阶段可以方便的切换。
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2020-8-6 18:14:34 | 显示全部楼层
硬汉,例程在哪呢?我在H7 tool中没找到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-7 01:44:45 | 显示全部楼层
lhaoyue 发表于 2020-8-6 18:14
硬汉,例程在哪呢?我在H7 tool中没找到

8月15号发布新版给大家。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-7 01:45:50 | 显示全部楼层
zhghfwsy 发表于 2020-8-5 22:56
期待H7-TOOL用ThreadX和GuiX

能搞的ThreadX的CMSIS-RTOS V2封装层就可以做。要不工作量太大。
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2020-8-7 10:02:15 | 显示全部楼层
eric2013 发表于 2020-8-7 01:45
能搞的ThreadX的CMSIS-RTOS V2封装层就可以做。要不工作量太大。

有CMSIS-RTOS V2封装层确实舒服很多,比如freertos 和 RTX5 直接复制task和其他功能声明就能用,学习成本低。就是现在还不会用CMSIS-driver,硬汉这有什么推荐的教程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-8-7 10:18:49 | 显示全部楼层
lhaoyue 发表于 2020-8-7 10:02
有CMSIS-RTOS V2封装层确实舒服很多,比如freertos 和 RTX5 直接复制task和其他功能声明就能用,学习成本 ...

用F4系列配的那个CMSIS-Driver学习,比较好上手,是经典的配置方法。H7的要略麻烦些。

资料的话,看RL-TCPnet V7.X配套的教程移植章节,里面有使用说明:

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1

回复

使用道具 举报

36

主题

2038

回帖

2146

积分

至尊会员

积分
2146
发表于 2020-8-7 10:42:58 | 显示全部楼层


为CPU减负
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 2020-9-24 15:28:04 | 显示全部楼层
硬汉,就是ThreadX的系统时钟节拍和HAL库时基都使用滴答定时器对吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-9-24 15:45:22 | 显示全部楼层
Jacob_xsbn 发表于 2020-9-24 15:28
硬汉,就是ThreadX的系统时钟节拍和HAL库时基都使用滴答定时器对吧?

对的。
回复

使用道具 举报

24

主题

70

回帖

142

积分

初级会员

积分
142
发表于 2020-9-29 15:09:30 | 显示全部楼层
基于cubemx生成的工程,对tick做了一点小修改。
/*
*********************************************************************************************************
*
*   模块名称 : ThreadX底层初始化
*   文件名称 : tx_init_low_level.c
*   版    本 : V1.0
*   说    明 : 底层初始化
*
*   修改记录 :
*       版本号  日期        作者     说明
*       V1.0    2020-09-18 armfly  正式发布
*
*   Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "stm32h7xx_hal.h"
#include "tx_api.h"
#include "tx_initialize.h"
#include "tx_thread.h"
#include "tx_timer.h"


#if 0
#define SYSTEM_CLOCK =  400000000;             /* 系统主频 */
const uint32_t SYSTICK_CYCLES = ((SYSTEM_CLOCK / 1000) -1); /* 周期配置 */
#endif
extern void OS_SysTick_Handler(void);
extern VOID  _tx_timer_interrupt(VOID);


/*
*********************************************************************************************************
*   函 数 名: _tx_initialize_low_level
*   功能说明: 底层初始化
*   形    参: 无
*   返 回 值: 无
*********************************************************************************************************
*/
VOID  _tx_initialize_low_level(VOID)
{
#if 0
    /* 关闭中断 */
    __set_PRIMASK(1);

    /* 下面这两个用不上,直接注释掉 */
//    _tx_initialize_unused_memory = __INITIAL_SP;
//    _tx_thread_system_stack_ptr = __Vectors;

    /* 配置滴答定时器 */
    SysTick_Config(SYSTICK_CYCLES);
#endif
    /* 设置SVC中断优先级并使能 */
    HAL_NVIC_SetPriority(SVCall_IRQn, 15, 0);
    HAL_NVIC_EnableIRQ(SVCall_IRQn);

    /* 设置PendSV中断优先级并使能 */
    HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
    HAL_NVIC_EnableIRQ(PendSV_IRQn);

#if 0
    /* 设置Systick中断优先级并使能 */
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(SysTick_IRQn);
#endif
}

/*
*********************************************************************************************************
*   函 数 名: OS_SysTick_Handler
*   功能说明: 滴答定时器中断服务程序
*   形    参: 无
*   返 回 值: 无
*********************************************************************************************************
*/
void OS_SysTick_Handler(void)
{
    HAL_IncTick();

    if (_tx_thread_system_state == TX_INITIALIZE_IS_FINISHED)
        _tx_timer_interrupt();
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-9-30 10:05:54 | 显示全部楼层
utyang 发表于 2020-9-29 15:09
基于cubemx生成的工程,对tick做了一点小修改。
/*
************************************************** ...

也可以。
新发的这几个例子为了倒腾ST那个USB库,也把inctick放在滴答中断钩子函数里面了

基于STM32H7的uCOS-III + FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100125

基于STM32H7的FreeRTOS+ FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100127


基于STM32H7的uCOS-II + FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100126
回复

使用道具 举报

73

主题

1189

回帖

1408

积分

至尊会员

积分
1408
发表于 2020-12-14 09:53:27 | 显示全部楼层
eric2013 发表于 2020-9-30 10:05
也可以。
新发的这几个例子为了倒腾ST那个USB库,也把inctick放在滴答中断钩子函数里面了

硬汉哥,我使用dwt作为hal的系统时钟,会不会效率比较低?
另外,在裸机里面开启了dwt的功能,会不会降低cpu的效率?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2020-12-14 13:19:06 | 显示全部楼层
wdliming 发表于 2020-12-14 09:53
硬汉哥,我使用dwt作为hal的系统时钟,会不会效率比较低?
另外,在裸机里面开启了dwt的功能,会不会降 ...

DWT是硬件时钟时钟周期计数器,不存在效率低的问题。
回复

使用道具 举报

73

主题

1189

回帖

1408

积分

至尊会员

积分
1408
发表于 2020-12-14 13:26:38 | 显示全部楼层
eric2013 发表于 2020-12-14 13:19
DWT是硬件时钟时钟周期计数器,不存在效率低的问题。

好的谢谢
回复

使用道具 举报

44

主题

557

回帖

694

积分

金牌会员

积分
694
发表于 2021-4-16 09:54:55 | 显示全部楼层
标记一下,正计现学threadx用于项目
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-10-25 16:30:42 | 显示全部楼层
硬汉哥,threadX好像没看到类似RTThread的那种命令行,可以自定义命令的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2022-10-25 16:43:05 | 显示全部楼层
鄢一安 发表于 2022-10-25 16:30
硬汉哥,threadX好像没看到类似RTThread的那种命令行,可以自定义命令的

可以移植个uCShell

stm32F103_threadx_ucshell移植工程采用SEGGER_RTT输入输出
https://www.armbbs.cn/forum.php? ... 3352&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-10-26 09:11:10 | 显示全部楼层
eric2013 发表于 2022-10-25 16:43
可以移植个uCShell

stm32F103_threadx_ucshell移植工程采用SEGGER_RTT输入输出

谢谢大佬!!!
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2023-8-11 19:36:37 | 显示全部楼层
发现这种用法导致初始化LCD时一定概率导致初始化失败黑屏,不知是不是时序错乱。但是改用tim6就好了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2023-8-12 00:35:44 | 显示全部楼层
qianguyizhe 发表于 2023-8-11 19:36
发现这种用法导致初始化LCD时一定概率导致初始化失败黑屏,不知是不是时序错乱。但是改用tim6就好了。

如果用到SDRAM了,估计是SDRAM里面有个延迟的时间短了
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2023-8-14 10:09:21 | 显示全部楼层
eric2013 发表于 2023-8-12 00:35
如果用到SDRAM了,估计是SDRAM里面有个延迟的时间短了

我是在threadx初始化完成后才初始化的lcd,按理说,这时候,systick时基已经用起来了,和tim6应该没区别了呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2023-8-14 10:15:04 | 显示全部楼层
qianguyizhe 发表于 2023-8-14 10:09
我是在threadx初始化完成后才初始化的lcd,按理说,这时候,systick时基已经用起来了,和tim6应该没区别 ...

我们这边V5和V6都是这么用的,没问题。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2023-8-19 19:14:25 | 显示全部楼层
eric2013 发表于 2023-8-14 10:15
我们这边V5和V6都是这么用的,没问题。

确实,前几天搞定了这个问题,是开了编译优化导致的时序问题,调了一下,好了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106336
QQ
 楼主| 发表于 2023-8-21 00:51:02 | 显示全部楼层
qianguyizhe 发表于 2023-8-19 19:14
确实,前几天搞定了这个问题,是开了编译优化导致的时序问题,调了一下,好了

好的,解决了就好。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 15:46 , Processed in 0.345802 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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