本帖最后由 supermiao123 于 2015-2-27 13:31 编辑
Week 2 About Dual processor core 2015.2.25 首先,根据用户手册看到双核一个M4,一个M0,他们的功能参数具体可以看手册,本节着重了解关于双核之间相对关系及如何去使用。 首先可以看下框图:
由上图,可以看出M4和M0是并列的,它们都可以使用AHB和APB总线。它们的调试接口都可以用SWD。
The ARM Cortex-M4 includes threeAHB-Lite buses, one system bus and the I-code and D-code buses. One bus is dedicatedfor instruction fetch (I-code), and one bus is dedicated for data access (D-code).The use of two core buses allows for simultaneous operations if concurrent operations target differentdevices. 这端的意思是说有三个总线system bus andthe I-code and D-code buses。其中,I-CODE 和D-CODE一个是用于取指令,一个是用于取数据,可以并行使用。也就是所谓的哈弗结构。而system BUS由图可知,主要是与APB通信,就有与外设通信。 APB(AdvancedPeripheral Bus),片上外设总线。主要用于慢速片上外设与ARM核的通讯
AHB(Advanced High performance Bus),高性能总线。主要用于系统高性能、高时钟速率模块间通信 下面是对M4的一个简介
其中 THUMB-2是一种新的指令为ARM架构,可提供增强的性能,能效和代码密度水平。可以看下图(稍微有点跑题,科普一下)
其他的都是介绍,先不管,就记住最后一句,关于M4的问题去32章去找。 下面这个是关于M0的介绍
The Cortex-M0+ has a 2-stage pipeline M0有两级流水线。
还是最后一句,M0也在32章等我。
盛情难却,32章我来了。
首先是M4的,大致的介绍了下M4都有哪些功能,我觉得对于现在我想了解的,还是最后一句有用。
想了解调试功能,请去29章等我。 我猜M0的也是一样的。
果不其然,29章,I’M COMING!
29章是SWD,SWD和JTAG引脚我就不说了,直接跳到双核部分。
M4:8个断点,4个数据观察点。 M0:4个断点,2个数据观察点。
由于没有玩过双核的ARM,所以,到此为止心中疑惑还是没有解开。双核是如何分配工作的?如何烧写程序,分别烧写还是可以统一烧写?等等,话说菜鸟问题多,我承认,
还好,还是有例程去帮我理解的。
打开双核的范例,可以看到有四个库文件工程,两个可执行的工程。一个是M4,一个是M0。看到这里,我是不是该知道点什么了,应该是两个处理器分别编程,分别写程序,分别下载,那他们不会冲突么?
带着这个疑问,打开一个工程,看看例子里怎么说的:
myCoreBox = MAILBOX_CM4; otherCoreBox= MAILBOX_CM0PLUS;
/*Initialize mailbox with initial mutex free (master core only) */ Chip_MBOX_Init(LPC_MBOX); mutexGive();
/*Setup shared memory location for LED states, bit 0 = LED 0 state, bit 1 = LED state 1. Master core controlsbit 0, while slave core controls bit 1. Only master can set the LEDstates. */ sharedLEDStates= 0x01;
/*Enable mailbox interrupt */ NVIC_EnableIRQ(MAILBOX_IRQn);
/*Enable SysTick Timer only on the master */ SysTick_Config(SystemCoreClock/ TICKRATE_HZ);
/*Boot M0 core, using reset vector and stack pointer from the CM0+ image in FLASH. */ stackAddr= (uint32_t *) (*(uint32_t *) M0_BOOT_STACKADDR);
jumpAddr= (uint32_t *) (*(uint32_t *) M0_BOOT_ENTRYADDR); Chip_CPU_CM0Boot(jumpAddr, stackAddr);
通过上面那几句代码,大概能理解一些,是通过一个mailbox的机制来进行处理器之间的沟通,一个是主处理器,一个是从处理器。然后处理器之间会触发中断来提醒对方。后面还有一些堆栈的操作我就不太清楚了。去看看手册吧。
27章便是mailbox的介绍。 • Provides a means Inter-Processor Communication, allowing multiple CPUs toshare resources and communicate with eachother in a simple manner. • Each CPU can cause up to 32 user defined interrupts to its partner. • EachCPU can claim a shared resource if it is available. •提供了一种处理器间通信,使多CPU共享资源并彼此以简单的方式进行通信。 •每个CPU可导致多达32个用户定义的中断,给其合作伙伴。 •每个CPU可以要求共享资源(如果可用)。 (感谢谷歌翻译)
通过上面的文字,我们大概的了解了一下mailbox是干什么的。
相关的寄存器共有以上几个,主要是两个部分,一个是IRQ,一个是MUTEX。 IRQx是中断寄存器,它上的每一位代表一种情况,可以根据这个寄存器来判断另一个CPU要如何操作。 IRQxSET是置位,IRQxCLR是清位。
MUTEX是一个是否可以控制共享资源的标识寄存器,当读取为1是便取得了控制权,读取为0时需等待另外一个CPU操作完成。操作完成后写任何值后释放控制,该寄存器为1。
由此,两个CPU的协作原理算是清楚了一些了。具体的详细操作,请看例程。
|