5536|8

420

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

系统最大关中断时间为0us的原理 [复制链接]

raw os 采用了特殊的机制, 可以降低整个系统的最大关中断时间无限接近0us.
其主要实现原理是原先系统关中断的地方改为关抢占,这样就可以把系统最大中断时间降为最低了。

读者可以看到RAW_CRITICAL_ENTER()的实现有两种实现方式,第一种是传统的关中断形式:
#define  RAW_CRITICAL_ENTER()                     RAW_CPU_DISABLE()

第二种是关抢占形式:
#define  RAW_CRITICAL_ENTER()                                       \
         do {                                                     \
             RAW_CPU_DISABLE();                                 \
             raw_sched_lock++;                           \
             RAW_CPU_ENABLE();                                  \
         } while (0)

后一种方式即为系统统最大关中断时间为0us的实现关键,可以看到
raw_sched_lock++; 即为关了系统抢占。

但是系统只关了抢占,只能防止任务和任务之间临界区的冲突,不能防止任务和中断之间的冲突。raw os 的api 很多都能在中断里面,这样的话势必会和外面api 产生临界区的冲突,必须采用特殊的方法把中断里面使用的api 弄到任务空间里去做。Task 0 的存在正是解决这个问题的方法,假设中断里面调用到了 raw os 的api ,假设是raw_semaphore_put, 此函数会接着调用int_msg_post 把这个api 的事件存储起来,然后快速唤醒task 0, 一出中断后立马运行raw_semaphore_put.

以下为raw_semaphore_put的部分关键代码:

       #if (CONFIG_RAW_ZERO_INTERRUPT > 0)

       if (raw_int_nesting &&raw_sched_lock) {
              return int_msg_post(RAW_TYPE_SEM,semaphore_ptr, 0, 0, 0, 0);
       }

       #endif

可以看到只要打开了系统最大中断为0us 的特性后,只要在中断空间里,而且任务关了抢占后,就开始通过int_msg_post 转发。

具体更多的代码,读者可以自行阅读raw os 代码,以及相关的VC 测试代码。

最新回复

txj,能给个2.0版的零中断实现办法吗?  详情 回复 发表于 2016-3-29 21:24

点评

方法确实感觉很巧妙,不过确实看不懂哦:faint:  详情 回复 发表于 2013-1-29 16:30
谢谢分享 HOHO  详情 回复 发表于 2013-1-29 09:59
点赞 关注

回复
举报

2万

帖子

74

TA的资源

管理员

沙发
 

回复 楼主 jorya_txj 的帖子

谢谢分享  HOHO
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 

回复

435

帖子

5

TA的资源

五彩晶圆(初级)

板凳
 
原帖由 jorya_txj 于 2013-1-28 17:57 发表
raw os 采用了特殊的机制, 可以降低整个系统的最大关中断时间无限接近0us.
其主要实现原理是原先系统关中断的地方改为关抢占,这样就可以把系统最大中断时间降为最低了。

读者可以看到RAW_CRITICAL_ENTER()的实现 ...
方法确实感觉很巧妙,不过确实看不懂哦
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

4
 
版主啊
对你的操作系统很感兴趣,问一下
关于

第二种是关抢占形式:
#define  RAW_CRITICAL_ENTER()                                       \
         do {                                                     \
             RAW_CPU_DISABLE();                                 \
             raw_sched_lock++;                           \
             RAW_CPU_ENABLE();                                  \
         } while (0)

后一种方式即为系统统最大关中断时间为0us的实现关键,可以看到
raw_sched_lock++; 即为关了系统抢占。

但是系统只关了抢占,只能防止任务和任务之间临界区的冲突,不能防止任务和中断之间的冲突。raw os 的api 很多都能在中断里面,这样的话势必会和外面api 产生临界区的冲突,必须采用特殊的方法把中断里面使用的api 弄到任务空间里去做。Task 0 的存在正是解决这个问题的方法,假设中断里面调用到了 raw os 的api ,假设是raw_semaphore_put, 此函数会接着调用int_msg_post 把这个api 的事件存储起来,然后快速唤醒task 0, 一出中断后立马运行raw_semaphore_put.

实际上就是说 你的API函数改为到任务空间去执行 减少绝对关中断时的操作时间 但是这样我调用API实际上
这个信号量就没有被立即执行
而是被延时到了 一个Task里面去调度之后才执行完成
那这时函数返回值 怎么处理呢
是不是应该在信号量执行完成之后 才能给出呢?
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

5
 
task 0 内部的函数处理多半是唤醒任务或者发送一个数据到队列等,返回值不处理没关系的。
 
 
 

回复

116

帖子

2

TA的资源

一粒金砂(中级)

6
 
俺看不懂, 中断不是要求尽快响应吗?
留给任务去做,唤醒任务task0, 不也是需要时间的?
通常中断是要求立即响应,任务是对方中断完成后的处理。

点评

最新的raw-os 2.0版本已经砍掉这个功能了,用另外的方式去实现了。  详情 回复 发表于 2016-3-29 17:18
 
个人签名熙熙攘攘的世界,我们不懈前行......
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

7
 
okwh 发表于 2016-3-26 12:21
俺看不懂, 中断不是要求尽快响应吗?
留给任务去做,唤醒任务task0, 不也是需要时间的?
通常中断是要求 ...

最新的raw-os 2.0版本已经砍掉这个功能了,用另外的方式去实现了。

点评

txj,能给个2.0版的零中断实现办法吗?  详情 回复 发表于 2016-3-29 21:24
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

8
 
jorya_txj 发表于 2016-3-29 17:18
最新的raw-os 2.0版本已经砍掉这个功能了,用另外的方式去实现了。

txj,能给个2.0版的零中断实现办法吗?

点评

99.999%的项目不需要这个特性,2.0的这个特性需要移植的时候去特地定制。  详情 回复 发表于 2016-3-30 09:49
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

9
 
wxfzy 发表于 2016-3-29 21:24
txj,能给个2.0版的零中断实现办法吗?

99.999%的项目不需要这个特性,2.0的这个特性需要移植的时候去特地定制。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【回帖赢京东卡】说说无线技术那些事儿
即日起—2月28日,参与回帖讨论都有机会赢取【30元京东卡】

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表