OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4520|回复: 8

CMSIS-RTOS RTX 临界中断该怎么处理?

[复制链接]

36

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2016-3-26
在线时间
83 小时
发表于 2016-11-3 14:55:48 | 显示全部楼层 |阅读模式
20金钱


求助:
MDK自带系统  CMSIS-RTOS RTX ,当某一个task运行时,有3行代码必须要一起运行,为了防止系统运行至此3行代码时,没运行完转而运行其他TASK,而造成程序有漏洞的问题,该做哪些处理?

不胜感激!

最佳答案

查看完整内容[请看2#楼]

如果只是防止执行别的任务,有两个方法: 1、该任务优先级调到最高,这样就不用担心没执行完该任务就去执行别的任务。 2、关闭任务调度,就是上面的兄弟说的tsk_lock,tsk_unlock,只是我在CMSIS-RTOS RTX没找到这俩函数,但是在RL-RTX中有 如果你担心该任务被中断打断,那你就关中断
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-7-28
在线时间
8 小时
发表于 2016-11-3 14:55:49 | 显示全部楼层
如果只是防止执行别的任务,有两个方法:
1、该任务优先级调到最高,这样就不用担心没执行完该任务就去执行别的任务。
2、关闭任务调度,就是上面的兄弟说的tsk_lock,tsk_unlock,只是我在CMSIS-RTOS RTX没找到这俩函数,但是在RL-RTX中有
如果你担心该任务被中断打断,那你就关中断
回复

使用道具 举报

36

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2016-3-26
在线时间
83 小时
 楼主| 发表于 2016-11-3 16:05:45 | 显示全部楼层
自己顶一个
回复

使用道具 举报

36

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2016-3-26
在线时间
83 小时
 楼主| 发表于 2016-11-3 16:06:40 | 显示全部楼层
顶顶顶
回复

使用道具 举报

36

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2016-3-26
在线时间
83 小时
 楼主| 发表于 2016-11-3 17:32:08 | 显示全部楼层
只是在人群中看了你一眼,再也不能忘记你容颜。

来个人看看吧
回复

使用道具 举报

2

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2013-6-21
在线时间
174 小时
发表于 2016-11-3 17:51:18 | 显示全部楼层
函数tsk_lock
函数原型:
void tsk_lock (void);
函数描述:
函数tsk_lock用于禁止RTX内核定时器中断,因此也就禁止了任务切换。
使用这个函数要注意以下问题:
1. 函数tsk_lock不支持嵌套调用。
2. 不允许在中断服务程序中调用tsk_lock。
3. RTX内核定时器被关闭期间,RTX内核任务调度器和需要时间片调度的任务被阻塞。设置的任务延迟时间不再工作。因此,强烈建议关RTX内核定时器中断的时间越短越好。
使用举例:
#include <rtl.h>

void protect_critical_op () {
tsk_lock();
do_critical_op ();
tsk_unlock();
}
回复

使用道具 举报

36

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2016-3-26
在线时间
83 小时
 楼主| 发表于 2016-11-10 17:06:40 | 显示全部楼层
expresschs 发表于 2016-11-3 17:51
函数tsk_lock
函数原型:
void tsk_lock (void);

大兄弟,tsk_lock(void);      在cmsis_os.h 中 没有这个函数的定义啊。  
你的这个是MDK中的keil RTX吗?
回复

使用道具 举报

2

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2013-6-21
在线时间
174 小时
发表于 2016-11-13 15:00:30 | 显示全部楼层
li13158 发表于 2016-11-10 17:06
大兄弟,tsk_lock(void);      在cmsis_os.h 中 没有这个函数的定义啊。  
你的这个是MDK中的keil RTX ...

我用的是keil4的rtx

rtl.h里这样定义的
#define tsk_lock()                 _os_tsk_lock((U32)rt_tsk_lock)
#define tsk_unlock()               _os_tsk_unlock((U32)rt_tsk_unlock)
extern void      _os_tsk_lock (U32 p)                                  __SVC_0;
extern void      _os_tsk_unlock (U32 p)                                __SVC_0;

keil5做了一层封装,cmsis_os.h 里没有找到类似函数,不过本质上还是调用了rt_tsk_lock和rt_tsk_unlock,你可以把接口引出
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-11-14 10:05:33 | 显示全部楼层
直接关中断,关调度就是了,风险就是可能会掉数据
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 14:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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