硬汉嵌入式论坛

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

[ThreadX全家桶] Threadx内核给的模板中的延时函数会干扰任务的时序

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-1-20 09:40:50 | 显示全部楼层 |阅读模式
各个任务不存在延时时候,HAL时间基准和Threadx时间基准是准的(串口发送在 :App Task COM任务 【浮点数串口打印】,各个优先级任务无延时)


当任务存在2ms延时时,延时函数用的大哥提供的延时,会对优先级低的任务造成1ms的干扰(串口发送在 :App Task COM任务 【浮点数串口打印】,延时在:App Task UserIF任务【按键消息处理】)

当任务存在20ms延时时,延时函数用的大哥提供的延时,会对优先级低的任务造成19ms的干扰(串口发送在 :App Task COM任务 【浮点数串口打印】,延时在:App Task UserIF任务【按键消息处理】)

综上感觉硬汉大哥的延时存在有阻塞任务的问题,也不知大哥有什么方案进行修改呢?

回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-1-20 09:47:56 | 显示全部楼层
我感觉在微秒延时的时候用大哥的程序就可以,但是在毫秒的延时中用tx_thread_sleep
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-1-20 09:50:23 | 显示全部楼层
我感觉在微秒的延时中用大哥的程序,在毫秒的延时中用tx_thread_sleep()来代替效果可能更好,但是对于裸机会跑空。。。。。。。但对于Threadx现阶段这个就够了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2021-1-20 12:05:03 | 显示全部楼层
影舞道 发表于 2021-1-20 09:50
我感觉在微秒的延时中用大哥的程序,在毫秒的延时中用tx_thread_sleep()来代替效果可能更好,但是对于裸机 ...

每太听懂楼主的意思,楼主说的是在ThreadX里面调用bsp_DelayMS,bsp_DelayUS这两个函数?
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-1-20 12:44:55 | 显示全部楼层
是的,大哥的程序使用的延时会阻塞任务
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-1-20 12:53:33 | 显示全部楼层
eric2013 发表于 2021-1-20 12:05
每太听懂楼主的意思,楼主说的是在ThreadX里面调用bsp_DelayMS,bsp_DelayUS这两个函数?

就是我测试的时候threadx的时候用的大哥的延时,如果在所有的任务中不使用bsp_DelayMs,和bsp_DelayUS这两个函数所有的时序是稳定的,如果使用了会对Threadx的优先级高的任务不产生影响,但会对优先级低的任务产生毫秒级别的干扰,大致是如果在一个任务使用bsp_DelayMs(20),那么比他优先级低得任务会增加20ms的延时。我是用HAL_GetTick();来判断的
               App_Printf(">>Tick:%u\r\n",HAL_GetTick()-TICK);;
              TICK=HAL_GetTick();
              tx_thread_sleep(1000);
回复

使用道具 举报

4

主题

1445

回帖

1457

积分

至尊会员

积分
1457
发表于 2021-1-20 13:38:11 | 显示全部楼层
那个延时函数本来就是阻塞的哦
回复

使用道具 举报

4

主题

1445

回帖

1457

积分

至尊会员

积分
1457
发表于 2021-1-20 13:40:27 | 显示全部楼层
  1. void bsp_DelayUS(uint32_t _ulDelayTime)
  2. {
  3.     uint32_t tCnt, tDelayCnt;
  4.         uint32_t tStart;
  5.                
  6.         tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
  7.         tCnt = 0;
  8.         tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                      

  9.         while(tCnt < tDelayCnt)
  10.         {
  11.                 tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */       
  12.         }
  13. }
复制代码
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-1-21 10:03:40 | 显示全部楼层

哈哈谢谢啦,但还有一事不明,就是如阻塞任务也应该只会阻塞当前的任务,而对其他任务应该没有影响的呀,可实际情况并不是啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 02:03 , Processed in 0.386424 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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