-
Notifications
You must be signed in to change notification settings - Fork 4.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
修正rt_thread_delay_until时间不准问题 #4329
Conversation
@KyleChenjh please take a look. |
@liruncong 你好,关于第一个符号类型的问题,我觉得无符号数据进行比较是正确的,如果转成有符号的话,数据范围会发生变化,同时还会造成溢出的问题,举个例子unsigned char 的0x80 (10进制表示为128)数据,转成signed char 就会变成-128,拿这样的数据进行比较显然不合理。而源代码中直接 关于第二个问题,tick的修改应该不够完备,原因有两点: Lines 601 to 625 in 302f179
|
@KyleChenjh 第1个问题,当时没仔细考虑,确实这里无符号比较更合适。 |
@liruncong 感谢您的回复。这个函数是延时从tick的时间直到inc_tick的时间为止(但是不是绝对的,是至少要这么长时间,因为有调度发生,所以不是固定的),因此理论值就没意义了,或者是在调度之后再加个 rt_get_tick() 看下实际和理论的差别。函数最后加rt_tick_get操作是合理的。 |
@KyleChenjh 既然可以改为固定的,为什么不改为固定呢?这在硬实时系统上是必须的。而且非硬实时系统中更改后照样可以使用。调度之后rt_get_tick()时,如果在调度后,rt_get_tick()前,发生中断,获取的tick将与理论tick有偏差,这将无法应用于硬实时系统 |
@liruncong 不是能改为固定而不改为固定,是这个固定值只是理论值是无意义的。😰 |
@liruncong 您好,可以把您针对这个函数的使用场景说一下吗,拿这个值做什么用? |
@KyleChenjh 比如控制电机时,要求每2ms给电机发一个速度,发速度的线程500us以内完成,如果不准时给驱动器速度,电机运行不平稳。再比如数控系统中插补控制,必须固定周期内完成插补计算,插补速度输出给驱动器,不能说这回4ms,下次5ms吧, 驱动器一个周期没收到速度,那么将认为0,电机就震动了。 |
@liruncong 那么在这些场景下,你会怎么使用这个api呢,更具体的说,你会怎么用 tick 这个变量呢? |
@KyleChenjh 大概按下面的示例使用:
|
我搜索了一下,这个函数的用途应该和 FreeRTOS 的 vTaskDelayUntil 函数一样。我感觉楼主这么修改应该是合理的。 |
@liruncong 楼主你把第一个修改 "rt_tick_get() - *tick < inc_tick"无符号数比较错误,应该用有符号进行比较 再改回来吧。 |
@liruncong 嗯嗯,按照上面的使用场景,这样改是合理的,可以保证时间间隔。楼主你把第一个修改无符号数再改回来吧。 |
@KyleChenjh 已更改 |
拉取/合并请求描述:(PR description)
[
rt_thread_delay_until存在以下问题:
已在cortex-a8开发板测试.
]
以下的内容不应该在提交PR时的message修改,修改下述message,PR会被直接关闭。请在提交PR后,浏览器查看PR并对以下检查项逐项check,没问题后逐条在页面上打钩。
The following content must not be changed in the submitted PR message. Otherwise, the PR will be closed immediately. After submitted PR, please use a web browser to visit PR, and check items one by one, and ticked them if no problem.
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0
代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up