硬汉嵌入式论坛

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

[ThreadX全家桶] 跟着硬汉学习ThreadX第二天,实现例程v011缺少空闲任务导致代码运行失败

[复制链接]

3

主题

3

回帖

12

积分

新手上路

积分
12
发表于 2022-1-2 16:06:13 | 显示全部楼层 |阅读模式
第二天学习ThreadX,在学习到ThreadX十六章原装任务统计时,根据硬汉提供的例程实现代码。
由于本人在每个任务前都加了任务开始执行打印,同时任务都实现了LED翻转,按照例程实现代码后,发现串口打印了任务开始执行,LED翻转一次之后保持常亮。同时按下按键未打印出任务统计。
调试发现,代码一直在
__tx_ts_wait:
    CPSID   i                                       // Disable interrupts
    LDR     r1, [r2]                                // Pickup the next thread to execute pointer
    STR     r1, [r0]                                // Store it in the current pointer
    CBNZ    r1, __tx_ts_ready                       // If non-NULL, a new thread is ready!
来回运行。
猜想是缺乏空闲任务的影响,加入了空闲任务。代码顺利运行。

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2022-1-3 08:33:42 | 显示全部楼层
ThreadX原本就是没有空闲任务的。
没有任务的时候都在这里执行死循环




回复

使用道具 举报

3

主题

3

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2022-1-3 14:32:53 | 显示全部楼层
eric2013 发表于 2022-1-3 08:33
ThreadX原本就是没有空闲任务的。
没有任务的时候都在这里执行死循环

嗯,给的例程后面几章也没有自己创建空闲任务,但是有其他任务 一样在这里死循环了。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-7-2 16:37:11 | 显示全部楼层
YeQ-LH 发表于 2022-1-3 14:32
嗯,给的例程后面几章也没有自己创建空闲任务,但是有其他任务 一样在这里死循环了。

楼主解决了没有?我这里也是这种现象,虽然说加上一个空闲任务就可以了。但按道理例程里的没有空闲任务也是能够运行的,我这里只要是不加上空闲任务,其它任务也没法执行直接死循环
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-7-3 10:41:43 | 显示全部楼层
StupidLED 发表于 2024-7-2 16:37
楼主解决了没有?我这里也是这种现象,虽然说加上一个空闲任务就可以了。但按道理例程里的没有空闲任务也 ...

那这个有点奇怪,优先看下是不是任务栈开小了。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-7-3 17:03:16 | 显示全部楼层
eric2013 发表于 2024-7-3 10:41
那这个有点奇怪,优先看下是不是任务栈开小了。

任务栈应该没问题,
仿真看了一下
__tx_PendSVHandler
PendSV_Handler

    /* Get current thread value and new thread pointer.  */

__tx_ts_handler

#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
    /* Call the thread exit function to indicate the thread is no longer executing.  */
#ifdef TX_PORT_USE_BASEPRI
    LDR     r1, =TX_PORT_BASEPRI                    // Mask interrupt priorities =< TX_PORT_BASEPRI
    MSR     BASEPRI, r1
#else
    CPSID   i                                       // Disable interrupts
#endif  /* TX_PORT_USE_BASEPRI */
    PUSH    {r0, lr}                                // Save LR (and r0 just for alignment)
    BL      _tx_execution_thread_exit               // Call the thread exit function
    POP     {r0, lr}                                // Recover LR
#ifdef TX_PORT_USE_BASEPRI
    MOV     r0, 0                                   // Disable BASEPRI masking (enable interrupts)
    MSR     BASEPRI, r0
#else
    CPSIE   i                                       // Enable interrupts
#endif  /* TX_PORT_USE_BASEPRI */
#endif  /* EXECUTION PROFILE */

这段执行不了,keil里面c和汇编都加了宏定义但仿真出来进不去这个条件
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-7-4 09:39:35 | 显示全部楼层
StupidLED 发表于 2024-7-3 17:03
任务栈应该没问题,
仿真看了一下
__tx_PendSVHandler

那有必要对ThreadX启动调度器,也就是开始启动OS的函数单步调试下,有个PendSV使能的操作,看看使能后能正常进入这里不。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-7-4 11:39:40 | 显示全部楼层
eric2013 发表于 2024-7-4 09:39
那有必要对ThreadX启动调度器,也就是开始启动OS的函数单步调试下,有个PendSV使能的操作,看看使能后能 ...

解决了 应该是那个lowlevel.s文件的问题  用cubemx重新生成了一个.s
移植过去就不会了  有时间再学习学习这个.s
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-7-4 11:40:45 | 显示全部楼层
eric2013 发表于 2024-7-4 09:39
那有必要对ThreadX启动调度器,也就是开始启动OS的函数单步调试下,有个PendSV使能的操作,看看使能后能 ...

使能pendSV是正常的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-7-5 09:24:10 | 显示全部楼层
StupidLED 发表于 2024-7-4 11:39
解决了 应该是那个lowlevel.s文件的问题  用cubemx重新生成了一个.s
移植过去就不会了  有时间再学习 ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-25 18:57 , Processed in 0.308407 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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