AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)

多核处理器的运行模式分为三种:

1、AMP(非对称多进程):多个核心相对独立的运行不同的任务,每个核心可能
运行不同的操作系统或裸机程序,但是有一个主要核心,用来控制整个系统
以及其它从核心的运行。

2、SMP(对称多进程):一个操作系统同等的管理各个内核,例如 PC 机。

3、BMP(受约束多进程):与 SMP 类似,但开发者可以指定将某个任务仅在某个
指定内核上执行。

AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)_第1张图片

#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))

1、(*(volatile_unsigned_long*))的定义解释
​​​​​#define abc (*(volatile unsigned long *)0xE0200280)

开始对于上面的语法不太理解,但通过拆分可以看的更明白:

1)(unsigned long *)变量,代表“变量”是1个unsigned long类型的指针;如:(unsigned long *)i,语句中 i 即为 (unsigned long *)的一个指针;

2)volatile是一个修饰符,告诉编译器此段代码不要优化;因此,(volatile unsigned long *)变量,意思是未优化指针类型的变量;例如:(volatile unsigned long *)i ,语句中 i 即为 (volatile unsigned long *)的一个指针;当使用volatile限定时,表示这个变量是依赖系统实现的,意味着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示它的值会依赖于硬件。
3)(volatile unsigned long *) 0xE0200280,此处把变量换成了固定地址,意思是(volatile unsigned long *)指针指向固定的地址0xE0200280;

4)前面再加一个*,即*(volatile unsigned long *) 0xE0200280 代表 abc是一个变量,我们既可以给固定地址中赋值,也可以从固定地址中取值。例如:(volatile unsigned long *)i ,语句中 i 即为 (volatile unsigned long *)的一个指针,而 *i 即代表 i 中存储的值,我们既可以对其赋值,又可以从其中取值(浮点数在内存里是按2进制存储的)。
————————————————
版权声明:本文为CSDN博主「爱上电路设计」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liht_1634/article/details/124686077

通过ocm(on chip memory)实现两个cpu的交互。

//cpu 0
#include 
#include "platform.h"
#include "xil_printf.h"
#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))
int main()
{
	COMM_VAL=0;
	//Disable cache on OCM
	Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
	while(1){
		print("Hello World cpu0 \n\r");
		COMM_VAL =1;
		while(COMM_VAL == 1){
		}
	}
return 0;
}
//
//cpu1
#include 
#include "platform.h"
#include "xil_printf.h"
#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))
int main()
{
	COMM_VAL=0;
	//Disable cache on OCM
	Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
	while(1){
		print("Hello World cpu0 \n\r");
		COMM_VAL =1;
		while(COMM_VAL == 1){
		}
	}
return 0;
}

实现两个cpu交替打印Hello World cpu0和Hello World cpu1。

AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)_第2张图片

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

启动cpu1,需要两个步骤,第一个把cpu1应用程序地址写到0xfffffff地址中,然后执行SEV指令启动加载CPU1应用层序,加在main函数前。

#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x2000000
void StartCpu1(void)
{
    #if 1
    fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
    dmb(); //waits until write has finished
    fsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");
    sev();
    #endif
}

AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)_第3张图片

将此函数加到AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)_第4张图片

//从SD卡启动,生成BOOT.bin文件

AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)_第5张图片AMP处理器架构+共享地址中断+SD卡启动(2018.2 vivado)_第6张图片

你可能感兴趣的:(zynq,架构,fpga开发,学习,arm,arm开发)