最近搞飞思卡尔iMX6 4核A9处理器,有几个问题要请教下:
1、每个核都是有一套独立的指令寄存器吧,问题来了,PC寄存器和一些状态寄存器是否也是独立的?
2、在裸机开发的情况下,怎么获取当前的代码运行在哪个核上面?
3、如果在多核处理器上面实现一个longjmp应如何实现?longjmp只能实现核内长跳吗?
4、核处于关闭状态,来一中断后,是所有核都唤醒还是只有其中一个?核被关闭后,然后被唤醒,需要重新初始化核的PLL等那些参数吗?standby状态与其他两关闭状态主要区别在哪?
5、中断发生后,哪个核要进行中断服务处理是程序员事件还是硬件事件?还是两种都支持?
6、一般裸机开发用什么开发平台比较方便,用jlink或者ulink可以实现单步调试吗?
Hi, Cut,
>1、每个核都是有一套独立的指令寄存器吧,问题来了,PC寄存器和一些状态寄存器是否也是独立的?
是的,每个核拥有独立的物理通用寄存器和状态寄存器。
>2、在裸机开发的情况下,怎么获取当前的代码运行在哪个核上面?
可以通过读取MPIDR寄存器来获取当前运行的程序所对应的Cluster ID以及某一Cluster内部的CPUID.需要注意的是,该寄存器只能在Core处于privileged mode 下才可以被读取。该寄存器为32bit,其中[1:0]
为CPUID;[11:8]bit 表示ClusterID.
>3、如果在多核处理器上面实现一个longjmp应如何实现?longjmp只能实现核内长跳吗?
据我所知,longjump/setjump以及siglongjump作为标准C库函数的一部分,其在不同的处理器架构上有不同的实现,但是与是否多核没有直接必然的联系,在实现longjump的时候,应该考虑multi-threading和signal handling时的情况。
>4、核处于关闭状态,来一中断后,是所有核都唤醒还是只有其中一个?核被关闭后,然后被唤醒,需要重新初始化核的PLL等那些参数吗?standby状态与其他两关闭状态主要区别在哪?
A9支持4中power mode,分别是run mode, standby mode, Domant mode 和shutdown mode.这四种power mode的主要区别为:
Run mode: 既功能mode
Standby mode: 通过执行WFI 和WFE可以使Core 进入standby mode.此时core内的大部分逻辑的时钟是被gating掉的,但是逻辑处于power on状态。Core一直处于这种状态除非发生了一些事件或者行为,例如发生了IRQ/FIQ interrupt, asynchronous abort或者debug事件等。你可以通过用户板子用户手册或者
Dormant mode:在该种Power mode下,硬件中的大部分逻辑除了cache memory 保持power up 保存有数据之外,其他的逻辑都是power down的,这样可以让系统在上电的时候快速恢复并有效的减少功耗。
Shutdown mode:整个core 此时都是掉电的。
你可以通过阅读用户手册或者下载以下文档http://infocenter.arm.com/help/topic/com.arm.doc.ddi0407i/DDI0407I_cortex_a9_mpcore_r4p1_trm.pdf来获得更多的相关方面的内容。
在standby 模式下,若MPCore 接收到一个中断,是否唤醒取决于多方面的因素,主要包括
1)是否已经通过配置中断控制器将对应的中断发往指定的core
2)若该中断已经发往指定的core,该core是否被唤醒还取决于此种standby mode 是由WFI指令产生还是WFE指令产生,若为WFI 产生,则该core回因为收到了中断而唤醒。若为WFE产生,则是否被唤醒还取决于是否配置了CPSR.I,CPSR.F屏蔽了该中断。
>5、中断发生后,哪个核要进行中断服务处理是程序员事件还是硬件事件?还是两种都支持?
对于A9 MPCore来讲,内部集成有一个中断控制器,可以通过软件编程(ICDIPTRn)来将制定的中断发往指定的核。对于Software Generated Interrupt类型中断,还有更多的的控制规则。
>6、一般裸机开发用什么开发平台比较方便,用jlink或者ulink可以实现单步调试吗?
ARM以及合作伙伴都推出了大量的开发平台以供客户使用,你可以根据需求有针对性的进行选择。其中,对于ARM来讲,TC2也可以满足您的开发需求。对于Jlink和Ulink来讲都支持单步调试。我建议你使用ARM最新的DS-5 开发套件,可以提供强大的develop 和debug等功能,你可以通过http://ds.arm.com/ 来获取更多有关DS-5有关信息。
Darren回复的太好了,赞一个! 我有个疑问,还请Darren继续指点:
程序可以执行WFI/WFE使core进入standby模式,如何唤醒,在A9手册中有具体的解释:
WFI产生的,可以通过IRQ/FIQ interrupt, asynchronous abort或者debug事件等手段唤醒;
WFE产生的,除了这些手段还可以通过SEV指令和系统输入的EVENTI唤醒。
结合你的解答中提到的屏蔽中断,我想知道:
1、如果core屏蔽了CPSR.I和CPSR.F,中断到达时,还能唤醒WFE/WFI产生的休眠吗?还是对WFI/WFE两种情况有区别?
2、看到GIC500里有个wake_request信号,是不是具体化了这个过程,即wake_request要连接到CPU的一个pin上,唤醒target CPU,接着再处理中断?
谢谢!
你好,你的问题Darren正在帮忙看,请耐心等待他的回复
可以通过软件编程(ICDIPTRn)来将制定的中断发往指定的核,这意思是中断只会在一个核内发生?如果我处理器是4核的,现在有4个一样优先级的中断,这样的情况下,中断也只是一个核内发生吗?还是每个核都能分到一个中断处理
Hi, cut
软件编程指定某个SPI类型的中断发送到多个核,但最终只会有一个核响应这个中断,哪个核先响应了,其他核就无法再响应了。如果是SGI类型的中断,则可以广播。
一个中断是那样,我说是有多个中断,是否多个核能同时进入不同的中断,你貌似理解错了我的意思
Hello Ocean0208
由于最近事情较多,实在对不起这么才回复您相关问题。
>1、如果core屏蔽了CPSR.I和CPSR.F,中断到达时,还能唤醒WFE/WFI产生的休眠吗?还是对WFI/WFE两种情况有区别?
当CPU 处于WFI standby mode时,无论CPSR.I 和CPSR.F为何值,只要有IRQ和FIQ均可以唤醒CPU
当CPU 处于WFE standby mode时,IRQ和FIQ是否可以唤醒CPU,取决于CPSR.I 和CPSR.F如何设置。
>2、看到GIC500里有个wake_request信号,是不是具体化了这个过程,即wake_request要连接到CPU的一个pin上,唤醒target CPU,接着再处理中断?
我认为这适用于不同的应用场景。Wake_request 的一个典型应用是CPU在Power down mode下reboot的处理。其基本思路就是当一个特定的core 被power down, 且GICR_WAKER.ProcessorSleep bit 被设置为1, 若此时GIC收到了只面向这个处于power down mode的core的中断时,就会尝试唤醒该处于Power down mode的core. GIC会拉高与该core对应的wake_request信号,当PMU收到该信号时,启动power up以及reboot 流程。这与处于standby mode下的自动唤醒还是有较大区别的。需要注意的是,不是所有的Core 都可以与GIC-500搭配使用。其中对于ARMv7 架构的Core来讲,只能与GIC-400/390 搭配使用。
Best Regards
Darren Ma