多核处理器的运行模式分为三种:
1、AMP(非对称多进程):多个核心相对独立的运行不同的任务,每个核心可能
运行不同的操作系统或裸机程序,但是有一个主要核心,用来控制整个系统
以及其它从核心的运行。
2、SMP(对称多进程):一个操作系统同等的管理各个内核,例如 PC 机。
3、BMP(受约束多进程):与 SMP 类似,但开发者可以指定将某个任务仅在某个
指定内核上执行。
#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 <stdio.h>
#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 <stdio.h>
#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。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
启动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
}
将此函数加到
//从SD卡启动,生成BOOT.bin文件