硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX内核的开关中断使用BasePri实现方法,支持AC5,AC6,MDK和GCC

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-5-4 07:39:00 | 显示全部楼层 |阅读模式

详情可以看教程第11章节:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514

ThreadX提供的例子是采用的PRIMASK寄存器做全局开关中断,这里提供一个使用Basepri寄存器做全局开关中断的方案,这样可以让高优先级中断不受ThreadX管控,实现零中断延迟。

实现代码如下,大家仅需修改tx_port.h文件中的TX_DISABLE,TX_RESTORE和_tx_thread_system_return_inline实现为如下即可:

  1. #include "stm32h7xx_hal.h"
  2. #define ThreadX_MAX_INTERRUPT_PRIORITY                   (0x10)

  3. #define TX_INTERRUPT_SAVE_AREA                  uint32_t  was_masked;
  4. #define TX_DISABLE                              was_masked = __get_BASEPRI(); __set_BASEPRI(ThreadX_MAX_INTERRUPT_PRIORITY);
  5.                                                                                                 
  6. #define TX_RESTORE                              __set_BASEPRI(was_masked);

  7. #define _tx_thread_system_return                _tx_thread_system_return_inline


  8. static void _tx_thread_system_return_inline(void)
  9. {
  10. unsigned int          was_masked;


  11.     /* Set PendSV to invoke ThreadX scheduler.  */
  12.     *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000);
  13.     if (__get_IPSR()  == 0)
  14.     {
  15.                  was_masked = __get_BASEPRI();
  16.                  __set_BASEPRI(0);
  17.                  __set_BASEPRI(was_masked);
  18.     }
  19. }
复制代码


我们这里设置宏定义ThreadX_MAX_INTERRUPT_PRIORITY为0x10,表示调用函数TX_DISABLE关闭中断的时候,仅关闭抢占优先级1到15,抢占优先级0未不关闭(NVIC的优先级分组为4,STM32仅使用高4bit)。大家可以根据自己的情况做修改调整
回复

使用道具 举报

655

主题

3299

回帖

5289

积分

论坛元老

积分
5289
发表于 2021-5-4 17:16:59 | 显示全部楼层
大神你好,请教一下,

历程 V7-3007_ThreadX Task Priority Change 与 安富莱_STM32-V7开发板ThreadX内核教程(V0.4).pdf  资料里面显示的任务优先级貌似有些冲突啊 ? 看着看着就迷糊了啊 ?

002.png 这个里面说的是数值越小,优先级越低


003.png 这个里面说的是数值越小,优先级越高  ? 按照上面资料的介绍,那这个里面的 空闲任务 是占用了 最高 优先级了啊 ?

那到底是数值越小优先级是高还是低 啊 ??



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-5-4 17:29:10 | 显示全部楼层
hpdell 发表于 2021-5-4 17:16
大神你好,请教一下,

历程 V7-3007_ThreadX Task Priority Change 与 安富莱_STM32-V7开发板ThreadX内 ...

教程里面的说明有问题,下一版升级我修正下。
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
发表于 2024-10-12 10:18:23 | 显示全部楼层
请问我要同时维护gcc和keil两个工程的话,两个工程的tx_port.h要怎么改呢,都改成这样吗?调用的时候就调用TX_DISABLE和TX_RESTORE就行了吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2024-10-13 01:00:48 | 显示全部楼层
newton 发表于 2024-10-12 10:18
请问我要同时维护gcc和keil两个工程的话,两个工程的tx_port.h要怎么改呢,都改成这样吗?调用的时候就调用 ...

V7-3006是完整例子,你可以看下
https://www.armbbs.cn/forum.php? ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-1 07:51 , Processed in 0.232212 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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