硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX中断优先级配置

[复制链接]

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2021-7-9 16:32:02 | 显示全部楼层 |阅读模式
今天将ThreadX V6.1.7移植到了STM32F207ZGT6这款Cortex-M3芯片上,看到V6教程中,第11章中配置BasePri,有些地方不理解。
“注意: 我们这里设置宏定义 ThreadX_MAX_INTERRUPT_PRIORITY为 0x10, 表示调用函数TX_DISABLE
关闭中断的时候,仅关闭抢占优先级1到15,抢占优先级 0未不关闭(NVIC的优先级分组为4,STM32
仅使用高4bit) 。大家可以根据自己的情况做修改调整。”


Q: 这里如果将ThreadX_MAX_INTERRUPT_PRIORITY设为0x0A的话,是不是仅关闭抢占优先级1-10,抢占优先级0不关闭。是不是无法调整不关闭的抢占优先级数量?



下面是我根据教程,自己根据源码改的(因为我看硬汉哥的源码删改了一些代码),请帮忙看看有没有问题,能不能实现跟硬汉老哥代码一样的效果。TX_PORT_USE_BASEPRI已经定义了。

static __inline void __set_basepri_value(unsigned int basepri_value)
{
    __asm__ volatile ("MSR  BASEPRI, #basepri_value");
}

static __inline unsigned int __disable_interrupts(void)
{
    unsigned int int_posture;

    int_posture = __get_interrupt_posture();
    __set_basepri_value(0x10); /* ThreadX_MAX_INTERRUPT_PRIORITY为 0x10 */
    return(int_posture);
}

static __inline void __restore_interrupt(unsigned int int_posture)
{
    __set_basepri_value(int_posture);
}

static void _tx_thread_system_return_inline(void)
{
    unsigned int interrupt_save;

    /* Set PendSV to invoke ThreadX scheduler.  */
    *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000);
    if (_ipsr == 0)
    {
        interrupt_save = __get_interrupt_posture();
        __set_basepri_value(0);
        __set_basepri_value(interrupt_save);
    }
}

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



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117568
QQ
发表于 2021-7-9 18:58:39 | 显示全部楼层
1、注意STM32使用的是BASEPRI寄存器的高4bit,你定义为0x0A的话,高4bit是0,这样不会关闭任何中断。
2、V6.1.7的Port文件里面已经增加了这种机制,你可以直接使用了,无需用户再修改。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-7-12 09:14:04 | 显示全部楼层
硬汉老哥,感谢您的回复。但是,直接使用会出现TX_PORT_BASEPRI未定义的情况
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-7-12 09:15:24 | 显示全部楼层
感谢硬汉老哥的回复。但是直接使用,会出现TX_PORT_BASEPRI未定义的情况
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117568
QQ
发表于 2021-7-12 11:09:39 | 显示全部楼层
Zachary_yo 发表于 2021-7-12 09:15
感谢硬汉老哥的回复。但是直接使用,会出现TX_PORT_BASEPRI未定义的情况

使用我的那种移植方式,你那边测试是否正常。
回复

使用道具 举报

7

主题

196

回帖

222

积分

高级会员

积分
222
发表于 2022-1-28 16:00:35 | 显示全部楼层
硬汉哥  我今天刚把内核教程看到这一章  但是我看了一下示例工程使用HAL_NVIC_SetPriority()函数设置一些中断的时候里面的抢占优先级都不太一样 有0 也有4 这样直接使用TX_DISABLE管理中断会不会搞混了啊
回复

使用道具 举报

7

主题

196

回帖

222

积分

高级会员

积分
222
发表于 2022-1-28 16:02:19 | 显示全部楼层
eric2013 发表于 2021-7-9 18:58
1、注意STM32使用的是BASEPRI寄存器的高4bit,你定义为0x0A的话,高4bit是0,这样不会关闭任何中断。
2、V ...

将ThreadX_MAX_INTERRUPT_PRIORITY设为0xA0的话,是不是仅关闭抢占优先级10-15,0-9不关闭
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117568
QQ
发表于 2022-1-28 16:21:39 | 显示全部楼层
abcde1224 发表于 2022-1-28 16:02
将ThreadX_MAX_INTERRUPT_PRIORITY设为0xA0的话,是不是仅关闭抢占优先级10-15,0-9不关闭

对,是这样的。
回复

使用道具 举报

41

主题

126

回帖

249

积分

高级会员

积分
249
发表于 2022-1-28 18:22:56 | 显示全部楼层

threadx的实时性有RTX好吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 12:28 , Processed in 0.043491 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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