3766|5

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2.6.26 内核下中断处理的奇怪问题 [复制链接]


使用 2.6.26 内核 在 ks8695x 遇到了下面的问题:


int g_nAlloc=0, g_nFree=0;
int hw_isr0(...)
{
...

    spin_lock(&g_nsLock);
    if( ((g_nAlloc+1)%250) != g_nFree ) {
        g_nAlloc = (g_nAlloc+1)%250 ;
    }

    barrier();

    if( g_nFree != g_nAlloc ) {
        g_nFree = (g_nFree+1)%250;
    }

    spin_unlock(&g_nsLock);

...
}


上述函数通过GPIO 口响应一个外部硬中断,可以确定 g_nAlloc g_nFree 只在上面的代码中涉及到,且我确定中断源只有一个。现在问题是,上述函数经过数次执行后,g_nAlloc g_nFree 的值【有时候】会出现不等的情况!可是在应用层下跑都是正常的。开始听说乱序执行可能导致类似问题,因此用了 barrier(),但好像没什么改善。我是新手,各位前辈有什么建议没有?


最新回复

自己顶一下。  详情 回复 发表于 2010-1-22 16:17
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不好意思,CPU 型号应该是 ks8695px。
 
 

回复

45

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮顶下。

MARK。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
按理说你加入barrier()后,读到的值应该都已经是正确的,不知道你是怎么判断 g_nAlloc g_nFree这两个值的?
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 laiguo 的回复:
按理说你加入barrier()后,读到的值应该都已经是正确的,不知道你是怎么判断 g_nAlloc g_nFree这两个值的?


是这样,hw_isr0() 响应的中断由我触发,每次触发后 hw_isr0() 被调用若干次,每一轮系统响应完中断后,我会由应用程序利用驱动的read系统调用在内核打印 g_nAlloc g_nFree 的值,有时候打印的值两者是不相等的,但有时候又相等,但在内核线程或是应用里面测试,每次都是相等的,符合期望。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
自己顶一下。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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