硬汉嵌入式论坛

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

[ThreadX全家桶] 请教下, 使用 tx event tx_event_flags_create 创建事件标志组接收有时会失败 ?

[复制链接]

684

主题

3514

回帖

5591

积分

论坛元老

积分
5591
发表于 2024-12-20 19:17:00 | 显示全部楼层 |阅读模式



请教下, 使用 tx event tx_event_flags_create 创建事件标志组接收有时会失败 ?

刚开始是可以正常接收的, 但是接收一会后就再也接收不到事件发送过来的信息了 , 请问这个是怎么个情况造成的呀 ..?
tx_event_flags_get  这个刚开始可以正常接收


tx_event-err.png

上图中的
0
1        是中断里面发送出来的, 说明中断工作是正常的

cmd 是接收后的事件 bit  也是正常并且正确, 但是接收一会后就只能打印出
中断里面发送的 0  
                        1
                了, 接收 cmd 失败也没有打印 cmd 出来 了 ???



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-12-21 09:25:29 | 显示全部楼层
是不是发送CMD的任务没有正常运行了。
回复

使用道具 举报

684

主题

3514

回帖

5591

积分

论坛元老

积分
5591
 楼主| 发表于 2024-12-21 09:39:42 | 显示全部楼层
eric2013 发表于 2024-12-21 09:25
是不是发送CMD的任务没有正常运行了。




终于捣鼓成功了, 他奶奶的 , 真费劲, 原来是 tx 设置的 中断保护 造成的


#if   1   使用这个方法 接收 就完全没有问题
__attribute__( ( always_inline ) ) static inline void _tx_thread_system_return_inline(void)
{
unsigned int interrupt_save;

    /* Set PendSV to invoke ThreadX scheduler.  */
    *((volatile ULONG *) 0xE000ED04) = ((ULONG) 0x10000000);
    if (__get_ipsr_value() == 0)
    {
        interrupt_save = __get_interrupt_posture();
#ifdef TX_PORT_USE_BASEPRI
        __set_basepri_value(0);
#else
        __enable_interrupts();
#endif
        __restore_interrupt(interrupt_save);
    }
}

#define TX_INTERRUPT_SAVE_AREA                  UINT interrupt_save;
#define TX_DISABLE                              interrupt_save =  __disable_interrupts();
#define TX_RESTORE                              __restore_interrupt(interrupt_save);

#else
// 使用如下方法接收, 刚开始可以, 接收一会就不行了,
// C/C++  __ARM_ARCH_7M__=1   需要势能这个, 因为 需要用到 如下的一些函数
//#include <stdlib.h>
//#include <string.h>

#include "stm32h7xx_hal.h"
#include "cmsis_armclang.h"

#define ThreadX_MAX_INTERRUPT_PRIORITY                   (0x10)

#define TX_INTERRUPT_SAVE_AREA                  uint32_t  was_masked;
#define TX_DISABLE                              was_masked = __get_BASEPRI(); __set_BASEPRI(ThreadX_MAX_INTERRUPT_PRIORITY);

#define TX_RESTORE                              __set_BASEPRI(was_masked);

#define _tx_thread_system_return                _tx_thread_system_return_inline


static void _tx_thread_system_return_inline(void)
{
        unsigned int   was_masked;

    /* Set PendSV to invoke ThreadX scheduler.  */
    *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000);
    if (__get_IPSR() == 0)
    {
                 was_masked = __get_BASEPRI();
                 __set_BASEPRI(0);
                 __set_BASEPRI(was_masked);
    }
}
#endif

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-12-23 07:27:49 | 显示全部楼层
hpdell 发表于 2024-12-21 09:39
终于捣鼓成功了, 他奶奶的 , 真费劲, 原来是 tx 设置的 中断保护 造成的

回复

使用道具 举报

684

主题

3514

回帖

5591

积分

论坛元老

积分
5591
 楼主| 发表于 2024-12-23 14:58:52 | 显示全部楼层
回复

使用道具 举报

10

主题

38

回帖

68

积分

初级会员

积分
68
发表于 2024-12-28 16:20:47 | 显示全部楼层
eric2013 发表于 2024-12-21 09:25
是不是发送CMD的任务没有正常运行了。

threadx的事件标志组可以在中断回调中使用吗? 教程中说mutex是不能的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-12-29 06:51:57 | 显示全部楼层
capw 发表于 2024-12-28 16:20
threadx的事件标志组可以在中断回调中使用吗? 教程中说mutex是不能的

事件标志组flag event是可以的。

而mutex互斥信号量不行
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 21:29 , Processed in 0.254844 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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