6223|4

46

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Cortex a9双核CPU1触发CPU0软件中断问题 [复制链接]

 
    我用的是ZYNQ的芯片,带cortex a9 双核
    CPU1触发CPU0软件中断后,CPU0执行了一次,然后就所有中断都不响应了(程序并没有挂起,还在跑),但全局中断还在开启,pending标志也都有,就是不再响应中断了。如果把CPU1的触发那句函数调用,放在CPU0核执行,则所有工作都正常,CPU0仍然能响应所有中断。
   不知道是不是使用方法不对,感觉就是设置一个软件触发寄存器没有别 的。CPU0响应了一次,执行完中断退出后,就无法响应任何中断,像是全局被关了似的(但查看寄存器位,没有关掉。其他定时器等别的中断都不能响应,但中断都处于pending状态)
    不太了解A9内核架构,请问在这软中断调用有什么需要注意的地方吗。

最新回复

有具体列子?可以看原厂的pdf  详情 回复 发表于 2024-9-8 15:03
点赞 关注

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
同问,我现在也遇到类似的情况,中断处理时重启,重启后发现不能触发中断了。查过set-pending和clear-pending
的标志位都是1,不知道这代表什么意思
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
兄弟,这个问题你最终怎么解决的?我看你在21ic上说是官方的库有问题,清除中断时要把CPU ID带过去,没太懂是什么意思,还请不吝赐教

点评

不知道你遇的问题是不是跟我的同一个。 我用的是ISE14.7带的SDK。 官方库 xscugic_hw.c 文件中替换下面函数: void XScuGic_DeviceInterruptHandler(void *DeviceId) { u32 IntID; XScuGic_VectorTa  详情 回复 发表于 2017-6-5 11:10
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

4
 
本帖最后由 pingis58 于 2017-6-5 11:13 编辑
real_2004 发表于 2017-6-3 09:20
兄弟,这个问题你最终怎么解决的?我看你在21ic上说是官方的库有问题,清除中断时要把CPU ID带过去,没太懂 ...

不知道你遇的问题是不是跟我的同一个。
我用的是ISE14.7带的SDK。
官方库 xscugic_hw.c 文件中替换下面函数:
void XScuGic_DeviceInterruptHandler(void *DeviceId)
{

    u32 IntID;
    XScuGic_VectorTableEntry *TablePtr;
    XScuGic_Config *CfgPtr;

    CfgPtr = &XScuGic_ConfigTable[(u32 )DeviceId];

    /*
     * Read the int_ack register to identify the highest priority
     * interrupt ID and make sure it is valid. Reading Int_Ack will
     * clear the interrupt in the GIC.
     */
    IntID = XScuGic_ReadReg(CfgPtr->CpuBaseAddress, XSCUGIC_INT_ACK_OFFSET)
                    & XSCUGIC_ACK_INTID_MASK;
    if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){
        goto IntrExit;
    }

    /*
     * If the interrupt is shared, do some locking here if there are
     * multiple processors.
     */
    /*
     * If pre-eption is required:
     * Re-enable pre-emption by setting the CPSR I bit for non-secure ,
     * interrupts or the F bit for secure interrupts
     */

    /*
     * If we need to change security domains, issue a SMC instruction here.
     */

    /*
     * Execute the ISR. Jump into the Interrupt service routine based on
     * the IRQSource. A software trigger is cleared by the ACK.
     */
    TablePtr = &(CfgPtr->HandlerTable[IntID]);
    TablePtr->Handler(TablePtr->CallBackRef);

IntrExit:
    /*
     * Write to the EOI register, we are all done here.
     * Let this function return, the boot code will restore the stack.
     */
    XScuGic_WriteReg(CfgPtr->CpuBaseAddress, XSCUGIC_EOI_OFFSET, IntID);

    /*
     * Return from the interrupt. Change security domains could happen
     * here.
     */
}
原因如下:CPUID域,在软件中断时,必须要把触发CPUID写回。这也是当时找了N久无果,无意在国外一个论坛看到的,那个帖已经找不到了。
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

5
 
有具体列子?可以看原厂的pdf
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表