硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX 一直卡在调度器里循环 __tx_ts_wait

[复制链接]

3

主题

25

回帖

34

积分

新手上路

积分
34
发表于 2022-10-11 09:21:28 | 显示全部楼层 |阅读模式
使用的是threadx-6.1.6_rel、stm32f103rct6,ThreadX的启动汇编文件用硬汉的.c文件进行代替了,任务中没有调用tx_thread_sleep(1)就没有问题,可以一直运行。但是只要调用了tx_thread_sleep(1)就会卡死在图片中的汇编代码里面,硬汉可有帮看看怎么回事吗?
image.png

image.png

tx_init_low_level.c

3.04 KB, 下载次数: 5

LED_mode .exe

725.64 KB, 下载次数: 3

代码

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115895
QQ
发表于 2022-10-11 15:59:07 | 显示全部楼层

回帖奖励 +1 个金币

把那个汇编的启动初始化文件改成我这个来做试试。

说干就干,修改ThreadX内核移植的tx_initialize_low_level.s汇编文件为C文件
https://www.armbbs.cn/forum.php? ... 0053&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

25

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-10-11 16:22:11 | 显示全部楼层
本帖最后由 惟若晨星 于 2022-10-11 16:27 编辑
eric2013 发表于 2022-10-11 15:59
把那个汇编的启动初始化文件改成我这个来做试试。

说干就干,修改ThreadX内核移植的tx_initialize_low_l ...

我拿GD32f4的改成.c文件试了,也是会卡在等待任务的汇编里面
网页捕获_11-10-2022_16273_.jpeg
回复

使用道具 举报

3

主题

25

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-10-11 16:25:13 | 显示全部楼层
本帖最后由 惟若晨星 于 2022-10-11 16:28 编辑
eric2013 发表于 2022-10-11 15:59
把那个汇编的启动初始化文件改成我这个来做试试。

说干就干,修改ThreadX内核移植的tx_initialize_low_l ...

汇编和C文件,使用那个汇编的调用tx_thread_sleep就没事,C文件的调用tx_thread_sleep最后会跑到等待任务的汇编代码段里面。
image.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115895
QQ
发表于 2022-10-12 00:41:38 | 显示全部楼层
惟若晨星 发表于 2022-10-11 16:25
汇编和C文件,使用那个汇编的调用tx_thread_sleep就没事,C文件的调用tx_thread_sleep最后会跑到等待任务 ...

是不是二楼帖子里面的23和24楼问题。
回复

使用道具 举报

3

主题

25

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-10-12 08:17:24 | 显示全部楼层
本帖最后由 惟若晨星 于 2022-10-12 09:22 编辑
eric2013 发表于 2022-10-12 00:41
是不是二楼帖子里面的23和24楼问题。

这个算是吗?
image.png
回复

使用道具 举报

85

主题

782

回帖

1037

积分

至尊会员

积分
1037
发表于 2022-10-12 21:43:38 | 显示全部楼层
我有遇到过,当时加大任务堆栈解决
回复

使用道具 举报

3

主题

25

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-10-13 08:24:17 | 显示全部楼层
庄永 发表于 2022-10-12 21:43
我有遇到过,当时加大任务堆栈解决

后面没试了,我还是用汇编文件了。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2022-10-28 09:41:19 | 显示全部楼层
可能是优先级的问题,systick要高于家居pendsv
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-4-7 22:15:19 | 显示全部楼层
这个就是idle,threadx不用添加idle task就是因为有这个汇编,当所有其他线程都不ready的时候,就会在这个汇编等待其他线程变为ready,这里面有个开中断的操作,就是为了让中断(比如tick)来激活线程
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115895
QQ
发表于 2024-4-8 08:19:01 | 显示全部楼层
1997AURORA 发表于 2024-4-7 22:15
这个就是idle,threadx不用添加idle task就是因为有这个汇编,当所有其他线程都不ready的时候,就会在这个 ...

楼主这个问题还有点区别,他这个是卡在这个地方,其他任务不执行了。
回复

使用道具 举报

1

主题

21

回帖

24

积分

新手上路

积分
24
发表于 2024-6-27 19:08:35 | 显示全部楼层
MDK魔术棒里的C/C++选项卡里如果有TX_PORT_BASEPRI = 80, 改成 TX_PORT_BASEPRI=64试试
回复

使用道具 举报

1

主题

21

回帖

24

积分

新手上路

积分
24
发表于 2024-6-27 19:24:13 | 显示全部楼层
本帖最后由 dzc0426 于 2024-6-28 10:29 编辑

或者更改tx_initialize_low_level.S中 systick的中断优先级,LDR     r1, =0x40FF0000                         @ SysT, PnSV, Rsrv, DbgM 找到这一行,最前面的4就是systick的中断优先级,如果threadx选择使用BASEPRI,并且设置为大于4的值(例如5,很多从freertos转过来的喜欢设置这个值),就会导致systick中断可能破坏掉临界区。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-25 14:21 , Processed in 0.309061 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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